1. TOPTOP
  2. Webサービス
  3. Twitter

TwitterAPIのユーザータイムライン(GET statuses/user_timeline)をデータベースに切れ目なく保存する(その2~since_idのクセ)

Twitter_logo_blue

前回(新しいタブで開く)、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のコード

tw_since_id1

例えば、ステータス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つのツイートされたとしましょう。

tw_since_id2

ドキュメンテーションの内容を考慮すると、上の画像のようになります。ステータスIDが39より上のつぶやきで、67、59、44が取得できるように思います。

tw_since_id3

しかし、実際に取得できるイメージは、こちらの画像です。ステータスIDが39より上のつぶやきで、かつ最新の78、70、67を取得することになります。59と44は取得できず、タイムラインに切れ目が発生します。

つまり、”Returns results with an ID greater than the specified ID. “というのは、「指定したツイート」を返すのではなく、「指定したツイートより上でかつ最新のツイート」が返すことになります(読めなかったのは私の英語力が低かったのかもしれませんが)

tw_since_id4

この考えに基づくと、もし2件しかつぶやていないときに3件取得すると、59、44、39のツイートを取得することになります。ここでは、39が重複します。

取得する数 = 引数の値 → きれにとれる

tw_since_id5

ただし、取得する数が引数の値と一致する場合は、切れ目なく、重複することもなくツイートを取得することができます。

連続したきれいなタイムラインをデータベースに追加するためには、この性質を応用します。それは次回のブログで説明しましょう。

なお、今回のブログで使用したスプレッドシートはこちら(新しいタブで開く)です。

〔参考サイト〕