風柳メモ

ソフトウェア・プログラミング関連の覚書が中心。

Twitter APIのsince_idの仕様を勘違いしていた…

この記事は REST API version 1 時のものです。
REST API version 1.1 ではGET statuses/user_timelineの仕様自体が変更となっていますので(例えばpageオプションはなくなっている等)、この記事は参考にはなりません。ご注意ください。



statuses/user_timeline APIを使って、特定ツイートの前後のツイートを取得する動作をさせようとして、since_idオプションの仕様を勘違いしていたことに今更気がついたので、覚書ついでに恥をさらしておきます。

max_idの仕様は直感的なんですよね

特定ツイート以前(直前)のものを取得するのはとくに問題無くて、

max_id. Returns only statuses with an ID less than (that is, older than) or equal to the specified ID.

http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses-user_timeline

とあり、指定したidと同じもの、および、それより古いツイートが、最大count数(デフォルト20個)分返ってくる、と。これは素直なんです。

で、since_idの場合は…

問題は、特定ツイート以降(直後)のものを取得する場合で。

since_id. Optional. Returns only statuses with an ID greater than (that is, more recent than) the specified ID.

http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses-user_timeline

を適当に読み流し、ああ、指定したidを含まず、その直後のツイートが、最大count数(デフォルト20個)分返ってくるんだな…と単純に思っていたのですが、これが間違いの元。

(that is, more recent than)

の部分を完全に読み飛ばしていたというか……

確かに、指定したidよりも新しいツイート数がcount件内に収まっている場合(図のcase-1)は、想像通りの動作をするのですが、count数より大きい場合(図のcase-2)には、『最新ツイートの方からcount件』(図のpage=1の部分)が返されてしまいます。
pageは省略した場合は1と見なされるため。

それより以前のツイートを取得しようとした場合には、pageオプションで2以降を指定してやらねばならず……目的の、特定ツイート直後のツイートを欲しい数だけ取得しようと思ったら、

  1. 目的ツイートが何ページ目にあるかを探す。
  2. そのページ(Nとする)内で目的ツイートよりも新しいものが、欲しい件数分無かった場合、(N-1)ページ目のツイートも取得する。

という、やっかいなことをしなければいけないようです……ただでさえAPIコール制限とかあるのに……。
古いものから取得出来るオプションを付けてほしいなぁ…やり方知らないだけ?