【PHP】Twitter API V2でリプライを取得する考え方・注意点など
Twitter API V2でリプライを取得する!
v1.1では「リプ」という条件で検索はできませんでしたが、
v2からは普通にできるようになりました。
ただちょっと工夫が必要なので、そのあたりを書きたい。
1、とりあえずリプ取得コード(PHP)
<?php
$tweetid = $id;
$base_url = 'https://api.twitter.com/2/tweets/search/recent';
$q = "conversation_id:".$tweetid;
$query = [
'query' => $q,
'sort_order' => 'recency',
'expansions' => 'author_id,in_reply_to_user_id,attachments.media_keys,referenced_tweets.id,referenced_tweets.id.author_id',
'max_results' => '100',
'user.fields' => 'id,name,username,profile_image_url',
'media.fields' => 'media_key,url,preview_image_url,type,variants',
'tweet.fields' => 'id,text,attachments,created_at,possibly_sensitive,public_metrics,in_reply_to_user_id,conversation_id,entities,lang'
];
$url = $base_url . '?' . http_build_query($query);
$token = '××××××××××××'; //Bearer Token
$header = [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
$result = json_decode($response, true);
curl_close($curl);
?>
※「$id」と「$token」は変更ください。
これを実行すると、「$result」にデータが格納されます。
あとはforeachとかで取得していけばいい。
2、リプ取得のポイント
このコードのポイントはここ。
$q = "conversation_id:".$tweetid;
「conversation_id」というのは、元ツイートとそのリプを繋げるIDです。
元ツイートをAPIで取得すればわかります。
元ツイートに関わるリプを取得できます。リプのリプまで全部です。
詳しくはこちらを「Conversation threads using the Twitter API」
しかしここです。リプのリプまで取得すると無駄が多い。
延々とユーザー同士で会話しているものまで拾ってしまう。
どんなリプデータにしたいのか?によりますが、
だいたいはここが面倒なポイントになると思います。
ということで、全部取得して後で取捨選択する!という感じです。
3、取得したデータの処理
「基本情報」「ユーザー情報」「メディア情報」と配列が分かれている。
配列が100個あってそれぞれに順番に、というものではない。
基本情報を元に、メディア情報等と紐づけしないといけません。
データベース的な考え方になってくる。
//ユーザー情報の取得
foreach ($result['includes']['users'] as $result2) {
}
//メディア情報の取得
foreach ($result['includes']['media'] as $result2) {
}
//基本情報の取得
foreach ($result['data'] as $result2) {
}
ごめん、サンプルコードは無し…
お見せできるような完璧なコードは作れていません。
JSONを見ればわかるとは思います。
「メディアID」と「ユーザーのID」を紐づけしていくだけです。
OGP画像のデータは無いので、ここは自分で取得してね!らしい。
動画の処理もけっこう面倒くさいです。
そのあたりのコードが適当すぎるので、とても公開できない…。
4、取得リプデータを整理整頓するために
取得したデータの中にある「in_reply_to_user_id」と「referenced_tweets」を見る。
「in_reply_to_user_id」は「どのユーザーに当てたリプか?」のID。
「referenced_tweets」は「どのツイートに当てたリプか?」のID。
これらで判別して除外していくことになる。
例えば、元ツイート当てのリプだけ取得するなら、
「referenced_tweets」が元ツイートIDと同じものを。
if($result2['referenced_tweets'][0]['id'] != $tweetid){
continue;
}
こうやってcontinueしていきます。
頭の体操を頑張ろう。
ツイート主に当てたリプ以外は除外する場合はこんな感じ。
if($result2['in_reply_to_user_id'] != $userid){
continue;
}
ちゃんと識別できる項目があるので、
理想通りのリプ取得ができるはずです。
3、注意点
「lang」での判別はあてにならない。
日本語のリプだけ取得したい場合も、「lang:ja」はクエリにしないほうがいい。
画像のみのリプが抜けてしまうことがある。
ツイ主が連続して画像をリプすることが多いので、それに対応できない。
//ツイート主のリプでは無い場合
if($result2['author_id'] != $userid){
if($result2['lang'] != "ja"){
continue;
}
}
こうするとツイート主のリプは全部取得してかつ、他ユーザーのlang:ja以外は除外できる。
そんな感じで、試行錯誤すれば何でもできるはずです。
--
あとは、毎回取得すると制限オーバーになるのでキャッシュは必須。
もちろん、API検索では直近7日間のツイートしか取得できないので、
最新データを維持するなら「Tweets lookup」のAPIで取得して更新しないといけません。
更新というより、削除されたツイートの判別ですね。
まとめサイトを作ろうとしている人はここが問題になるだろう。
個人的にもキャッシュが一番の問題です。
リプ取得はまずはキャッシュをどうするか?から考えることをおすすめします。
※そうして作った「ついったらトレンド」を是非見てみてください