doudonn WEB制作やサーバーの話とかいろいろ

【PHP】Twitter API V2でリプライを取得する考え方・注意点など

doudonn 更新日:
【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で取得して更新しないといけません。
更新というより、削除されたツイートの判別ですね。

まとめサイトを作ろうとしている人はここが問題になるだろう。
個人的にもキャッシュが一番の問題です。
リプ取得はまずはキャッシュをどうするか?から考えることをおすすめします。

※そうして作った「ついったらトレンド」を是非見てみてください

--

<管理人からの各種招待>
エックスサーバーお友達紹介(最大1万円割引)
ConoHa友達紹介(1000円クーポン)

TwitterAPIの関連記事

記事一覧はこちら:TwitterAPI

管理人について
doudonn
名前:doudonn(どうどん)
ひたすらWEB制作な人。
一応社長です。音ゲー好き

<Twitterはこちら>
ゲーム垢
WEB制作垢
お知らせ

2022年11月30日に全記事削除しました。
まだ再開に向け作りかけ。


無駄にページ表示速度にこだわってます。

役立ちサイト
wiki
© 2022-2023 doudonn All Rights Reserved.