Streaming API



Yusuke Yamamoto
Twi$er'API
  REST'API'                                              '
                            '                '
                    '                                '
                    '                            '
                        '                   '

                                                                 :'               '
        API
                                                                 :'Java,'Objec8ve9C    '


                    API
        Streamed'Tweets'
                                                                                 ,'        '
                                                             Java,'Python,'PHP,'Ruby,'Objec8ve9C       '



 Web                    API
                                '   Web'Intents
                                                                 :'Web       '
                                '   @Anywhere
                                                                 :'HTML,'JavaScript'


  Yusuke Yamamoto                                                                                  2
ストリーミングAPI
• ツイート、DMなどを受信し続けられる
• レートリミットがない
 •   利用出来る場面ではREST APIより優先的に利用

• 技術
 •   普通のHTTP

 •   レスポンスに終わりがない

 •   cometでもWebSocketでもない


          Copyright(c) Yusuke Yamamoto All rights reserved.
デモ
$ wget --output-document=- --user=*** --password=*** https://
stream.twitter.com/1/statuses/sample.json




                    Copyright(c) Yusuke Yamamoto All rights reserved.
ストリーミングAPIの接続
• 十分に帯域のある環境で利用
 •   3G接続は推奨されない(モバイルアプリ不可)



• 再接続アルゴリズムを正しく実装
 •   アグレッシブに再接続すると一時的に使えなく
     なる




         Copyright(c) Yusuke Yamamoto All rights reserved.
再接続アルゴリズム
   1.   最初に接続切れを起こした場合

        •   即座に再接続を試みる。

   2.   TCP/IPレベルのネットワークエラーが発生した場合

        •   250ミリ秒から始め、最大16秒までエラー毎に250ミリ秒足してい
            くなど線形的に待ち時間を増やしていく。

   3.   HTTPエラー(ステータスコードが201以上)が返った場合

        •   10秒から始め、失敗する毎に待ち時間を最大で240秒まで倍ずつ指
            数関数的に増やしていく。

        •   HTTPエラーは認証情報の間違いやプロキシの不具合などアプリ
            ケーションの設定に起因する問題の可能性があるのでユーザーへ
            通知することも考慮に入れる。

参考: Twitter APIポケットリファレンス P265
https://dev.twitter.com/docs/streaming-api/concepts#connecting
                       Copyright(c) Yusuke Yamamoto All rights reserved.
ストリーミングAPIの種類
• Streamed Tweets
 •   パブリックタイムラインを取得

• User Stream
 •   単一ユーザーのタイムライン、イベントを取得

• Site Stream
 •   複数ユーザーのタイムライン、イベントを取得




          Copyright(c) Yusuke Yamamoto All rights reserved.
Streamed Tweets
• sample
• filter
• firehose
• links
• retweet



            Copyright(c) Yusuke Yamamoto All rights reserved.
Streamed Tweets
• sample
• filter
• firehose
• links
• retweet



            Copyright(c) Yusuke Yamamoto All rights reserved.
sample
• パブリックなツイートのうち1%を取得
• エンドポイント(GET)
‣   https://stream.twitter.com/1/statuses/sample.json

• パラメータ
‣   なし

• レスポンス
‣   statusオブジェクトのjson (REST APIと同じ)


                 Copyright(c) Yusuke Yamamoto All rights reserved.
sample
• 使いどころ
•   ツイート分析

    ‣ 言語
    ‣ クライアント
    ‣ 流行の固有名詞抽出
     •   等々




           Copyright(c) Yusuke Yamamoto All rights reserved.
FAQ
• sample.jsonを複数接続すれば・・・・
 •   同じツイートが返るので無意味。1%以上はとれない




          Copyright(c) Yusuke Yamamoto All rights reserved.
filter
• 指定した条件のツイートを取得
• エンドポイント(POST)
‣   https://stream.twitter.com/1/statuses/filter.json

• パラメータ
‣   色々(次ページ)

• レスポンス
‣   statusオブジェクトのjson (REST APIと同じ)


                 Copyright(c) Yusuke Yamamoto All rights reserved.
filterのパラメータ
• follow
 •   指定したユーザーIDのツイートを取得
                     follow=1235,5678


• track
 •   指定したキーワードを含むツイートを取得

 •   1キーワードは60文字まで

 •   日本語はトークナイズされない

     ‣ 日本語ハッシュタグは指定可能
           track=%25twtr_hack,%25twtter4j



             Copyright(c) Yusuke Yamamoto All rights reserved.
filterのパラメータ(続き)
       • locations
         •   区域を指定してツイートを取得
             locations=138.927,35.500,139.932,35.795


                                  南西                            北東

                                              139.932,35.795


                                                            経度・緯度順なのに注意




138.927,35.500


                     Copyright(c) Yusuke Yamamoto All rights reserved.
FAQ
• 日本全体をカバーする区域を指定すれば・・
•   ヒットするツイートが多すぎる場合はその旨が通知される
       {"limit":{"track":1234}}


• 大量の区域を指定したい場合は?
•   要相談

• プロテクトアカウントのツイートは?
•   取得できない。User StreamかSite Streamを利用


                Copyright(c) Yusuke Yamamoto All rights reserved.
User Stream
• 単一ユーザーのタイムライン、イベントを取得

• 目的: デスクトップの通知ツールなど
•   タイムラインのツイート、DM、fav / follow等を受信

•   プロテクトアカウントのツイートも受信可能

•   要OAuth( or XAuth)




             Copyright(c) Yusuke Yamamoto All rights reserved.
User Stream
• エンドポイント(POST)
‣   https://userstream.twitter.com/2/user.json

• レスポンス
‣   statusオブジェクトのjson等




                 Copyright(c) Yusuke Yamamoto All rights reserved.
Site Stream(beta)
• 複数ユーザーのタイムライン、イベントを取得

• 目的: Twitter連携するサービスなど
 •   タイムラインのツイート、DM、fav / follow等を受信

 •   プロテクトアカウントのツイートも受信可能

 •   要OAuth




              Copyright(c) Yusuke Yamamoto All rights reserved.
Site Stream
• エンドポイント(POST)
‣   https://sitestream.twitter.com/2b/site.json

• パラメータ
‣   follow: 受信するユーザーIDをカンマ区切りで指定、100人まで

                follow=1234,5678,91023,45324....




• レスポンス
‣   statusオブジェクトのjson等

                       Copyright(c) Yusuke Yamamoto All rights reserved.
Site Streamのコネクション管理
• 接続時に指定できるユーザーは100人まで
 •   事前にOAuth認証しておく必要がある



• コントロールストリームでユーザーの追
 加、削除可能

 •   1コネクションで最大1000人まで受信可能




         Copyright(c) Yusuke Yamamoto All rights reserved.
コントロールストリーム
   • Site Stream接続時にコントロール用エンドポ
      イントが返る
        {"control": {
           "control_uri":"/2b/site/c/1_1_54e345d655ee3e8d"
        }}


   • RESTでコントロール用エンドポイントを操作
  https://sitestream.twitter.com/2b/site/c/1_1_54e345d655ee3e8d"


https://dev.twitter.com/docs/streaming-api/control-streams

                    Copyright(c) Yusuke Yamamoto All rights reserved.
コントロールストリームのメソッド

• ユーザーの追加 (POST)
https://sitestream.twitter.com/2b/site/c/****/add_user.json"


  •   パラメータ

      ‣ user_id: カンマ区切りのユーザーID(100人まで)




                  Copyright(c) Yusuke Yamamoto All rights reserved.
コントロールストリームのメソッド

 • ユーザーの削除(POST)
https://sitestream.twitter.com/2b/site/c/****/remove_user.json"


   •   パラメータ

       ‣ user_id: カンマ区切りのユーザーID(100人まで)




                  Copyright(c) Yusuke Yamamoto All rights reserved.
ベストプラクティス
• とにかく使う
 •   参照系はレートリミット回避のためできるかぎりREST
     APIよりもStreaming APIを利用

• gzipを使う
 •   帯域を節約

• 接続ネットワークを確認
 •   3G接続での利用は推奨されない。接続が切られることも



             Copyright(c) Yusuke Yamamoto All rights reserved.
FAQ
• ストリーミングAPIはJavaScriptから使える?
 •   使えない。サーバサイドの仕組みが必要

• 1%以上のツイートにアクセスしたい
 •   http://gnip.com/

• firehoseは?
 •   一般に提供はされていない




                  Copyright(c) Yusuke Yamamoto All rights reserved.
Twitter API ポケットリファレンス
• 好評発売中!




           http://amzn.to/twtr-ref
 Yusuke Yamamoto                     27

第3回Twitter API勉強会 - ストリーミングAPI #twtr_hack