サイトのトップへ戻る

Twitter 開発者 ドキュメント日本語訳

Twitter IDs

JSONを使用してAPIを実行する場合、idフィールドではなく常に id_strフィールドを使用するようにしてください。 これは、JSONを扱うJavascript やその他プログラミング言語における、桁の大きな数字を処理する方法がネックとなっているからです。 idid_strの内容が一致しない状況が発生した場合、それはIDの数値を解析・処理したあなたの開発環境に問題があります。 Twitter でどのようにIDが生成されるかについての詳細情報を以下を読んでください。

snowflake-based IDが与えられるツイートに加え、2011年9月30日からはダイレクトメッセージにも snowflake 64-bit 整数が割り振られるようになりました。



Snowflakeというのは何ですか?

Snowflake とは、我々が重複のないTweet IDを生成するのに使用しているサービスのことです。これらのツイートIDは重複のない64ビットの符号なし整数で、現在のIDのように数字を順番に割り振るのではなく、時間を基に生成されます。このIDはタイムスタンプと worker numberとシーケンス番号で構成されています。



問題

Twitter立ち上げ前に、Javascript のような一部のプログラム言語は53bitsの数字をサポートしていないということが我々の中で問題に上がりました。 この問題は、ブラウザコンソール上で(90071992547409921).toString()といった文字列変換コマンドを実行したり、以下のJSON をあなたが使っているJSON パーサーで実行してみることですぐに確認することができます。

{"id": 10765432100123456789, "id_str": "10765432100123456789"}

この影響を受けるJSON パーサーでは、ID の変換に失敗して精度が失われます。パーサーによっては例外が発生するかもしれません。



解決策

javascript とJSON パーサーがIDを読み取れるようにするには、JSON 形式の応答を取得する際にはIDを文字列として取得する必要があります。 Twitter API 実行時のJSON 応答において、ステータスID、ユーザーID、ダイレクトメッセージID、検索IDは、現状では数値と文字列の両方が取得されています。 この仕様はメインのTwitter API、ストリーミングAPI、検索APIに適用されています。

例えば、status オブジェクトは現在 idid_strを保持しています。status オブジェクトを表した以下のJSONデータでは、各データポイントごとにIDフィールドが二種類あるのが見えるでしょう。

[
  {
    "coordinates": null,
    "truncated": false,
    "created_at": "Thu Oct 14 22:20:15 +0000 2010",
    "favorited": false,
    "entities": {
      "urls": [
      ],
      "hashtags": [
      ],
      "user_mentions": [
        {
          "name": "Matt Harris",
          "id": 777925,
          "id_str": "777925",
          "indices": [
            0,
            14
          ],
          "screen_name": "themattharris"
        }
      ]
    },
    "text": "@themattharris hey how are things?",
    "annotations": null,
    "contributors": [
      {
        "id": 819797,
        "id_str": "819797",
        "screen_name": "episod"
      }
    ],
    "id": 12738165059,
    "id_str": "12738165059",
    "retweet_count": 0,
    "geo": null,
    "retweeted": false,
    "in_reply_to_user_id": 777925,
    "in_reply_to_user_id_str": "777925",
    "in_reply_to_screen_name": "themattharris",
    "user": {
      "id": 6253282,
      "id_str": "6253282"
    },
    "source": "web",
    "place": null,
    "in_reply_to_status_id": 12738040524,
    "in_reply_to_status_id_str": "12738040524"
  }
]


直ぐにすべきこと

まず最初にすべきは、あなたのプログラムのJSONパーサーを使用して上記JSONデータをデコードすることです。 その出力結果を見て、JDの精度が失われていないか確認してください。

上記の結果次第で次にやるべきことが変わってきます:

  • コード上で精度を失わずにIDの変換に成功した場合、問題ありませんが、なるべく早く_str を使用する仕様変更を検討してください。
  • コード上で精度が失われた場合、直ぐに_str を使用するようにコードを書き換えて下さい。そうしないと、あなたのプログラムでは Twitter APIとやり取りすることができなくなります。
  • プログラム言語のパーサーによっては、IDの値を読み込んだ時にJSONで例外が発生することがあります。 あなたの環境で例外が発生した場合、ID パラメータを削除するか_str に置き換えて、データを‘pre-parse’する必要がありま。


まとめ

  1. あなたがJavascriptで開発している場合は、コードを更新して数値ではなく文字列を読み込むようにする。
  2. JSON デコーダーを使用する場合は、上述のサンプルJSONをデコードして例外が発生しないかを確認する。 例外が発生した場合は、データをpre parseする必要がある。デコーダの名前、バージョン、例外が発生したパーサーのプログラム言語を教えてもいただければ、我々で調査することが可能です。