Twitter APIでユーザーのタイムラインから、特定のワードが含まれたツイートを取得

#概要

Twitter APIでアプリを作成中、ユーザーのタイムラインから特定のワードを取り出す際になかなか苦労したので、その辺を記録として残しておきます。他にもやり方はあると思いますので、一つの手段として参考にしていただけると幸いです。


Twitter Developerへの登録やタイムライン取得の流れは、他にわかりやすい記事がありますので、そちらを参考にしてください。

[Twitterのタイムライン取得](https://qiita.com/hawk777/items/1986f79de455a0e8e4dd)

[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)

#ユーザーのタイムラインを取得

```
//100件のツイートを取得
$params = array('count' => 100');

// ユーザーのタイムライン取得
$tweets_obj = $twitter->get('statuses/user_timeline', $params);
```

タイムラインから１００件のツイートを取得。

```
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"
  }
```

仮のツイート３件です。


#正規化表現でワード抽出

ここから特定のワードを指定し、ツイートを取得します。

抽出するワードは、`#今日の積み上げ`にします。

（ちなみに条件として、直近１００件以内で`#今日の積み上げ`を呟いている場合のみとします。）


```
//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](https://www.php.net/manual/ja/function.array-column.php)で配列のtextを抽出。、[preg_grep](https://www.php.net/manual/ja/function.preg-grep.php)でパターンにマッチする配列の要素を返します。第一引数で検索するパターンを表す文字列を、第二引数で配列を入れます。

`/#今日の積み上げ+/`

ここで検索する文字列を指定しています。「+（＋プラス）」は、一回以上の[繰り返し](https://www.php.net/manual/ja/regexp.reference.repetition.php)を意味します。

```
   1 => """
     #今日の積み上げ 
      ✅筋トレ
      ✅ランニング
      ✅読書

　　　今日も1日頑張った！！
    """
```

これで`#今日の積み上げ`が含まれたツイートを取得できました。