twitter4jハンズオン 5/1 #twtr_hack
TRANSCRIPT
Twitter4Jハンズオン5/1
Twitter4Jハンズオン• Twitter APIの概要
• プロジェクトの作成• アプリケーションの登録• ツイート• 検索• レートリミット• ログイン
Twitter botのコツ
• Botの種類とAPI
• API
• レートリミット
Twitter APIの種類Twi$er'API
REST'API'
API
Web 'API
:' ':'Java,'Objec8ve9C '
:' ,' ':'Java,'PHP,'Ruby,'.Net,'Objec8ve9C '
:'Web ':'HTML,'JavaScript'
Streamed'Tweets'
'
'
'
'
'
'
'
'
'
'
'
' '
アプリケーション• Twitterにアクセスする単位
• ユーザーとは異なる
• ユーザーはアプリケーションにアクセス権限を委譲する
アプリケーションの登録• https://dev.twitter.com/apps/new より
Application Type : 重要
アクセスタイプ
アクセスタイプ Read, Write, &Access direct messages Read & Write Read only
タイムラインなどの取得 ○ ○ ○ツイート ○ ○ ×
ダイレクトメッセージ送信 ○ ○ ×ダイレクトメッセージ受信・削除 ○ × ×
デフォルト
演習• https://dev.twitter.com/apps/new よりアプリケーションを登録
• http://twitter4j.org/ よりtwitter4j-4.0.2.zip をダウンロード
• twitter4j.propertiesのoauth.consumerKeyとoauth.consumerSecretを設定
• getAccessToken.sh/cmdを実行してアクセストークンを取得
REST API
REST API• プル型
‣ タイムラインの取得
‣ ユーザーのフォロー
‣ ツイート
‣ ダイレクトメッセージの送受信
等々100近くのエンドポイント
REST API• REST: REpresentational State Transfer
• HTTPでAPI呼び出しGET /1.1/statuses/public_timeline.json HTTP/1.1 Host: api.twitter.com
HTTP/1.1 200 OK Date: Tue, 08 Feb 2011 07:52:51 GMT Server: hi Status: 200 OK Content-Type: application/json; charset=utf-8 Vary: Accept-Encoding Connection: close
[{"source": "<a href=\"http://foursquare.com\" rel=\"nofollow\">foursquare<\/a>", "text": "I'm at IKEA 新三郷店 (新三郷ららシティ2-2-2, 三郷市) [pic]: http://4sq.com/eOHZdS", ... "user": { "description": "Javaエンジニア山本裕介。\r\n映画、アーチェリー、Java 好き\r\n#twitter4j
#samurai", "name": "山本 裕介", ...}
}, ...]
リクエスト
レスポンスヘッダ
レスポンスボディ
Twitter のREST API• 全部で100近くのエンドポイント
• 15の「リソース」に分類されている
• リソース毎にパスが異なる(RESTful)
Timelineリソース https://api.twitter.com/1.1/statuses/***.jsonUserリソース https://api.twitter.com/1.1/users/***.jsonDirect messageリソース https://api.twitter.com/1.1/direct_messages/***.json 等
REST APIのテスト
• https://dev.twitter.com/console より
Twitter4Jの概要
• 主要クラス
• TwitterFactory: Twitterオブジェクトのファクトリクラス
• Twitter: 各種APIを呼び出すための
• User / Status : ユーザー、ツイートを表すインターフェース
Twitter4Jの使い方
• twitter4j.properties: 各種キー、設定を記載。classes/以下に配置
• TwitterFactoryよりTwitterインスタンスを取得
• Twitterインスタンスのメソッド呼び出し
演習: Twitter4Jのインスタンス化public static void main(String… args[]) throws TwitterException { Twitter twitter = TwitterFactory.getSingleton(); }
<dependencies> <dependency> <groupId>org.twitter4j</groupId> <artifactId>twitter4j-core</artifactId> <version>[4.0,)</version> </dependency> </dependencies>
必要に応じてmaven依存追加
演習: twitter4j.propertiesの設定
oauth.consumerKey=**** oauth.consumerSecret=**** oauth.accessToken=**** oauth.accessTokenSecret=****
resources/twitter4j.properties
Userオブジェクト• Twitterのユーザーを表す
• 取得できるもの:
• スクリーン名(@yusuke等) : User#getScreenName()
• ユーザーID(API上の識別ID): User#getId()
• プロフィールテキスト: User#getDescription();
• 等
演習: 自分のユーザーオブジェクトを取得
public static void main(String… args[]) throws TwitterException { Twitter twitter = TwitterFactory.getSingleton(); User user = twitter.showUser(“yusuke”); System.out.println(user.getScreenName()); System.out.println(user.getId()); System.out.println(user.getDescription()); }
Statusオブジェクト• ツイートを表す
• 取得できるもの:
• ツイートテキスト : Status#getText()
• ツイートID: Status#getId()
• 埋込メディア: Status#getMediaEntities()
• 等
演習: Statusオブジェクトを取得
public static void main(String… args[]) throws TwitterException { Twitter twitter = TwitterFactory.getSingleton(); Status status = twitter.showStatus(20); System.out.println(status.getText()); System.out.println(status.getUser().getScreenName()); }
ツイート
• updateStatusメソッド
• Twitter#updateStatus(text)
@ツイート
• updateStatusメソッド
• Twitter#updateStatus(“@スクリーン名” + text)
演習: @yusuke宛ての@ツイート
public static void main(String… args[]) throws TwitterException { Twitter twitter = TwitterFactory.getSingleton(); Status status = twitter.updateStatus(“@yusuke Hello!”); System.out.println(status.getText()); System.out.println(status.getUser().getScreenName()); }
ストリーミング API
• プッシュ型
‣ 特定のユーザーのアクティビティをリアルタイムに取得
または
‣ 指定したキーワードにマッチするツイートをリアルタイムに取得
ストリーミング API• ツイート、DMなどを受信し続けられる
• レートリミットがない
• 利用出来る場面ではREST APIより優先的に利用
• 技術
• 普通のHTTP
• レスポンスに終わりがない
• cometでもWebSocketでもない
演習• printSampleStream.sh/cmdを実行
ストリーミングAPIの接続• 十分に帯域のある環境で利用
• 3G接続は推奨されない(モバイルアプリ不可)
• 再接続アルゴリズムを正しく実装
• アグレッシブに再接続すると一時的に使えなくなる
再接続アルゴリズム•最初に接続切れを起こした場合
即座に再接続を試みる。 •TCP/IPレベルのネットワークエラーが発生した場合
250ミリ秒から始め、最大16秒までエラー毎に250ミリ秒足していくなど線形的に待ち時間を増やしていく。
•HTTPエラー(ステータスコードが201以上)が返った場合 10秒から始め、失敗する毎に待ち時間を最大で240秒まで倍ずつ指数関数的に増やしていく。 HTTPエラーは認証情報の間違いやプロキシの不具合などアプリケーションの設定に起因する問題の可能性があるのでユーザーへ通知することも考慮に入れる。
参考: Twitter APIポケットリファレンス P265https://dev.twitter.com/docs/streaming-api/concepts#connecting
ストリーミングAPIの種類• Streamed Tweets
• パブリックタイムラインを取得
• User Stream
• 単一ユーザーのタイムライン、イベントを取得
• Site Stream
• 複数ユーザーのタイムライン、イベントを取得
Streamed Tweets
• sample
• filter
• firehose
• links
• retweet
Streamed Tweets
• sample
• filter
• firehose
• links
• retweet
sample• パブリックなツイートのうち1%を取得
• エンドポイント(GET)
‣ https://stream.twitter.com/1.1/statuses/sample.json
• パラメータ
‣ なし
• レスポンス
‣ statusオブジェクトのjson (REST APIと同じ)
sample• 使いどころ
• ツイート分析
• 言語
• クライアント
• 流行の固有名詞抽出
• 等々
FAQ
• sample.jsonを複数接続すれば・・・・
• 同じツイートが返るので無意味。1%以上はとれない
filter• 指定した条件のツイートを取得
• エンドポイント(POST)
‣ https://stream.twitter.com/1.1/statuses/filter.json
• パラメータ
‣ 色々(次ページ)
• レスポンス
‣ statusオブジェクトのjson (REST APIと同じ)
filterのパラメータ• follow
• 指定したユーザーIDのツイートを取得
• track
• 指定したキーワードを含むツイートを取得
• 1キーワードは60文字まで
• 日本語はトークナイズされない
• 日本語ハッシュタグは指定可能
follow=1235,5678
track=%25twtr_hack,%25twtter4j
filterのパラメータ(続き)• locations
• 区域を指定してツイートを取得locations=138.927,35.500,139.932,35.795
138.927,35.500
139.932,35.795
南西 北東
経度・緯度順なのに注意
FAQ• 日本全体をカバーする区域を指定すれば・・
• ヒットするツイートが多すぎる場合はその旨が通知される
• 大量の区域を指定したい場合は?
• 要相談
• プロテクトアカウントのツイートは?
• 取得できない。User StreamかSite Streamを利用
{"limit":{"track":1234}}
User Stream• 単一ユーザーのタイムライン、イベントを取得
• 目的: デスクトップの通知ツールなど
• タイムラインのツイート、DM、fav / follow等を受信
• プロテクトアカウントのツイートも受信可能
• 要OAuth( or XAuth)
User Stream
• エンドポイント(POST)
‣ https://userstream.twitter.com/1.1/user.json
• レスポンス
‣ statusオブジェクトのjson等
演習• printUserStream.sh/cmdを実行
Site Stream(beta)• 複数ユーザーのタイムライン、イベントを取得
• 目的: Twitter連携するサービスなど
• タイムラインのツイート、DM、fav / follow等を受信
• プロテクトアカウントのツイートも受信可能
• 要OAuth
Site Stream• エンドポイント(POST)
‣ https://sitestream.twitter.com/1.1/site.json
• パラメータ
‣ follow: 受信するユーザーIDをカンマ区切りで指定、100人まで
• レスポンス
‣ statusオブジェクトのjson等
follow=1234,5678,91023,45324....
Site Streamのコネクション管理• 接続時に指定できるユーザーは100人まで
• 事前にOAuth認証しておく必要がある
• コントロールストリームでユーザーの追加、削除可能
• 1コネクションで最大1000人まで受信可能
コントロールストリーム• Site Stream接続時にコントロール用エンドポイントが返る
• RESTでコントロール用エンドポイントを操作
https://dev.twitter.com/docs/streaming-api/control-streams
{"control": { “control_uri":"/1.1/site/c/1_1_54e345d655ee3e8d" }}
https://sitestream.twitter.com/1.1/site/c/1_1_54e345d655ee3e8d”
コントロールストリームのメソッド
• ユーザーの追加 (POST)
• パラメータ
• user_id: カンマ区切りのユーザーID(100人まで)
https://sitestream.twitter.com/1.1/site/c/****/add_user.json”
コントロールストリームのメソッド
• ユーザーの削除(POST)
• パラメータ
• user_id: カンマ区切りのユーザーID(100人まで)
https://sitestream.twitter.com/1.1/site/c/****/remove_user.json”
ベストプラクティス• 可能な限りストリーミング APIを使う
• 参照系はレートリミット回避のためできるかぎりREST APIよりもストリーミング APIを利用
• gzipを使う
• 帯域を節約
• 接続ネットワークを確認
• 3G接続での利用は推奨されない。接続が切られることも
FAQ• ストリーミングAPIはJavaScriptから使える?
• 使えない。サーバサイドの仕組みが必要
• 1%以上のツイートにアクセスしたい
• http://gnip.com/
• firehoseは?
• 一般に提供はされていない