Posted at

Twitter APIのmax_id,since_idが無限ループする問題

More than 3 years have passed since last update.


結論

id_strの値をプラマイ1して設定してください


説明

ちょっと試しに携帯から投稿。全く本文が見えない。別で編集して張り付けたほうがいいですねこれ。

今回は前回紹介したサービスを作る際につまずいたTipsを載せておきます。

ファボ画像一覧サービス

QooQ Twitter Favo Photos Viewer

https://app-qooq.rhcloud.com/app-twitter/favolist


現象

TwitterAPIは1度に取得できるツイート数に上限があるため、すべてのツイートを取得するには数回にわける必要があります。

https://dev.twitter.com/rest/reference/get/favorites/list

で、そのためにはパラメーターにmax_idかsince_idを指定する必要があり、新しいほうから取得するならmax_idを指定する必要があります。

この指定をしくじると同じデータが延々返ってきて無限ループっぽい動作になります。


原因1:指定したIDを含む

このAPIは指定したID以下または以上を返します。素直に最後に取得したツイートのIDを指定すると、最終的に延々とそのツイートが返ってくるのでプラマイ1しましょう。


原因2:丸め誤差が発生する

本題はこっちです。ツイートのIDプロパティは値がでかいです。Javascriptで普通に操作すると、プラマイ1しても、結果が丸められて値が変化しません。そもそも取得した時点で誤差が発生しており、結論からいうとIDプロパティは役に立ちません。

これを回避するには、id_strプロパティを使いましょう。IDが文字列で入っています。文字列なので直接プラマイできないので適当なBig Intライブラリを使いましょう。私は https://github.com/MikeMcl/bignumber.js/blob/master/README.md このあたりを使わせて頂きました。

これで丸め誤差も発生せず、期待した通りに動作します。