概要
Twitter APIでアプリを作成中、ユーザーのタイムラインから特定のワードを取り出す際になかなか苦労したので、その辺を記録として残しておきます。他にもやり方はあると思いますので、一つの手段として参考にしていただけると幸いです。
Twitter Developerへの登録やタイムライン取得の流れは、他にわかりやすい記事がありますので、そちらを参考にしてください。
Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ
ユーザーのタイムラインを取得
//100件のツイートを取得
$params = array('count' => 100');
// ユーザーのタイムライン取得
$tweets_obj = $twitter->get('statuses/user_timeline', $params);
タイムラインから100件のツイートを取得。
dd($tweets_obj);
ddで中身を確認します。
array:94 [▼
0 => {#1050 ▼
+"created_at": "Mon Jun 08 15:37:53 +0000 2020"
+"id": 00000000000000000
+"id_str": "000000000000000"
+"text": "おはよございます!!今日もいい天気です!!!"
+"truncated": false
+"entities": {#1268 ▶}
+"source": "<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>"
+"in_reply_to_status_id": null
+"in_reply_to_status_id_str": null
+"in_reply_to_user_id": null
+"in_reply_to_user_id_str": null
+"in_reply_to_screen_name": null
+"user": {#1269 ▶}
+"geo": null
+"coordinates": null
+"place": null
+"contributors": null
+"is_quote_status": false
+"retweet_count": 0
+"favorite_count": 3
+"favorited": false
+"retweeted": false
+"lang": "ja"
}
1 => {#1272 ▼
+"created_at": "Mon Jun 08 10:35:05 +0000 2020"
+"id": 11111111111111111
+"id_str": "111111111111111111"
+"text": " #今日の積み上げ
✅筋トレ
✅ランニング
✅読書
今日も1日頑張った!!"
+"truncated": false
+"entities": {#1273 ▶}
+"source": "<a href="https://mobile.twitter.com" rel="nofollow">Twitter Web App</a>"
+"in_reply_to_status_id": null
+"in_reply_to_status_id_str": null
+"in_reply_to_user_id": null
+"in_reply_to_user_id_str": null
+"in_reply_to_screen_name": null
+"user": {#1274 ▶}
+"geo": null
+"coordinates": null
+"place": null
+"contributors": null
+"is_quote_status": false
+"retweet_count": 0
+"favorite_count": 0
+"favorited": false
+"retweeted": false
+"lang": "ja"
}
2 => {#1277 ▼
+"created_at": "Mon Jun 08 08:34:05 +0000 2020"
+"id": 2222222222222
+"id_str": "2222222222222"
+"text": "僕は犬が好きです。猫も好きです。"
+"truncated": false
+"entities": {#1278 ▶}
+"source": "<a href="https://mobile.twitter.com" rel="nofollow">Twitter Web App</a>"
+"in_reply_to_status_id": null
+"in_reply_to_status_id_str": null
+"in_reply_to_user_id": null
+"in_reply_to_user_id_str": null
+"in_reply_to_screen_name": null
+"user": {#1280 ▶}
+"geo": null
+"coordinates": null
+"place": null
+"contributors": null
+"is_quote_status": true
+"quoted_status_id":
+"quoted_status_id_str": "222222222222222"
+"quoted_status": {#1283 ▶}
+"retweet_count": 0
+"favorite_count": 0
+"favorited": false
+"retweeted": false
+"possibly_sensitive": false
+"lang": "ja"
}
仮のツイート3件です。
正規化表現でワード抽出
ここから特定のワードを指定し、ツイートを取得します。
抽出するワードは、#今日の積み上げ
にします。
(ちなみに条件として、直近100件以内で#今日の積み上げ
を呟いている場合のみとします。)
//100件のツイートを取得
$params = array('count' => 100');
// ユーザーのタイムライン取得
$tweets_obj = $twitter->get('statuses/user_timeline', $params);
// 配列からtextカラムを抽出
$columns = array_column($tweets_obj, 'text');
// カラムから「#今日の積み上げ」を抽出
$result = preg_grep('/#今日の積み上げ+/', $columns);
array_columnで配列のtextを抽出。、preg_grepでパターンにマッチする配列の要素を返します。第一引数で検索するパターンを表す文字列を、第二引数で配列を入れます。
/#今日の積み上げ+/
ここで検索する文字列を指定しています。「+(+プラス)」は、一回以上の繰り返しを意味します。
1 => """
#今日の積み上げ
✅筋トレ
✅ランニング
✅読書
今日も1日頑張った!!
"""
これで#今日の積み上げ
が含まれたツイートを取得できました。