ツイートを検索してRTするスクリプトの一例

Twitterアプリケーションを設定・作成し、続いてスクリプトの設定をしていきます。
今日は
ドローンが首相官邸の屋上に落下 セシウムを検出【UPDATE】
のネタが大きかったので、「ドローン」または「drone」を検索することにします。

Twitter アプリケーションの設定

Twitter Application ManagementでCreate new App

RT させる Twitter アカウントでログインし、
Twitter Application Management
に移動して[Create new App]ボタンを押します。

Create an application画面に設定入力

アプリケーション名、アプリケーションの簡単な説明、Web サイトの URL を入力します。 URL は bot の説明サイトがあればその URLが最も良いと思います。存在する URL であれば何でも良いですが、例えば Twitter アカウントのURL(私の場合、本アカウントの URL https://twitter.com/riocampos )などが好ましいと思います。

規約を読んで了承

スクロールダウンして規約を表示し、"Yes, I agree" をチェックして、[Create your Twitter application]ボタンを押します。

Twitterアプリケーションが出来ました

Keys and Access Tokens タブへ移動

Application Settings が表示されます。Consumer Key 及び Consumer Secret がスクリプト設定に必要になりますのでコピペしておいてください。ここで Access Level が標準の "Read and write" であることを確認します。もしも他の設定になっている場合には Permissions タブで設定変更してください。

Access Token作成

Keys and Access Tokens タブでスクロールダウンして Your Access Token の Token Actions で [Create my access token]ボタンを押して Access Token を作成します。

Access Token作成完了

"Your application access token has been successfully generated."と出れば大丈夫です。

スクロールダウンして確認

Access Token 及び Access Token Secret が必要になりますのでコピペしておいてください。

スクリプト作成

冒頭の Twitter::SearchResults クラスのモンキーパッチに関しては Twitter gemの検索結果インスタンスとその内部を解説(ついでに since_id モンキーパッチも) - 別館 子子子子子子(ねこのここねこ) に書いています。

内容に関してはスクリプト中のコメントで分かると思います。

require 'twitter'

module Twitter
  class SearchResults
    def next_page
      return nil unless next_page?
      hash = query_string_to_hash(@attrs[:search_metadata][:next_results])
      since_id = @attrs[:search_metadata][:since_id]
      hash[:since_id] = since_id unless since_id.zero?
      hash
    end
  end
end

client = Twitter::REST::Client.new(
  consumer_key:        'YOUR_CONSUMER_KEY',
  consumer_secret:     'YOUR_CONSUMER_SECRET',
  access_token:        'YOUR_ACCESS_TOKEN',
  access_token_secret: 'YOUR_ACCESS_SECRET',
)

query = "ドローン OR drone"
since_id = nil
loop do
  result_tweets = client.search(query, count: 100, result_type: "recent",  exclude: "retweets", since_id: since_id)
  fetch_size = since_id ? 1000 : 100 # since_id が設定されていれば取得数を増やしてもAPI規制を受けない
  since_id = result_tweets.first.id if result_tweets.first
  result_tweets_all = result_tweets.take(fetch_size)
  result_tweets_all.reverse.each_with_index do |tw, i|
    puts "#{'%2d' % i}: @#{tw.user.screen_name}: #{tw.full_text} (#{tw.created_at.strftime('%F %T')})" # デバッグ出力
    next unless rand(100).zero? # 全てだと多いので 1/100 の確率に減らす
    client.retweet(tw.id) # RT
    puts " ↑ RTed"
  end
  puts "= " * 35
  sleep 10
end

さて、10秒毎にツイート検索を行っていますが、検索で見つかった全ツイートを RT すると多すぎるので、乱数で1/100だけRTする設定にしています。とはいえ puts でデバッグ出力しているので、検索で見つかったツイートは全て確認出来ます。乱数で抑えなくても、ツイート本文を確認して「官邸」と書いてあるツイートをRTしない、とか何らかの処理で減らせばよいでしょう。いずれにせよ、減らしておかないとすぐにツイート数規制(だいたい300ツイート/3時間)が掛かってしまうでしょう。