RubyでTwitterのbot化, 自動ふぁぼ, 自動リプ
前回の内容に引き続き,Twitterのbotを拡張していきます. ottosan84.hatenablog.com
とりあえずbot化
前回のはただ単に実行したら1回ツイートするだけのものだったで,自動的につぶやいてくれるbotにしていきます.
色々やり方はあると思いますが今回はsleep関数を活用した方法でやっていきたいと思います.
require "twitter"
#この辺の詳しいことは前回の記事へ--------------------------
client = Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_TOKEN_SECRET"
end
#-----------------------------------------------------
loop do
File.open("tweets.txt", "r") do |bot|
@bots = bot.read.split("\n")
end
tweet = @bots.sample
sleep_time = 60 + rand(3600)
t = Time.now
puts "#{tweet} (#{t}) next (#{t + sleep_time})"
client.update tweet
sleep sleep_time
end
全体のコードはこんな感じです. ちょっと詳しく見て行きませう.
テキストファイルからツイートを決定
File.open("tweets.txt", "r") do |bot|
@bots = bot.read.split("\n")
end
tweet = @bots.sample
この部分ですね.予めtweets.txt
にbotにつぶやかせたいことを書いておきます.こんな感じです.内容は突っ込まないでください.
split
は与えた条件でデータを区切って配列に入れてくれます.sample
でランダムにその中から一つ選びます.
sleep関数で時間をあけてツイート
sleep_time = 60 + rand(3600)
t = Time.now
puts "#{tweet} (#{t}) next (#{t + sleep_time})"
client.update tweet
sleep sleep_time
sleep
は与えた秒数分だけプログラムの実行を停止させてくれます.今回はツイートする感覚もランダムにしたかったのでrand
関数を使って1分〜1時間(60秒〜3600秒)の間隔でツイートするようにしました.
これらを無限ループで繰り返すことでbotの完成です.ファイル処理はloop
の外でも良かったのですが.いちいちプログラムを止めなくてもテキストファイルを編集するだけでbotのツイートパターンを追加・削除できるようにループの中に入れました.
後,同じ内容のツイートを連続してするとツイートが反映されないことがあるのでその点は注意です.できだけたくさんのパターンを作っておきましょう.
自動ふぁぼ(いいね)
個人的にまだ「ふぁぼ」という言い方のほうがしっくり来るのですが,「いいね」に名前が変わった今では自動ふぁぼじゃなくて自動いいねの方が正しいのでしょうか...なんて話は置いといて
とりあえず全体のコード.自分のTL上にある「お嬢」というワードが含まれるツイートをふぁぼ...じゃなくていいねします.
require "twitter"
client_streaming = Twitter::Streaming::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_TOKEN_SECRET"
end
client_rest = Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_TOKEN_SECRET"
end
USERNAME = "ottosan884" #自分のユーザー名(@以下のやつ)
client_streaming.user do |object|
case object
when Twitter::Tweet
if (/お嬢/ =~ object.text) && (object.user.screen_name != USERNAME)
puts object.user.screen_name + ':' + object.text
client_rest.favorite(object.id)
end
end
end
今回,タイムラインを取得するためにStreamingというTwitterのAPIを使います.このAPIは新しいツイートを受信し続けることができます.今まで使っていたRESTと同じように,コンシューマキーとかを渡してやることで使えます.
object.user.screen_name != USERNAME
で自分のツイートは除きます.favorite
にツイートのIDを与えるとそのツイートがいいねされます.ここで簡単に取得できるデータの説明をします.
.text
....ツイートの内容を取得..id
...ツイートのIDを取得..user.name
...ツイートをしたアカウントのアカウント名を取得..user.screen_name
...ツイートをしたアカウントのユーザー名を取得.
このコードで使ってないのもありますが後で使うのでまとめてここに書いておきます.他にも取得できるデータはありますがまあ今回はこのくらいで.以上が自動いいねでした.はい.
自動リプ
USERNAME = "ottosan884_bot"
client_streaming.user do |object|
case object
when Twitter::Tweet
#取得した必要なデータを変数に格納
username = object.user.screen_name
name = object.user.name
tweet = object.text
tweet_id = object.id
if (/@ottosan884_bot/ =~ tweet) && (username != USERNAME) && (!tweet.index("RT")) #自分のツイートとRTは除く
puts username + ':' + tweet
File.open("replies.txt", "r") do |reply|
@rere = reply.read.split("\n")
end
re = @rere.sample
if (re =~ /さん/)
repl = name + re
else
repl = re
end
end
puts ' >' + repl
client_rest.update('@'+username+' '+repl, {:in_reply_to_status_id => tweet_id})
end
end
全体のコードはこんな感じ.APIのとこは省略しました.replies.txt
の内容はこんな感じ.
文頭に「さん」がついていたらリプを送ってきたアカウントの名前を最初にくっつける仕様です.
リプの仕方
自動リプの最大のポイント.
client_rest.update('@'+username+' '+repl, {:in_reply_to_status_id => tweet_id})
この部分ですね.最初,ユーザー名をリプの最初につけるだけで終わっていたのですが,これでは新規リプを投げてるだけでした.:in_reply_to_status_id
というオプションを使うことでツイートに対するリプを送ることができます.
こんな感じ.他にも色々なオプションがあり,これらを使うことで画像をつけてツイートしたり,位置情報をつけたりすることができます.詳しくはこちらのupdateのところを見てみてください.
今後の展開
今後というか,天気予報とか煽り画像を送りつけるコードも書いたので,まあ後々うpしていきたいと思います.今回はこの辺で.