サイトのトップへ戻る

Twitter 開発者 ドキュメント日本語訳

タイムラインを処理する

はじめに

Twitter API には GET statuses / user_timeline, GET statuses / home_timeline , GET search / tweetsのようなツイートデータのタイムラインを取得するメソッドがいくつかあります。 こうしたタイムラインは膨大な量になるので、クライアントアプリケーションが一回のリクエストで取得するタイムラインの量には制限があります。 したがって、アプリケーションはより完全なツイート一覧を取得するためにタイムライン結果を複数回取得しなければなりません。

Twitterのリアルタイム性と継続してタイムラインに追加されるデータ量を考慮すると、標準的なページング方法が常に効果的に働くとは限りません。 このページでは、Twitter 開発者が検索結果をページングの際に直面するであろう問題を例示し、タイムラインを処理するためのベストプラクティスを解説します。



The problem with “pages”

理想的な世界においてはページングの実装は非常に簡単です。10個のツイートが新しい順に表示される場合を考えて見ましょう。 ページサイズが5に設定されているので、アプリケーションは二回のリクエストで全てのタイムラインを読み込もうとし、最初のページをリクエストしてそれから2ページ目のリクエストをします。 以下の画像でこの方式を例示しています:

Image depicting a timeline being fetched in two 'pages'.

この方法の問題点は、Twitter のタイムラインには絶えず新しいツイートが先頭に追加されることです。前述の例で考えてください。 一回目のページングと二回目のページングの間に二つの新しいツイートが追加されると、二回目のページングで前回既に取得したツイートを二つまた取得してしまいます。:

Image depicting a timeline receiving two additional Tweets between fetches, where the second API call receives two tweets it has already processed

実際、ページングの間に5個以上のツイートが追加されると、後続のページングでは最初のリクエストで取得したツイートを最後まで延々と取得し続けます - API リクエストの完全な無駄遣いです。



max_id パラメータ

上で説明した問題を解決する方法は、カーソリング(cursoring)と呼ばれるデータストリームを操作する技術を使うことです。 (頻繁に更新される)一覧の上からタイムラインを読み込むのではなく、既に処理したツイートのIDを基点にしてタイムラインを読み込みます。 max_id リクエストパラメータを使うことでこれが可能です。

max_id を正しく使うために、初回のタイムラインエンドポイントへのリクエストではcountの指定のみをします。 この際の応答および後続の応答を処理する際に、取得したツイートIDの中で最も小さい値のものを保持し続けます。このIDを次のリクエストで max_idパラメータの値として渡します。 そうすることで、max_idパラメータ以下のIDを持つツイートのみを取得することができます。 max_id パラメータの取得範囲には自身も含まれるので、以下画像で示すようにmax_idパラメータに合致するIDのツイートは二回取得されるので注意してください:

Image showing the use of the max_id parameter, with only one Tweet being returned twice.


64ビット整数の環境でmax_id を最適化する

ツイートが一つ重複してしまうからといって非常に非効率というわけでもありませんが、あなたのプラットフォームが64ビット整数を使える環境であればmax_idリクエストを最適化してこの問題を処理することも可能です。ツイートIDを64ビット精度の整数で表現できない環境(JavaScriptのような)ではこの手順は飛ばしてください。 前回のリクエストで取得したツイートIDから1を引いて、 max_idとして使います。 この修正したmax_idが有効なツイートIDかどうか、別のユーザーによって投稿されたツイートのIDではないかといったことは気にする必要はありません。 - この値は、単にフィルタするツイートを決めるために使われるだけです。こうやって調整すると、重複したツイートを取得せずにタイムラインをページングすることが可能です。:

Image showing the user of the adjusted max_id parameter, so that no Tweets are returned twice.


効率化するために since_id を使用する

タイムラインを処理し、しばらく時間を置き、そして前回タイムラインを処理した後に新しく追加されたツイートを処理するようなアプリケーションでは、since_idパラメータを使ってさらに最適化することができます。

1から10までのツイートを処理した前回の例を考えて見ましょう。前回例の処理を開始してから、11から18のツイートがタイムライン追加された場合を創造してください。 一覧の上からTweet 10にたどり着くまでツイートの取得を繰り返すのは、非効率なやり方です。 以下の画像で示すように、このやり方だと既に処理した二つのツイートをまた取得してしまいます。:

Image showing processing Tweets which have been added since the timeline was first processed, with two redundant Tweets.

既にアプリケーションが処理したツイートの中で最も大きなIDを since_idパラメータに設定することで、この問題を回避できます。 max_id と違い、since_id パラメータの取得範囲に自身は含まれないので、IDを調整する必要はありません。 以下の画像で示すように、 Twitter はsince_idで渡した値よりも大きなIDを持つツイートのみを返します。

Image showing processing Tweets which have been added since the timeline was first processed, using since_id so no redundant Tweets are returned.

何度もリクエストしてタイムラインの使用可能なコンテンツを全て処理することはできますが、 max_idパラメータと since_idパラメータを使うことでアプリが重複データを取得したり処理したりするのを最小限に抑えることができます。