twitter api
DESCRIPTION
This presentation is written for the 1st Twitter Workshop in Japan. History of Twitter API, Bad knowhows, ... #twitterconfTRANSCRIPT
Twitter の API辻村 浩
(@tsupo)
Agenda• 自己紹介• イントロダクション
– Twitter の API のうち、基本的なものについて、ざっとおさらい– Twitter 以外のマイクロブログの API はどうなっているか
• Twitter API 四方山話– 「API 制限」にまつわる話– Twitter のバッドノウハウあれこれ– OAuth をめぐる水面下の戦い
• 最近になって追加された API – search API – streaming API – lists関連API – retweet関連API – 既存の API の Geotagging 拡張
• まとめ– Twitter API の今後– 行き当たりばったり指向プログラミング
自己紹介
•仕事ではプログラム書いたり、他人のプログラムの添削したり。所属部署では社内人力検索的なこともやってます。
• 2003年の春ごろ、RSS というものを知り、RSS → blog → XML-RPC API → WebサービスのAPI一般 という感じで興味の対象が移っていき、Twitter の API にも興味を持ちました。
Twitter 関連のアウトプット(1/4)
•「Twitter API 仕様書」日本語訳– http://watcher.moe-nifty.com/memo/docs/twitterAPI.txt
–2009年12月3日現在、第41版が最新版
–実際に API を使ってみて、仕様書の記述と違っているところがあれば、追記しています
–Github で版数管理しています• http://github.com/tsupo/Twitter-API-Specification--written-in-Japanese-
•直したいところがあったら、勝手に fork して、直して、pull request してください
Twitter 関連のアウトプット(2/4)
• 「Twitter!-Twitter API ガイドブック」 (九天社、2007年)
–世界初の Twitter本
–残念ながら、出版社がなくなってしまったので、現在は入手困難
–最近の Twitter API 情報を反映した改訂版を出したい
–協力していただける出版社を募集中。よろしくお願いします
Twitter 関連のアウトプット(3/4)
• Twitterクライアント Chirrup– http://watcher.moe-nifty.com/memo/2007/04/chirrup.html
– Windows 用– Twitter 以外に、Jaiku, Timelog, Wassr, haru.fm, もごもご, はてなハイク に対応
– Flickr, tumblr, はてなFotolife,Gyazo との連携機能
– 2009年12月5日時点の最新版• 2.11 現行バージョン• 2.99i 次期バージョンのプレビュー
(3.0 preview-10)
– ダウンロードは以下のページから• http://sites.google.com/site/tsujimura543/chirrup/archives
• http://github.com/tsupo/Chirrup/downloads
Twitter 関連のアウトプット(4/4)
• ソーシャルブックマーク管理ツール bookey– http://watcher.moe-nifty.com/memo/2005/10/bookey.html
– Twitter へのブックマーク投稿にも対応
• Webブラウザ tumblen– http://tumblen3.codeplex.com/
– Greasemonkey 相当の機能が最初から組み込まれたブラウザ
– IE コンポーネントを使用しつつ、JavaScript の実行の一部を自前で処理
– Twitter, Jaiku, Timelog, Wassr, tumblr, LogPi, はてなハイク, もごもご, 等 14のサイトに投稿可能
– bookey 相当の機能も内蔵 (投稿機能のみ)
イントロダクション
• Twitter の API のうち、基本的なものについて、ざっとおさらい
• Twitter 以外のマイクロブログの API はどうなっているか
Twitter API の基本
• とりあえず、これだけ知っていれば、クライアントが作れる
–タイムラインの取得
• friends_timeline
•mention
–発言(つぶやき、ツイートの投稿)
• update
タイムラインの取得
• friends_timeline
• public_timeline
• user_timeline
• mention
– 自分への「言及」を取得
• reply
– 自分への「返信」を取得
• home_timeline (新しいAPI)
– friends_timeline の内容 + 公式RT を取得
• Get list statuses
– list に登録した人たちのタイムライン取得
発言の投稿
• update–尐し前までは、160文字まで投稿できた
–今は、140文字を1文字でも越えると投稿できない
–2007年の6月頃までは、発言の末尾に半角スペースをつけて投稿しないと、投稿できなかった
–全く同一内容の発言を連続投稿しようとすると、最初の1個のみ投稿成功。残りは反映されない•@kefir が「いいえ、ケフィアです。」を連続投稿できているのはなぜ?→ 行末にランダムな個数の全角スペースをつけてるから
–隠し引数 source (BASIC認証使用時のみ)
Twitter 類似サービスのAPI(1/2)
• Twitter 互換 API
– Identi.ca
• Twitterクローン (StatusNet という名前でオープンソース化されている。以前、Laconica と呼ばれていたもの)
• ほぼ全ての Twitter API を再現している
– Wassr, はてなハイク• Twitter の API に独自拡張を加えたもの
• 発言の投稿、タイムラインの取得など、一部のAPIのみサポート
• クローズドベータテスト中の「はてなハイク2」はAPI未実装
– Timelog, haru.fm, もごもご• リクエストは Twitter 互換で、レスポンスが独自形式
Twitter 類似サービスのAPI(2/2)
• 独自 API– Jaiku (Googleによる買収前、買収後、Oauth対応後の3つの時期でAPIが異なるが、以前の API もほぼそのまま使えるようになっている)
– Pownce (Six Apart の Motion のベース)• 初期は、API は非公開
• Adobe AIR を使って作成された公式クライアントのみ存在– どんなAPIを使っているのか、パケットを観測してみたら……
– それは確かに API として公開できないよね
• やがて、BASIC認証とFlickr風の認証の2種類のAPIが登場– Twitter の API と比べるとかなり複雑
– クライアントを作ろうとしていたら、Six Apart に買収され、サービス終了
• Motion になってから API がどうなっているかは未調査
Twitter API 四方山話
• 「API 制限」にまつわる話
• Twitter のバッドノウハウあれこれ
• OAuth をめぐる水面下の戦い
API 制限の登場• まず、GET系のAPIに制限を導入
– 最初は、70回/1時間 (2008年5月下旬)– サーバに余裕が出てきたのか、やがて100回/1時間に– 現在は、150回/1時間 (2009年7月2日~)
• 今では、POST系のAPIにも制限– POST系(発言の投稿、ダイレクトメッセージの送信)に関しては、各々1000回/日
– この制限はAPIだけではなく、Web や mobile web からの投稿、送信も対象になる
– following にも 2000件/日 という制限
• 同一IPアドレスからのAPI実行回数制限もある– DoS攻撃の可能性ありと判定された時点で、そのIPアドレスからのリクエストを受け付けなくなる
バッドノウハウ
• API 制限を回避するため、POSTメソッドを使ってタイムラインを取得するという荒業
–まず、P3 がこの技を採用。他のクライアントにも追随するもの出現
–現在はこの技は使えない
• 160文字以上の発言を投稿する技というのもあったが、今は封じられてしまった
•同一内容の発言を連続投稿する技
–@kefir が使ってる
ホワイトリスト
•大量に API を使うアプリケーションは、申請して認められれば、API をほぼ無制限に使えるようになる
–ホワイトリストに登録してもらう
–1口辺り、2万API/日が使える
• タイムラインの取得だけであれば、streaming API を使うという手もある
•逆に、ブラックリストに登録されると、制限されまくりとの噂
日時の表現のゆれ
• Twitter で使っているライブラリ関数が複数系統ある (Ruby 標準のと、Rails で用意されているもの、Twitter 独自のもの、……)
– ライブラリ関数によって微妙に仕様が違う
– 使用するライブラリ関数の切替のたびに変わる
– 現在は Fri Aug 21 08:37:16 +0000 2009 のような形式で落ち着いている (が、油断はできない)
• Jaiku でもフォーマットに混乱
– 2009-12-03T06:37:53Z (従来)
– 2009-12-03T06-37-53Z (現在)
from アプリケーション名
• 最初は、Alex にメールでお願いして対応してもらう方式
• Web 上に用意された form から申請
• 現在は、OAuth で使用するキー (consumer key) を取得する form から申請
– OAuth 未対応のアプリでもこの申請方法を使う
– BASIC 認証使用時は、update の source 引数で指定した文字列が使用される
– OAuth 使用時は、申請した文字列が使用される(source 引数は無視される)
OAuth をめぐる水面下の戦い
• 2009年2月、現行バージョンの OAuth がクローズドからオープン状態へ
• 2009年3月、OAuth のキーを取得するまつりが勃発
• 2009年4月1日の前後数日間、おかしな現象が発生
– 「from アプリケーション名」のアプリケーション名が自分の申請したものとは違うものになる
–なぜか「from 中の人」に化ける人、多数
OAuth
• 2007年11月に最初の版– Webアプリケーションにしか対応していなかった
• 2009年2月に公開された現行バージョン– デスクトップアプリケーションにも対応
– Flickr の認証方法に似ている
– セッション固定脆弱性が発見され、改訂版が登場
• Twitter としては、現行バージョンの公開後1年で、正式版にしたいらしい (いわゆる Twitter API version 2)
• 半年後(2009年8月)以降にリリースするアプリケーションは OAuth に対応してね (義務じゃないけど)
OAuthライブラリの問題(1/2)
• OAuth は引数の名前の辞書順で引数を並べる必要がある– 以下のような仕様のライブラリだと、問題がある
• ライブラリに実行したい API の URL を渡す– ライブラリに渡たる前の引数はソートされているとは限らない– ライブラリに渡たる前の引数はすでにパーセントエンコードされている
• いったんデコードしてから並べ替え。そして再エンコード• 元のエンコードが再現できない場合がある
–デコード後の引数に含まれる空白文字は、デコード前は %20 だったのか、+ だったのか
–投稿内容が文字化けする• Twitter側のsignatureと一致しなくなることがある
– API の実行失敗– Google Code で紹介されているC#用のライブラリに、この問題があることを確認
OAuthライブラリの問題(2/2)
• OAuth のURLエンコード(パーセントエンコード)独自ルール
–16進数部分に出現する英字は case sensitive
•大文字でなければいけないところ、小文字でなければいけないところがある
–パーセントエンコードしてはいけない文字がある
•関連記事– http://watcher.moe-nifty.com/memo/2009/04/c-oauth-c097.html
– http://watcher.moe-nifty.com/memo/2009/03/oauth-7aaa.html
Jaiku の OAuth
• OAuth のキーを取得するときに、ユーザID(スクリーン名)も一緒に返してくれるので、スクリーン名を取得するためのAPIを改めて発行する必要がない
– Twitter では、認証結果(成功または失敗)しか返してくれない
– Twitter は、OAuth 認証成立後、user_timeline を取得する等の方法でスクリーン名を入手する必要がある (スクリーン名を引数に取るAPIを実行するための前準備)
– Twitter や Yahoo! の OAuth で見られた脆弱性はJaiku の OAuth には存在しない(本当か?)ということで、今も OAuth 1.0 のまま
最近になって追加された API
• search API
• streaming API
• lists関連API
• retweet関連API
•既存の API の Geo-tagging 拡張
search API
•公式Twitter検索 (search.twitter.com)
• streaming API バージョンもある
– track
•以前、IM向けに提供されていたキーワード追跡
•そういえば、IM はどうなったのでしょうか?
• Geo-tagging な情報を使った検索はcoming soon
– trends/available
– trends/location
streaming API
• Twitter のサーバに接続しっ放しの状態にし、次々に流れてくる情報を受け取る
–public_timeline 相当の情報
–指定したユーザのタイムライン
• private 設定しているユーザの情報は取れない
–指定したキーワードを含む発言
–誰でも使用できるレベルのものから契約を結ばないと使えないレベルのものまで
•誰でも使用できるレベルのものは結構抜けがある
Geolocation (位置情報)
• 2009年11月24日版までは Geolocation という名前だったのが、29日版では geo-taggingという名前に変わった
• GeoJSON では“coordinates”:[経度,緯度]
であるのに対し、GeoJSON準拠のはずのTwitterでは
“coordinates”:[緯度,経度]
• GeoJSON では、元々は[X座標,Y座標]で、経度は横方向(東西方向)なのでX座標、緯度は縦方向(南北方向)なのでY座標という考え方から[経度,緯度]の順で表現している
WOEID
• WOEID
–a Yahoo! Where On Earth ID
• http://developer.yahoo.com/geo/geoplanet/
–Yahoo! が世界中の都市、観光名所等に割り振った ID
– trends/location で情報を取得するときに使用
• trends/available で緯度、経度 → WOEID 変換–指定した緯度、経度付近の WOEID 割り当て済みスポット (のうち、Twitter でのつぶやきが存在する場所)の一覧
lists 関連 API
• list の作成、変更、削除
• list への登録、list からの削除
• 指定ユーザが作成したlistの一覧取得
• 指定したlistに登録されている人の一覧取得
• 指定したlistを購読している人の一覧取得
• 指定したlistの購読開始、購読解除
• ……
retweet
• 今までユーザ主導で行われていた RT に対し、Twitter 自身による「公式RT」が登場 (2009年11月)
• 事前に公表されていたドラフト段階の仕様と、実際に運用が始まった仕様に違いがある (レスポンスの形式が変わった)
• まだ、仕様は完全に固定されていないようで、ときどき変更されている
retweet 関連API
• home_timeline
– retweet を含むタイムラインの取得
• retweet
–RTしたい発言のIDを指定してリクエスト発行
• RTの一覧の取得
–自分がRTした発言の一覧取得
–自分の friends がRTした発言の一覧の取得
–自分の発言のうち誰かにRTされた発言の一覧取得
既存のAPIのGeo-tagging拡張
• 発言の投稿 (update)
–緯度、経度を指定して投稿することができる
• タイムラインの取得
–発言に緯度、経度情報(位置情報)が含まれる
–ただし、位置情報は、最近2週間以内の発言にのみ、付けられる (古い発言からは位置情報が削除される)
• 検索
–指定した緯度、経度付近で発言されたものを検索できる
まとめ
• Twitter API の今後
•行き当たりばったり指向プログラミング
Twitter API の今後
• Twitter API version 2
–詳細は不明
–API は api.twitter.com に統一される?
–認証は OAuth に一本化?
–早ければ、2010年2月に登場
行き当たりばったり指向プログラミング
• どうも Twitter の API の実装状況を見ていると、行き当たりばったりにやってるように見える–これからは mention だ、reply は廃止するね、といいつつ、しっかり reply が残っていたり
–GeoJSON 準拠といいながら、経度、緯度の順番が逆とか
–サーバの負荷状況に応じてアドホックに各種制限(上限値)を何の予告もなくいじってみたり
–API によって、引数の名前が違っていたり(同じ意味の引数なのに)
ご清聴、ありがとうございました