Twitterのstatus IDを保存しているサービスが直ちに確認すべき2つのポイント

Twitterのstatus IDを保存しているサービスを運営している場合、サービスの仕様とつきあわせて問題が生じないか(または既に生じてないか)直ちに確認しましょう。
遅れれば遅れるほど対応が困難になります。

具体的な変更点

Twitterのstatus IDの仕様が変更になりました。
現在移行期間中ですが、最終的には64bitの整数で生成するようになるそうです。


技術的な話というか、細かい話は末尾の情報元・関連情報をそれぞれご確認ください。
私と同じくらいしかスキルのない人のために、とりあえずここでは具体的な話だけします(それしかできないともいう)。


Twitterstatus IDは、Twitterの各ツイート固有のIDTwitterの各ツイート固有のIDです。

11のコラール前奏曲Op.122〜第6曲「おぉいかに幸せになるか、汝ら信仰厚き者よ」 - ブラームス http://ottava.suki.net/item/17863/ [11/6 11:43:16〜]less than a minute ago via kitter

↑例えばこのツイートの「740385911476225」の部分ですね。


手元で確認している限り、以下のように推移しています。

10桁

〜2010年3月5日(金) 9時半頃

11桁

2010年3月5日(金) 10時頃〜11月5日(金) 2時15分11秒

15桁

2010年11月5日(金) 7時頃〜

16桁

2010年11月7日(日) 7時頃〜


10桁から11桁への変更は、単なるツイート数の増加によるものと考えられますが、15桁に増えたのは今回の仕様変更にともなうものです。最終的に「64bitの整数で生成」するということなので、今後さらに桁数が増えることになると思います。


具体的な確認の対象

手元のDBの型・桁数の確認(おさまるかどうか)

まぁ、これはこの話を聞けば、開発者なら誰しも思いつく話ではあります。
ある程度余裕を持たせている結果、影響しないサービスも多いはず。

今後、「id」を取得するか「id_str」を取得するか

以下の話は、TwitterAPIで取得したsearch.jsonを、PHPjson_decodeでデコードし、var_dumpした結果をもとにお話します。他の場合は、自分で置き換えて(または実際に試して)理解してください(普遍的な話をするほどスキルがありません^^;)

[3]=>
object(stdClass)#15 (14) {
["from_user_id_str"]=>
string(8) "90194490"
["profile_image_url"]=>
string(69) "http://a0.twimg.com/profile_images/1156455280/ottabot_icon_normal.png"
["created_at"]=>
string(31) "Sat, 06 Nov 2010 02:44:56 +0000"
["from_user"]=>
string(7) "ottabot"
["id_str"]=>
string(15) "740385911476225"
["metadata"]=>
object(stdClass)#16 (1) {
["result_type"]=>
string(6) "recent"
}
["to_user_id"]=>
NULL
["text"]=>
string(180) "11のコラール(中略):16〜]"
["id"]=>
float(740385911476220)
["from_user_id"]=>
int(90194490)
["geo"]=>
NULL
["iso_language_code"]=>
string(2) "ja"
["to_user_id_str"]=>
NULL
["source"]=>
string(91) "(略)"
}

Twitterのstatus IDを取得する場合、今までは上記「id」を取得していたと思います。
しかし、JavaScript のような言語では仕様の問題から 53 bit を超える整数は正しくパースできないため、「id_str」という項目が加わりました。


「id」(float型)と「id_str」(string型)は、型以外に上記具体例をご覧になればわかるように中身も異なります(同じ結果になることもありますが、ほとんど微妙な値で異なります)。……まぁそりゃそうですよね。
では今後、「id」と「id_str」、どちらを使うべきか。


少なくとも上記条件の下においては「id_str」一択です。
Twitterのstatus IDを保存しているサービスの場合、元のツイートのパーマリンクにリンクを貼るのも目的のひとつだと思います。このパーマリンクで使われるIDの値は「id」ではありません。


パーマリンクで使われるIDの値は「id_str」の値と等しいです。
このような相違は、15桁になった昨日11月5日(金) 7時頃から生じているようです。
したがって、速やかに参照先を「id_str」に変更する必要があります。
でないと、リンク切れとなります。


上記変更点が影響しないか、ご自身のサービスの仕様とつきあわせて直ちにご確認ください。
ちなみに今のところ影響してない様子です(確認できていません)が、user idについてもstrを同様の結果が起こる可能性があるので、今のうちに新仕様に対応させておくのが望ましいです。

情報元・関連情報






追記

しかしTwitterのユーザーを特定する方法のときにも思いましたが、似たような項目がぽこぽこ現れるのは、規模の拡大とともにやむを得ないのでしょうが、混乱のもとですねぇ…。大変。



さてTwitterのOauthを勉強するのにお世話になったSDN projectさんがつくられた、twitter_bot.phpを使っている方が、上記症状を確認。


id_strに修正して無事解決されたようです。よかった!
しかしこれは便利なスクリプトですね。また参考にさせてもらおっと。



型の話を詳しく書いてらっしゃいますね。



やっぱりというか、そういう感じみたいです。

@ui_nyan http://t.co/GlNXAOT ここで説明されてるズレのことでしたら PHP の仕様で、64bit 整数型が扱えるほかの言語では特に問題ないです。less than a minute ago via チャーハン諸島

なんというか、もう……お察し申し上げます(としか胸がつまって言えない)


53bitを越えて各所で問題になったため、再び話題になった様子。
想定外のツイートを公式RTとかしょぼーんな感じですね。
仕様改変タイヘン(´・ω・`)
ちゃんと理解するのもタイヘン