TwitterAPIのユーザータイムライン(GET statuses/user_timeline)をデータベースに切れ目なく保存する(その2~since_idのクセ)
目次
前回(新しいタブで開く)、70行ものPHPコードを書いたにも関わらず、それだけでは、「切れ目なく」ユーザータイムラインのつぶやきを追加することはできませんでした。なぜなら、エンドポイントにアクセスしたときに使った引数のうち、since_idに独特のクセがあるからです。
since_idの日本語訳
TwitterAPIのドキュメンテーションで、GET statuses/user_timelineのParametersを読むと、since_idについてこのように書かれています。
Returns results with an ID greater than (that is, more recent than) the specified ID.
そのまま何も考えずに日本語訳すると、「(引数として)指定したIDより上のIDをもつ結果(ツイート)を返す」と読めてしまいます。
前提となるPHPのコード
例えば、ステータスID39を基準として、ツイートを3件取得することにしましょう。そのときのコードは、こんな感じになります。
(さらに詳しいコードはこちら(新しいタブで開く))
$request = $twObj->OAuthRequest('https://api.twitter.com/1.1/statuses/user_timeline.json','GET', array( 'count'=>'3', 'screen_name' => 'echizenya_yota', 'since_id' => '39', ));
ちなみにTwitterのステータスIDは、イメージ画像の通り、連番になりません。
指定したIDより上でかつ最新のツイート
ステータスIDが78であるツイートまで、新しく5つのツイートされたとしましょう。
ドキュメンテーションの内容を考慮すると、上の画像のようになります。ステータスIDが39より上のつぶやきで、67、59、44が取得できるように思います。
しかし、実際に取得できるイメージは、こちらの画像です。ステータスIDが39より上のつぶやきで、かつ最新の78、70、67を取得することになります。59と44は取得できず、タイムラインに切れ目が発生します。
つまり、”Returns results with an ID greater than the specified ID. “というのは、「指定したツイート」を返すのではなく、「指定したツイートより上でかつ最新のツイート」が返すことになります(読めなかったのは私の英語力が低かったのかもしれませんが)
この考えに基づくと、もし2件しかつぶやていないときに3件取得すると、59、44、39のツイートを取得することになります。ここでは、39が重複します。
取得する数 = 引数の値 → きれにとれる
ただし、取得する数が引数の値と一致する場合は、切れ目なく、重複することもなくツイートを取得することができます。
連続したきれいなタイムラインをデータベースに追加するためには、この性質を応用します。それは次回のブログで説明しましょう。
なお、今回のブログで使用したスプレッドシートはこちら(新しいタブで開く)です。
〔参考サイト〕