Twitter API には GET statuses / user_timeline, GET statuses / home_timeline , GET search / tweetsのようなツイートデータのタイムラインを取得するメソッドがいくつかあります。 こうしたタイムラインは膨大な量になるので、クライアントアプリケーションが一回のリクエストで取得するタイムラインの量には制限があります。 したがって、アプリケーションはより完全なツイート一覧を取得するためにタイムライン結果を複数回取得しなければなりません。
Twitterのリアルタイム性と継続してタイムラインに追加されるデータ量を考慮すると、標準的なページング方法が常に効果的に働くとは限りません。 このページでは、Twitter 開発者が検索結果をページングの際に直面するであろう問題を例示し、タイムラインを処理するためのベストプラクティスを解説します。
Working with TimelinesIntroductionThe Twitter API has several methods, such as GET statuses / user_timeline, GET statuses / home_timeline and GET search / tweets, which return a timeline of Tweet data. Such timelines can grow very large, so there are limits to how much of a timeline a client application may fetch in a single request. Applications must therefore iterate through timeline results in order to build a more complete list. Because of Twitter’s realtime nature and the volume of data which is constantly being added to timelines, standard paging approaches are not always effective. The goal of this page is to demonstrate the issues Twitter developers may face when paging through result sets and to give best practices for processing a timeline. |
理想的な世界においてはページングの実装は非常に簡単です。10個のツイートが新しい順に表示される場合を考えて見ましょう。 ページサイズが5に設定されているので、アプリケーションは二回のリクエストで全てのタイムラインを読み込もうとし、最初のページをリクエストしてそれから2ページ目のリクエストをします。 以下の画像でこの方式を例示しています:
この方法の問題点は、Twitter のタイムラインには絶えず新しいツイートが先頭に追加されることです。前述の例で考えてください。 一回目のページングと二回目のページングの間に二つの新しいツイートが追加されると、二回目のページングで前回既に取得したツイートを二つまた取得してしまいます。:
実際、ページングの間に5個以上のツイートが追加されると、後続のページングでは最初のリクエストで取得したツイートを最後まで延々と取得し続けます - API リクエストの完全な無駄遣いです。
The problem with “pages”In an ideal world, paging would be very easy to implement. Consider the case where a timeline has 10 reverse-chronologically sorted Tweets. An application might attempt to read the entire timeline in two requests by setting a page size of 5 elements and requesting the first page, then the second page. The following image demonstrates this approach: The problem with this method is that Twitter timelines are constantly having new Tweets added to their front. Consider the previous example. If two new Tweets are added to the timeline between the first and second calls, the second fetch retrieves two Tweets which were returned in the previous call: In fact, if 5 or more Tweets were added between calls, subsequent calls would eventually retrieve all the Tweets returned from the first request - making an entire API request completely redundant. |
上で説明した問題を解決する方法は、カーソリング(cursoring)と呼ばれるデータストリームを操作する技術を使うことです。
(頻繁に更新される)一覧の上からタイムラインを読み込むのではなく、既に処理したツイートのIDを基点にしてタイムラインを読み込みます。
max_id
リクエストパラメータを使うことでこれが可能です。
max_id
を正しく使うために、初回のタイムラインエンドポイントへのリクエストではcount
の指定のみをします。
この際の応答および後続の応答を処理する際に、取得したツイートIDの中で最も小さい値のものを保持し続けます。このIDを次のリクエストで max_id
パラメータの値として渡します。
そうすることで、max_id
パラメータ以下のIDを持つツイートのみを取得することができます。
max_id
パラメータの取得範囲には自身も含まれるので、以下画像で示すようにmax_id
パラメータに合致するIDのツイートは二回取得されるので注意してください:
The max_id parameterThe solution to the issue described above is to use a technique for working with streams of data called cursoring. Instead of reading a timeline relative to the top of the list (which changes frequently), an application should read the timeline relative to the IDs of Tweets it has already processed. This is achieved through the use of the To use |
ツイートが一つ重複してしまうからといって非常に非効率というわけでもありませんが、あなたのプラットフォームが64ビット整数を使える環境であればmax_id
リクエストを最適化してこの問題を処理することも可能です。ツイートIDを64ビット精度の整数で表現できない環境(JavaScriptのような)ではこの手順は飛ばしてください。
前回のリクエストで取得したツイートIDから1を引いて、 max_id
として使います。
この修正したmax_id
が有効なツイートIDかどうか、別のユーザーによって投稿されたツイートのIDではないかといったことは気にする必要はありません。
- この値は、単にフィルタするツイートを決めるために使われるだけです。こうやって調整すると、重複したツイートを取得せずにタイムラインをページングすることが可能です。:
Optimizing max_id for environments with 64-bit integersWhile one redundant Tweet is not terribly inefficient, it is still possible to optimize |
タイムラインを処理し、しばらく時間を置き、そして前回タイムラインを処理した後に新しく追加されたツイートを処理するようなアプリケーションでは、since_id
パラメータを使ってさらに最適化することができます。
1から10までのツイートを処理した前回の例を考えて見ましょう。前回例の処理を開始してから、11から18のツイートがタイムライン追加された場合を創造してください。 一覧の上からTweet 10にたどり着くまでツイートの取得を繰り返すのは、非効率なやり方です。 以下の画像で示すように、このやり方だと既に処理した二つのツイートをまた取得してしまいます。:
既にアプリケーションが処理したツイートの中で最も大きなIDを since_id
パラメータに設定することで、この問題を回避できます。
max_id
と違い、since_id
パラメータの取得範囲に自身は含まれないので、IDを調整する必要はありません。
以下の画像で示すように、 Twitter はsince_id
で渡した値よりも大きなIDを持つツイートのみを返します。
何度もリクエストしてタイムラインの使用可能なコンテンツを全て処理することはできますが、 max_id
パラメータと since_id
パラメータを使うことでアプリが重複データを取得したり処理したりするのを最小限に抑えることができます。
Using since_id for the greatest efficiencyApplications which process a timeline, wait some quantity of time, and then need to process new Tweets which have been added since the last time the timeline was processed can make one more optimization using the Consider the previous example where Tweets 1 through 10 were processed. Now imagine that Tweets 11 through 18 were added to the timeline since the processing in the previous example began. An inefficient approach to process the new Tweets would be to iterate from the start of the list until Tweet 10 appeared. As shown in the following image, this causes two Tweets which have already been processed to be returned again: This problem is avoided by setting the Applications which use both the |