2010年10月16日土曜日

TwitterのStreaming APIでlocationsを指定する場合の注意点

TwitterのStreaming APIを使って、プッシュ型で位置情報付きのツイートを取得する時は、以下の点に注意する。


1. Geotagging APIを使用して作成され、且つ、追跡する対象領域内に位置するツイートだけが結果に含まれる

つまり、ユーザーのプロフィールにある現在地の情報はツイートのフィルターには使われない

もし、ユーザーがプロフィールの現在地に“San Francisco”と設定していても、そのツイートがGeotagging APIを使っていなくてgeo要素がなければ、検索結果のストリームには含まれない。

Only tweets that are both created using the Geotagging API and are placed from within a tracked bounding box will be included in the stream – the user’s location field is not used to filter tweets (e.g. if a user has their location set to “San Francisco”, but the tweet was not created using the Geotagging API and has no geo element, it will not be included in the stream).


2. 追跡する対象領域はカンマで区切った経度と緯度のペア指定

最初のペアは対象領域の南西の角を示す。
例えばlocations=-122.75,36.8,-121.75,37.8はサンフランシスコエリアのツイートを追跡する指定になる。

バウンディングボックス、つまり追跡する対象領域は複数の指定ができて最大25個まで可能。例えばlocations=-122.75,36.8,-121.75,37.8,-74,40,-73,41はサンフランシスコとニューヨーク市エリアのツイートを追跡する指定になる。

Bounding boxes are specified as a comma separate list of longitude/latitude pairs, with the first pair denoting the southwest corner of the box. For example locations=-122.75,36.8,-121.75,37.8 would track tweets from the San Francisco area. Multiple bounding boxes may be specified by concatenating latitude/longitude pairs, for example: locations=-122.75,36.8,-121.75,37.8,-74,40,-73,41 would track tweets from San Francisco and New York City.

(・・・)and you may specify up to 25 bounding boxes.


3. locationsの指定とtrackの指定の両方を行なうとOR検索になる

なんと、対象領域の指定が論理ORなのである。

よって、検索キーワードの指定(trackの指定)に「twitter」、追跡する対象領域(locationsの指定)に-122.75,36.8,-121.75,37.8を行なうと、 twitterを含むツイート(geo要素がないツイートでも)か、あるいはサンフランシスコエリアのツイートという条件を指定したことになる。

Bounding boxes are logical ORs. A locations parameter may be combined with track parameters, but note that all terms are logically ORd, so the query string track=twitter&locations=-122.75,36.8,-121.75,37.8 would match any tweets containing the term Twitter (even non-geo tweets) OR coming from the San Francisco area.


特に、1と3が問題だ。

3は、ドキュメントを読んでいて、「ちょっとちょっと~」とついつい突っ込みたくなった。なんでORなの?そこはANDでしょう。

しかし、Twitter側で実装していないのであれば、ストリームで送られてくる検索結果を自分でフィルタリングすればよいだけのこと。まあ、まだよい。


しかし、1の方は大きな障害になるかもしれない。

1は、Twitter側のアプローチとして考えると、正しい。位置情報で絞り込みたいので、位置情報を指定していないツイートは検索結果に含まれるべきではない。

但し、まだまだgeo要素を含んだツイートは少ない。geoがnullでないツイートに限ると、結果件数はとても寂しいものになるだろう。そんな状態でアプリケーションを作っても、ゴーストタウンのようになってしまうかもしれない。何らかの工夫が必要だ。

逆に、プロフィールの現在地をストリームで取得する方法があるのか調べてみたが、今のところストリーム系の3つのAPI、Streaming APIUser StreamsSite Streamsのどれにもそれらしい記述は見当たらない。


ところで、Streaming APIは、2010年8月31日からベーシック認証がdeprecatedになり、OAuthを使うこととなったので、それもチェックポイントだ。
Transitioning from Basic Auth to OAuth | dev.twitter.com

OAuthの具体的な使用方法は、ドキュメントをまだ詳しく読んでないので分からないが、のっけから、「Transitioning from Basic Authentication to OAuth isn't simple for everyone. (ベーシック認証からOAuthへ切り替えることはすべての人にとって簡単というわけではない)」とあるゾ。