読者です 読者をやめる 読者になる 読者になる

IT omoe

ITのこと知らないんですけどIT関連のことを気ままに綴ります

RubyでTwitterのbot化, 自動ふぁぼ, 自動リプ

前回の内容に引き続き,Twitterbotを拡張していきます. 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.txtbotにつぶやかせたいことを書いておきます.こんな感じです.内容は突っ込まないでください. f:id:ottosan84:20160218094906p:plain

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というTwitterAPIを使います.この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の内容はこんな感じ. f:id:ottosan84:20160218150119p:plain

文頭に「さん」がついていたらリプを送ってきたアカウントの名前を最初にくっつける仕様です.

リプの仕方

自動リプの最大のポイント.

client_rest.update('@'+username+' '+repl, {:in_reply_to_status_id => tweet_id})

この部分ですね.最初,ユーザー名をリプの最初につけるだけで終わっていたのですが,これでは新規リプを投げてるだけでした.:in_reply_to_status_idというオプションを使うことでツイートに対するリプを送ることができます.

f:id:ottosan84:20160218154813p:plain

こんな感じ.他にも色々なオプションがあり,これらを使うことで画像をつけてツイートしたり,位置情報をつけたりすることができます.詳しくはこちらのupdateのところを見てみてください.

今後の展開

今後というか,天気予報とか煽り画像を送りつけるコードも書いたので,まあ後々うpしていきたいと思います.今回はこの辺で.