51
Twitter4Jハンズオン 5/1

Twitter4jハンズオン 5/1 #twtr_hack

Embed Size (px)

Citation preview

Page 1: Twitter4jハンズオン 5/1 #twtr_hack

Twitter4Jハンズオン5/1

Page 2: Twitter4jハンズオン 5/1 #twtr_hack

Twitter4Jハンズオン• Twitter APIの概要

• プロジェクトの作成• アプリケーションの登録• ツイート• 検索• レートリミット• ログイン

Page 3: Twitter4jハンズオン 5/1 #twtr_hack

Twitter botのコツ

• Botの種類とAPI

• API

• レートリミット

Page 4: Twitter4jハンズオン 5/1 #twtr_hack

Twitter APIの種類Twi$er'API

REST'API'

API

Web 'API

:' ':'Java,'Objec8ve9C '

:' ,' ':'Java,'PHP,'Ruby,'.Net,'Objec8ve9C '

:'Web ':'HTML,'JavaScript'

Streamed'Tweets'

'

'

'

'

'

'

'

'

'

'

'

' '

Page 5: Twitter4jハンズオン 5/1 #twtr_hack

アプリケーション• Twitterにアクセスする単位

• ユーザーとは異なる

• ユーザーはアプリケーションにアクセス権限を委譲する

Page 6: Twitter4jハンズオン 5/1 #twtr_hack

アプリケーションの登録• https://dev.twitter.com/apps/new より

Page 7: Twitter4jハンズオン 5/1 #twtr_hack

Application Type : 重要

Page 8: Twitter4jハンズオン 5/1 #twtr_hack

アクセスタイプ

アクセスタイプ Read, Write, &Access direct messages Read & Write Read only

タイムラインなどの取得 ○ ○ ○ツイート ○ ○ ×

ダイレクトメッセージ送信 ○ ○ ×ダイレクトメッセージ受信・削除 ○ × ×

デフォルト

Page 9: Twitter4jハンズオン 5/1 #twtr_hack

演習• https://dev.twitter.com/apps/new よりアプリケーションを登録

• http://twitter4j.org/ よりtwitter4j-4.0.2.zip をダウンロード

• twitter4j.propertiesのoauth.consumerKeyとoauth.consumerSecretを設定

• getAccessToken.sh/cmdを実行してアクセストークンを取得

Page 10: Twitter4jハンズオン 5/1 #twtr_hack

REST API

Page 11: Twitter4jハンズオン 5/1 #twtr_hack

REST API• プル型

‣ タイムラインの取得

‣ ユーザーのフォロー

‣ ツイート

‣ ダイレクトメッセージの送受信

等々100近くのエンドポイント

Page 12: Twitter4jハンズオン 5/1 #twtr_hack

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": "山本 裕介", ...}

}, ...]

リクエスト

レスポンスヘッダ

レスポンスボディ

Page 13: Twitter4jハンズオン 5/1 #twtr_hack

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 等

Page 14: Twitter4jハンズオン 5/1 #twtr_hack

REST APIのテスト

• https://dev.twitter.com/console より

Page 15: Twitter4jハンズオン 5/1 #twtr_hack

Twitter4Jの概要

• 主要クラス

• TwitterFactory: Twitterオブジェクトのファクトリクラス

• Twitter: 各種APIを呼び出すための

• User / Status : ユーザー、ツイートを表すインターフェース

Page 16: Twitter4jハンズオン 5/1 #twtr_hack

Twitter4Jの使い方

• twitter4j.properties: 各種キー、設定を記載。classes/以下に配置

• TwitterFactoryよりTwitterインスタンスを取得

• Twitterインスタンスのメソッド呼び出し

Page 17: Twitter4jハンズオン 5/1 #twtr_hack

演習: 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依存追加

Page 18: Twitter4jハンズオン 5/1 #twtr_hack

演習: twitter4j.propertiesの設定

oauth.consumerKey=**** oauth.consumerSecret=**** oauth.accessToken=**** oauth.accessTokenSecret=****

resources/twitter4j.properties

Page 19: Twitter4jハンズオン 5/1 #twtr_hack

Userオブジェクト• Twitterのユーザーを表す

• 取得できるもの:

• スクリーン名(@yusuke等) : User#getScreenName()

• ユーザーID(API上の識別ID): User#getId()

• プロフィールテキスト: User#getDescription();

• 等

Page 20: Twitter4jハンズオン 5/1 #twtr_hack

演習: 自分のユーザーオブジェクトを取得

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()); }

Page 21: Twitter4jハンズオン 5/1 #twtr_hack

Statusオブジェクト• ツイートを表す

• 取得できるもの:

• ツイートテキスト : Status#getText()

• ツイートID: Status#getId()

• 埋込メディア: Status#getMediaEntities()

• 等

Page 22: Twitter4jハンズオン 5/1 #twtr_hack

演習: 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()); }

Page 23: Twitter4jハンズオン 5/1 #twtr_hack

ツイート

• updateStatusメソッド

• Twitter#updateStatus(text)

Page 24: Twitter4jハンズオン 5/1 #twtr_hack

@ツイート

• updateStatusメソッド

• Twitter#updateStatus(“@スクリーン名” + text)

Page 25: Twitter4jハンズオン 5/1 #twtr_hack

演習: @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()); }

Page 26: Twitter4jハンズオン 5/1 #twtr_hack

ストリーミング API

• プッシュ型

‣ 特定のユーザーのアクティビティをリアルタイムに取得

または

‣ 指定したキーワードにマッチするツイートをリアルタイムに取得

Page 27: Twitter4jハンズオン 5/1 #twtr_hack

ストリーミング API• ツイート、DMなどを受信し続けられる

• レートリミットがない

• 利用出来る場面ではREST APIより優先的に利用

• 技術

• 普通のHTTP

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

• cometでもWebSocketでもない

Page 28: Twitter4jハンズオン 5/1 #twtr_hack

演習• printSampleStream.sh/cmdを実行

Page 29: Twitter4jハンズオン 5/1 #twtr_hack

ストリーミングAPIの接続• 十分に帯域のある環境で利用

• 3G接続は推奨されない(モバイルアプリ不可)

• 再接続アルゴリズムを正しく実装

• アグレッシブに再接続すると一時的に使えなくなる

Page 30: Twitter4jハンズオン 5/1 #twtr_hack

再接続アルゴリズム•最初に接続切れを起こした場合

即座に再接続を試みる。 •TCP/IPレベルのネットワークエラーが発生した場合

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

•HTTPエラー(ステータスコードが201以上)が返った場合 10秒から始め、失敗する毎に待ち時間を最大で240秒まで倍ずつ指数関数的に増やしていく。 HTTPエラーは認証情報の間違いやプロキシの不具合などアプリケーションの設定に起因する問題の可能性があるのでユーザーへ通知することも考慮に入れる。

参考: Twitter APIポケットリファレンス P265https://dev.twitter.com/docs/streaming-api/concepts#connecting

Page 31: Twitter4jハンズオン 5/1 #twtr_hack

ストリーミングAPIの種類• Streamed Tweets

• パブリックタイムラインを取得

• User Stream

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

• Site Stream

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

Page 32: Twitter4jハンズオン 5/1 #twtr_hack

Streamed Tweets

• sample

• filter

• firehose

• links

• retweet

Page 33: Twitter4jハンズオン 5/1 #twtr_hack

Streamed Tweets

• sample

• filter

• firehose

• links

• retweet

Page 34: Twitter4jハンズオン 5/1 #twtr_hack

sample• パブリックなツイートのうち1%を取得

• エンドポイント(GET)

‣ https://stream.twitter.com/1.1/statuses/sample.json

• パラメータ

‣ なし

• レスポンス

‣ statusオブジェクトのjson (REST APIと同じ)

Page 35: Twitter4jハンズオン 5/1 #twtr_hack

sample• 使いどころ

• ツイート分析

• 言語

• クライアント

• 流行の固有名詞抽出

• 等々

Page 36: Twitter4jハンズオン 5/1 #twtr_hack

FAQ

• sample.jsonを複数接続すれば・・・・

• 同じツイートが返るので無意味。1%以上はとれない

Page 37: Twitter4jハンズオン 5/1 #twtr_hack

filter• 指定した条件のツイートを取得

• エンドポイント(POST)

‣ https://stream.twitter.com/1.1/statuses/filter.json

• パラメータ

‣ 色々(次ページ)

• レスポンス

‣ statusオブジェクトのjson (REST APIと同じ)

Page 38: Twitter4jハンズオン 5/1 #twtr_hack

filterのパラメータ• follow

• 指定したユーザーIDのツイートを取得

• track

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

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

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

• 日本語ハッシュタグは指定可能

follow=1235,5678

track=%25twtr_hack,%25twtter4j

Page 39: Twitter4jハンズオン 5/1 #twtr_hack

filterのパラメータ(続き)• locations

• 区域を指定してツイートを取得locations=138.927,35.500,139.932,35.795

138.927,35.500

139.932,35.795

南西 北東

経度・緯度順なのに注意

Page 40: Twitter4jハンズオン 5/1 #twtr_hack

FAQ• 日本全体をカバーする区域を指定すれば・・

• ヒットするツイートが多すぎる場合はその旨が通知される

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

• 要相談

• プロテクトアカウントのツイートは?

• 取得できない。User StreamかSite Streamを利用

{"limit":{"track":1234}}

Page 41: Twitter4jハンズオン 5/1 #twtr_hack

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

• 目的: デスクトップの通知ツールなど

• タイムラインのツイート、DM、fav / follow等を受信

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

• 要OAuth( or XAuth)

Page 42: Twitter4jハンズオン 5/1 #twtr_hack

User Stream

• エンドポイント(POST)

‣ https://userstream.twitter.com/1.1/user.json

• レスポンス

‣ statusオブジェクトのjson等

Page 43: Twitter4jハンズオン 5/1 #twtr_hack

演習• printUserStream.sh/cmdを実行

Page 44: Twitter4jハンズオン 5/1 #twtr_hack

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

• 目的: Twitter連携するサービスなど

• タイムラインのツイート、DM、fav / follow等を受信

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

• 要OAuth

Page 45: Twitter4jハンズオン 5/1 #twtr_hack

Site Stream• エンドポイント(POST)

‣ https://sitestream.twitter.com/1.1/site.json

• パラメータ

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

• レスポンス

‣ statusオブジェクトのjson等

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

Page 46: Twitter4jハンズオン 5/1 #twtr_hack

Site Streamのコネクション管理• 接続時に指定できるユーザーは100人まで

• 事前にOAuth認証しておく必要がある

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

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

Page 47: Twitter4jハンズオン 5/1 #twtr_hack

コントロールストリーム• 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”

Page 48: Twitter4jハンズオン 5/1 #twtr_hack

コントロールストリームのメソッド

• ユーザーの追加 (POST)

• パラメータ

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

https://sitestream.twitter.com/1.1/site/c/****/add_user.json”

Page 49: Twitter4jハンズオン 5/1 #twtr_hack

コントロールストリームのメソッド

• ユーザーの削除(POST)

• パラメータ

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

https://sitestream.twitter.com/1.1/site/c/****/remove_user.json”

Page 50: Twitter4jハンズオン 5/1 #twtr_hack

ベストプラクティス• 可能な限りストリーミング APIを使う

• 参照系はレートリミット回避のためできるかぎりREST APIよりもストリーミング APIを利用

• gzipを使う

• 帯域を節約

• 接続ネットワークを確認

• 3G接続での利用は推奨されない。接続が切られることも

Page 51: Twitter4jハンズオン 5/1 #twtr_hack

FAQ• ストリーミングAPIはJavaScriptから使える?

• 使えない。サーバサイドの仕組みが必要

• 1%以上のツイートにアクセスしたい

• http://gnip.com/

• firehoseは?

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