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 タブで設定変更してください。
スクリプト作成
冒頭の 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時間)が掛かってしまうでしょう。