2010年11月 のアーカイブ

TwitterのUser Streams APIを試してみた

2010年11月25日 木曜日

こんばんは。最近、積極的に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