こんばんは。最近、積極的にTwitterのストリーミングAPIを利用している(と思われる)サービスが増えてきましたね。何やらおもしろしそうなので少し触ってみる事に。
Streaming APIとは
The Twitter Streaming API allows high-throughput near-realtime access to various subsets of public and protected Twitter data.
http://dev.twitter.com/pages/streaming_api
- Streaming API
- User Streams
- Site Streams (現在BETA)
ストリーミング系のAPIには3種類あって、それぞれ用途が分かれています。詳しくは上記リンク先を^^ 本当はSite Streamsを使いたいのだけど現在BETA版で申請が必要で、申請したけどなかなかレスがこないこともあり、今回はUser Streamsを試しました。
User Streamsとは
User Streams provides real-time updates of all data needed to update a desktop application display.
http://dev.twitter.com/pages/user_streams
User Streamsは、デスクトップアプリケーションの表示を更新するのに必要なすべてのデータをリアルタイムで提供してくれるAPIです。
すでにEchofonやTweetDeckではこのAPIに対応していて、とくにフォローが多い人はタイムラインが凄い勢いで流れていると思います。また、このAPIに対応することで、リプライの受信やメッセージの受信、ふぁぼられ、もちろんリツイートをリアルタイムに捕えることができます。
以下、サンプルコードです。自分のツイートへのふぁぼりとリツイート、また自分への言及をリアルタイムに表示します。
お試し起動
以下のコマンドで。停止はCtrl+C。
1 | # ruby user_timeline.rb |
お試し実行結果
ソースコード(user_timeline.rb)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # -*- coding: utf-8 -*- require 'rubygems' require 'net/https' require 'oauth' require 'cgi' require 'json' CONSUMER_KEY = "XXXXXXXXXXXXX" CONSUMER_SECRET = "XXXXXXXXXXXXX" ACCESS_TOKEN = "XXXXXXXXXXXXX" ACCESS_TOKEN_SECRET = "XXXXXXXXXXXXX" SCREEN_NAME = "yanaoki" consumer = OAuth::Consumer.new( CONSUMER_KEY, CONSUMER_SECRET, :site => 'http://twitter.com') access_token = OAuth::AccessToken.new( consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) uri = URI.parse('https://userstream.twitter.com/2/user.json') https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true https.ca_file = '/path/to/ca.cert' # path to certificate https.verify_mode = OpenSSL::SSL::VERIFY_PEER https.verify_depth = 5 https.start do |https| request = Net::HTTP::Get.new(uri.request_uri) request.oauth!(https, consumer, access_token) buf = "" https.request(request) do |response| response.read_body do |chunk| buf << chunk while (line = buf[/.+?(\r\n)+/m]) != nil begin buf.sub!(line,"") line.strip! status = JSON.parse(line) # mentions if status["entities"] and status["entities"]["user_mentions"] if status["entities"]["user_mentions"].select{|u| u['screen_name'] == SCREEN_NAME }.size > 0 puts status['text'] puts "mention from #{status['user']['screen_name']}(#{status['user']['id']})" end end # retweets if status['retweeted_status'] and status['retweeted_status']['user']['screen_name'] == SCREEN_NAME puts "#{status['retweeted_status']['text']}" puts "retweeted by #{status['user']['screen_name']}(#{status['user']['id']})" end # favorites if status['event'] == 'favorite' and status['source']['screen_name'] != SCREEN_NAME puts "#{status['target_object']['text']}" puts "favorited by #{status['source']['screen_name']}(#{status['source']['id']})" end rescue # TODO end end end end end |