読者です 読者をやめる 読者になる 読者になる

Twiter API を使って Retweet を取り消す処理

設計

 Twitter API を利用したプログラムを作ってみてるのですが案の定ハマるべきところでハマっておりました。で、これがググってもなかなか出てこない...(´Д` ) 。Twitter API を利用したプログラムを書いたことある人ってかなり多くいるような気がするんですけども、皆さんどうされてるんでしょ?とりあえず解決できたので書いておきます。


【ハマった問題】公式 Retweet の取り消しができない


ハマりポイント 1. どゆこと?
 まず Retweet の API ですが、「Retweet する API」はあれど「Retweet を取り消す API」ありません。じゃあどうやって取り消すかっていうと「呟きを削除する API」を使って取り消す仕組みになっています。それがコレ。
 『POST statuses/destroy/:id』Twitter Developers
 ここの id に呟きの id を渡す、という仕様です。


ハマりポイント 2. 呟きの id って何だ
 通常の呟きには「Tweet id」が割り振られます。例えば「https://twitter.com/#!/PG_kura/status/184912693826818048」という呟きがあるとき 184912693826818048 が id です。一方、この呟きを他の誰かが Retweet したとき、それとは別に「Retweet id」が追加で割り振られます。Retweet を取り消すとき「呟きを削除する API」に渡すのは「Tweet id」ではなく「Retweet id」なんですね。


ハマりポイント 3.「Retweet id」を取得する
 「Retweet id」は、Retweet したときのレスポンスとして取得できます。しかし、Retweet 済みの post を再度 Retweet しても「Retweet id」は教えてくれません。そこで API を眺めると、いくつかそれっぽいのが目につきます。
 a. 『GET statuses/show/:id』 Twitter Developers
  id で指定した呟きの詳細データを取得する。
 b. 『GET statuses/retweets/:id』 Twitter Developers
  id で指定した呟きの Retweet 群に関するデータを取得する。
 c. 『GET statuses/retweeted_by_me』 Twitter Developers
  自分が行った Retweet 群に関するデータを取得する。

 しかし... それぞれの説明を読んでみるとちょっと「Retweet id」の取得が難しい事がわかります。まず a. のレスポンスには「Retweet id」は含まれていません。また b. は最大 100 件しかデータを得られないので自分が行った Retweet が 101 人目より後だったらデータが取れません。c. は最近自分が行った Retweet 100 件ぶんしかデータを得られないので 101 件より古い Retweet のデータは取れません。つまり全部ダメです。
 困ったなーと思ってググってみたら↓ようやく出てきました。
 『Issue 1274: retweet undo/destroy API call』
 どうやら a. に "include_my_retweet" というオプションが使えるそうです。"include_my_retweet" に 1 を指定して a. を呼ぶと、レスポンスに "current_user_retweet" が追加され、その中の "id" が「Retweet id」を示すようです。そんなことドキュメントに書いてないぞオィ...。

まとめ
 Retweet の取り消しは以下の手順を踏みます。
1. 「Retweet id」を取得する。
 Retweet したときのレスポンスから取得する。もしくは a. 『GET statuses/show/:id』 Twitter Developers に "include_my_retweet" オプションを追加して取得する。
2. 「呟きを削除する API」を呼ぶ。
 『POST statuses/destroy/:id』Twitter Developers の id に 1. で取得した id を渡す。