Twitter User Streams APIを「より一層」使ってみる
昨日の続き。
User Streams APIも、基本的には通常のAPIとほぼ同じデータが取得出来ます。そのデータをイベント毎に分岐する方法について@kei_sさんからnotwifeのmessage.rbをポインタとして教えてもらいました。皆さんnotwife使ってますかー超便利っすよーTwitter+Smartphoneな方は是非使うと良いです。
さて、上記の通りmessage.rbを参考にすると、イベント的には以下の分岐になるようです。
User Streams APIも、基本的には通常のAPIとほぼ同じデータが取得出来ます。そのデータをイベント毎に分岐する方法について@kei_sさんからnotwifeのmessage.rbをポインタとして教えてもらいました。皆さんnotwife使ってますかー超便利っすよーTwitter+Smartphoneな方は是非使うと良いです。
さて、上記の通りmessage.rbを参考にすると、イベント的には以下の分岐になるようです。
[text]がある→Tweetなので、GETしてきたJSONデータをParseした結果のHashから上記の値があるかどうかを探せば良い訳ですね。ただし、friendsが何なのかわからなかったのと、block/unblockがうまく取れませんでした。この辺は検討課題だな。
[text]+[retweeted_status]がある→ReTweet
[event]="list_member_added"→Listに追加
[event]="list_member_removed"→リストから除外
[event]="follow"→Followされた
[event]="favorite"→Favされた
[event]="unfavorite"→Fav外された
[event]="list_created"→リスト作った
[event]="list_updated"→リストがアップデートされた
[event]="list_destroyed"→リストが削除された
[event]="block"→ブロックされた
[event]="unblock"→ブロック解除された
[friends]→※なんだこれ。
[delete]がある→Delete
[direct_message]がある→Direct Message
#!/usr/bin/ruby -Ku require 'rubygems' require 'oauth' require 'net/https' require 'json' # 自分のアカウント名 myname = "smokeymonkey" # OAuth 認証データ CONSUMER_KEY = "HOGEHOGE" CONSUMER_SECRET = "HOGEHOGE" ACCESS_TOKEN = "HOGEHOGE" ACCESS_TOKEN_SECRET = "HOGEHOGE" consumer = OAuth::Consumer.new( CONSUMER_KEY, CONSUMER_SECRET, :site => 'http://twitter.com' ) token = OAuth::AccessToken.new( consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET ) # http://dev.twitter.com/pages/user_streams uri = URI.parse('https://userstream.twitter.com/2/user.json') begin # userstreamにはSSLでアクセスする https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true https.verify_mode = OpenSSL::SSL::VERIFY_PEER https.verify_depth = 5 # ルートCA証明書をダウンロードしてきて指定 https.ca_file = './ca.cer' https.start do |https| req = Net::HTTP::Get.new(uri.request_uri) req.oauth!(https, consumer, token) https.request(req) do |res| res.read_body do |chunk| # chunked = falseなら例外を発生 raise 'Response is not chunked' unless res.chunked? # JSONのパースに失敗したらスキップして次へ status = JSON.parse(chunk) rescue next # イベントによる分岐 if status['text'] then if status['retweeted_status'] puts "**RTed @#{status['user']['screen_name']}: #{status['text']}" else puts "@#{status['user']['screen_name']}: #{status['text']}" end elsif status['direct_message'] then puts " ## DM ## @#{status['direct_message']['sender']['screen_name']} sent you!" elsif "#{status['event']}" then case "#{status['event']}" when 'list_member_added' puts " ## Added list->@#{status['source']['screen_name']}:[#{status['target_object']['slug']}]" when 'list_member_removed' puts " ## Removed list->@#{status['source']['screen_name']}:[#{status['target_object']['slug']}]" when 'follow' if "#{status['target']['screen_name']}" == myname then puts " ## Following you by-> " + "@#{status['source']['screen_name']} !" end when 'favorite' puts " ## Fav ## @#{status['source']['screen_name']} faved @#{status['target_object']['user']['screen_name']}: #{status['target_object']['text']}" when 'unfavorite' puts " ## Unfav ## @#{status['source']['screen_name']} unfaved @#{status['target_object']['user']['screen_name']}: #{status['target_object']['text']}" end else next end end end end rescue print "RuntimeError: ", $!, "\n"; end実行した結果はこんな感じ。
## Fav ## @dabesa faved @smokeymonkey: @tuka 当日盛り上げて!より便利になりました。これデュアルディスプレイに最大化して表示させときたい。
## Unfav ## @dabesa unfaved @smokeymonkey: @tuka 当日盛り上げて!
## Following you by-> @dabesa !
## Added list->@dabesa:[hoge]
## Removed list->@dabesa:[hoge]
## DM ## @dabesa sent you!
**RTed @dabesa: RT @dabesa: RTのテストー
@dabesa 喋ってみる!
島田 浩二,設樂 洋爾,村田 賢太,前田 智樹,谷口 文威
翔泳社
売り上げランキング: 94811
翔泳社
売り上げランキング: 94811