クフでダローバルな日記

タフでもグローバルもない

twitterのStreaming APIを使った高速自動フォロー返し with ruby on Heroku

素数時計BOThttps://twitter.com/today_prime_botに、フォローorふぁぼされるとその人をフォローする、という機能を追加しました。

せっかくなのでソースをGitHubに公開してみました。mazamachi/follow_return · GitHub
これを全部ダウンロードして、consumer keyなどを自分の使いたいTwitterアプリのものに変えてHerokuにアップするだけで使えるはずです。

REST APIを用いてフォローとフォロワーの差分をフォローする、という手法に関する記事は多く見つかりましたが、Streaming APIを使ったものはあまり無いようなので詳しく説明してみます。

ちなみに作る際に主に参考にしたサイトは以下です。
HerokuでStreaming APIを使うTwitter Botを作る | monoの開発ブログ
Ruby - tweetstream で Twitter Streaming API を利用! - mk-mode BLOG
↓のサイトがbot作成、公開部分については分かりやすいと思います。
twitter bot作成のプロセス
ただし、コーディングの部分についてが若干古く、下に示すようにTwitter::REST::Client.new とする必要があります。

ちなみに、今回僕はbot部分のファイルを一つしか作っておらず、わざわざ環境変数に設定するまでもないと判断し、.envファイルは作成していません。安全性を考慮すると作ったほうがいいんでしょうが、まぁ正直ちょっと面倒臭いので…

フォロー返し部分

require 'tweetstream'
require 'twitter'
cli = Twitter::REST::Client.new do |config| #REST APIを用いる
  config.consumer_key = '********************'
  config.consumer_secret = '********************'
  config.access_token = '********************'
  config.access_token_secret = '********************'
end
TweetStream.configure do |config| #Streaming APIを用いる
  config.consumer_key = '********************'
  config.consumer_secret = '********************'
  config.oauth_token = '********************'
  config.oauth_token_secret = '********************'
  config.auth_method = :oauth
end

client = TweetStream::Client.new 

client.on_event(:favorite) do |event|
fan = event[:source][:screen_name]
cli.follow(fan)
end
client.on_event(:follow) do |event|
fan = event[:source][:screen_name]
cli.follow(fan)
end
client.userstream

cli = Twitter::REST::...とすることで、REST APIを用いるものを作り、client = TweetStream...とすることでStreaming APIを用いるものを作っています。
区別する理由は、フォローをする機能がREST APIでしか提供されていないみたいだからです。
というのも、REST APIはツイートをしたりフォローしたりといった何かしらのアクションを主に提供しているのに対し、Streaming APIではタイムライン上に流れてきた情報を操作するものだからです。Streaming APIではツイートの他にRT・ふぁぼ・フォロー・ツイート削除などの情報も一緒くたになって流れてくるために、これを利用してフォロー返しすることが出来るのです。

ただし、Streaming APIの中には三種類あるので、自分に関する情報を得たい時には最終行でclient.userstream とする必要があります。

tweetstreamのon_eventメソッドを用いると、自分に対する指定した動作があった時にやりたいことを記述できます。例えばフォローされた時であればclient.on_event[:follow] do |event| ... endとします。

followは最初のREST APIを用いる方のメソッドなので、client ではなくcliを指定してください。

これでフォロー返し機能は完成です。上のコードにはふぁぼられた時にフォローする機能も書いてありますが、適宜消してください。

心残り

フォロー、ふぁぼに対してフォロー返し出来るならリツイートに対してもしたいところなんですが、どうやら自分のツイートがリツイートされた情報はStreaming APIではわからないようなので行き詰まってます。
何かしら情報があれば教えて下さい(o_ _)o