Twitter API v2 を使い php でツイート検索


# 追記

いいね数が 3 以上など、min_faves や min_retweets を使用した検索はできない。
(v1ならできるが、v2では無理)

いいね数やRT数を取得したい場合は、以下のようにする

```
$params = [
    "tweet.fields" => "author_id,created_at,public_metrics",//public_metrics をつける
];


```

ラーメンに関するユーザーを探したい時(v1に戻す)

```
//        $twi->setApiVersion("2");
$res = $twi->get("users/search", ["q" => "ラーメン"]);

```

# はじめに

twitter api v2 で ツイートを投稿するとうまくツイートできない。
よってツイートする場合は cowitter を使う。

検索するときは abraham/twitteroauthを使う。

参考
https://twitteroauth.com/
https://qiita.com/ichii731/items/40b8c837028e7cef13d4
https://labo.kon-ruri.co.jp/twitter-api-v2-search-tweets/


# 制限
1アプリあたり
450回/15分

# インスコ

```
composer require abraham/twitteroauth
```

```
use Abraham\TwitterOAuth\TwitterOAuth;

//中身
//v2ならベアラートークンを管理画面から取得できる
$bearer = 'AAAAAAAAAAAAAAAAAAAAAxxxxxxxI';

$twi = new TwitterOAuth(
    config('app.twitter_client_id'),//APIKEY
    config('app.twitter_client_secret'),//APISECRET
    null,
    $bearer
);

$twi->setApiVersion("2");

$query = "美味しい #ラーメン -is:retweet -has:mentions"; // RTを除外したい時

//or 句のときはそれぞれに -is:retweet とかをつける
//$query = '#ラーメン 美味しい -is:retweet -has:mentions OR #ラーメン グルメ -is:retweet -has:mentions';


$params = [
    /*
    ※queryとmax_resultは必須
    */
    "query" => $query,
    "start_time" => "2022-4-27T00:00:00+09:00",
    "end_time" => "2022-4-29T00:00:00+09:00",
    "tweet.fields" => "author_id,created_at", // 今回は追加で投稿日時を指定
    'expansions' => 'author_id',
    "user.fields" => "id,name,username,description,profile_image_url",//画像サイズは _normal を消せばオリジナルサイズになる
    "max_results" => 100 // 10～100の間を指定
];


$res = $twi->get("tweets/search/recent", $params);
print_r($res);


```

これで

・ツイート
・ツイートしたユーザーの情報

を取得できる
Twitterapps管理画面よりプロジェクトを作り、所属させないと以下のエラーが出る。

```
When authenticating requests to the Twitter API v2 endpoints, you must use keys and tokens from a Twitter developer App that is attached to a Project. You can create a project via the developer portal
```

また、
bird-elephant　ライブラリも使ってみたが、バグが有った。

# ユーザーIDを指定してユーザーの情報を取得

```

$bearer = 'your...';

//アプリ認証でやるので|ベアラートークンを入れる
$twi = new TwitterOAuth(
    config('app.twitter_client_id'),//APIKEY
    config('app.twitter_client_secret'),//APISECRET
    null,
    $bearer
);

$twi->setApiVersion("2");

$params = [
    "ids" => '125023968,234287107',//ユーザーIDを指定 100まで
    "tweet.fields" => "author_id,created_at", // 今回は追加で投稿日時を指定
    'expansions' => 'pinned_tweet_id',
    "user.fields" => "id,name,username,description,profile_image_url",//画像サイズは _normal を消せばオリジナルサイズになる
];

$tmp = $twi->get("users", $params);

```

# 結果

```

stdClass Object
(
    [data] => Array
        (
            [0] => stdClass Object
                (
                    [username] => ma7ma7pipipi
                    [description] => 超長期投資🎁飲食店株大好き🍖株主優待フェチ💓web会社経営💰早く結婚したい🤗彼女募集中DMお気軽に✨昭和の真剣佑と呼ばれたイケメン。億トレ。付き合ってくれたら株主優待あげます🎁
                    [name] => ⁂ コロまる ™ 🍼
                    [pinned_tweet_id] => 1373990537829568518
                    [id] => 125023968
                    [profile_image_url] => https://pbs.twimg.com/profile_images/378800000552767745/fb8f309e621d078cfe46250d73d38047_normal.png
                )

            [1] => stdClass Object
                (
                    [username] => hostsweetcom
                    [description] => 芸能界御用達！ダウンタウンDXで紹介。レンタル彼氏大好き春香クリスティーンさんを始め 32名を超える多くの有名女優が選ぶNo1レンタル彼氏、出張ホストサービスです。求人募集中です！副業歓迎しています。バックマージン0。
                    [name] => 業界No1👑レンタル彼氏出張ホストSWEET公式
                    [pinned_tweet_id] => 1120133908366970880
                    [id] => 234287107
                    [profile_image_url] => https://pbs.twimg.com/profile_images/1207336834/sweetlogo_normal.jpg
                )

        )

    [includes] => stdClass Object
        (
            [tweets] => Array
                (
                    [0] => stdClass Object
                        (
                            [created_at] => 2021-03-22T13:30:46.000Z
                            [id] => 1373990537829568518
                            [text] => 気軽に匿名質問して下さい https://t.co/peqsXryRUx #twi_ski #匿名質問
                            [author_id] => 125023968
                        )

                    [1] => stdClass Object
                        (
                            [created_at] => 2019-04-22T01:15:09.000Z
                            [id] => 1120133908366970880
                            [text] => 月収326万円も可能！
指名殺到中につき女性客様には
ご迷惑をおかけしております😊

さぁ今すぐレンタル彼氏を始めよう💕

🔰初心者大歓迎😉
レンタル彼氏求人募集いますぐ！
3分で登録できます。

https://t.co/HSwTwFY2V6
                            [author_id] => 234287107
                        )

                )

        )

)

```

# ユーザーに鍵かかっている場合

```


    [errors] => Array
        (
            [0] => stdClass Object
                (
                    [resource_id] => 1528635695270465536
                    [parameter] => pinned_tweet_id
                    [resource_type] => tweet
                    [section] => includes
                    [title] => Authorization Error
                    [value] => 1528635695270465536
                    [detail] => Sorry, you are not authorized to see the Tweet with pinned_tweet_id: [1528635695270465536].
                    [type] => https://api.twitter.com/2/problems/not-authorized-for-resource
                )

        )

)

```


# ツイート取得

```

$params = [
    "ids" => '1,2,999,1373990537829568518',//100まで（非公開になったらどうなるのか）
    "tweet.fields" => "author_id,created_at", // 今回は追加で投稿日時を指定
    'expansions' => 'author_id',
    "user.fields" => "id,name,username,description,profile_image_url",//画像サイズは _normal を消せばオリジナルサイズになる
];

$tmp = $twi->get("tweets", $params);


```

# 非公開、もしくはツイートが無い場合

```


    [errors] => Array
        (
            [0] => stdClass Object
                (
                    [value] => 1
                    [detail] => Could not find tweet with ids: [1].
                    [title] => Not Found Error
                    [resource_type] => tweet
                    [parameter] => ids
                    [resource_id] => 1
                    [type] => https://api.twitter.com/2/problems/resource-not-found
                )

            [1] => stdClass Object
                (
                    [resource_id] => 1528635695270465536
                    [parameter] => ids
                    [resource_type] => tweet
                    [section] => data
                    [title] => Authorization Error
                    [value] => 1528635695270465536
                    [detail] => Sorry, you are not authorized to see the Tweet with ids: [1528635695270465536].
                    [type] => https://api.twitter.com/2/problems/not-authorized-for-resource
                )

```

# フォロワー数やツイート数も同時に取得したい

user.fields に public_metricsを指定すればOK。
ツイート自体にデータがついてくるのではなく、配列の最後らへんにくっつくので
忘れずチェック。

```

        $params = [
            /*
                ※queryとmax_resultは必須
            */

            "query" => $query, // RTを除外したい時
//            "start_time" => "2022-4-27T00:00:00+09:00",
//            "end_time" => "2022-4-29T00:00:00+09:00",
            "tweet.fields" => "author_id,created_at", // 今回は追加で投稿日時を指定
            'expansions' => 'author_id',
            "user.fields" => "id,public_metrics,name,username,description,profile_image_url",//画像サイズは _normal を消せばオリジナルサイズになる
            "max_results" => 100 // 10～100の間を指定
        ];

        $tmp = $twi->get("tweets/search/recent", $params);

```


#添付ファイル、画像も取得

```
        $params = [
            "ids" => join(",",$tweet_ids),//100まで
            "tweet.fields" => "author_id,created_at", // 今回は追加で投稿日時を指定
            'expansions' => 'author_id,attachments.media_keys',//画像を取得する場合は attachments.media_keys が必須
            'media.fields' => 'url,type',
            "user.fields" => "id,name,username,description,profile_image_url",//画像サイズは _normal を消せばオリジナルサイズになる
        ];

        $tmp = $twi->get("tweets", $params);
```

# フォロワーを取得

https://developer.twitter.com/en/docs/twitter-api/users/follows/api-reference/post-users-source_user_id-following

`GET /2/users/:id/followers` ってのは

```
$res = $twi->get("users/125023968/followers");
pr($res);
```

で取得する。



# リストに追加

ユーザーをリストに追加したい。
リストを非表示にしておくと、相手に登録した旨通知されない。

```
        $twi = new TwitterOAuth(
            config('app.twitter_client_id'),//APIKEY
            config('app.twitter_client_secret'),//APISECRET
            config('app.twitter_account_token'),//ユーザーのトークン
            config('app.twitter_account_token_secret')//ユーザーのシークレットトークン
        );


//        指定ユーザーのリストを取得（リストIDを取得する）
        $list_ids = $twi->get("lists/list", [
            "screen_name" => "twikon_club"
        ]);


        //上記リストにユーザーを追加する 1612264628268204043
        //これでリスト追加OK
        $member_tmp = $twi->post("lists/members/create", [
//            "list_id" => "1612264628268204043",
            "slug" => " 1612264628268204043",//オーナーのユーザーID
            "owner_screen_name" => "twikon_club",//オーナーのスクリーンネーム
//            "user_id" => "125023968"//登録したいユーザーのユーザーID
        "user_id" => 268141077
        ]);
```