Twitter API v2(Python)で色々試してみよう

今回は2020/08にリリースされた[Twitter API v2: Early Access](https://developer.twitter.com/en/docs/twitter-api/early-access)の実装をPythonで試してみました。
※本記事についてTwitterAPIの申請およびBearerTokenの取得方法については多数の先達者様の記事がありますので割愛します。

## 今回参考にしたドキュメントはこちら

[TwitterAPI v2公式ドキュメント(英語)](https://developer.twitter.com/en/docs/twitter-api/early-access)
[TwitterAPI v2公式APIリファレンス(英語)](https://developer.twitter.com/en/docs/twitter-api/api-reference-index)
[PythonでTwitter API v2を使ってみよう。ツイートを探す編](https://qiita.com/akky-tys/items/4a1b6a11acb1fe226361)

そして親愛なるやよい軒（公式）([@yayoiken_com](https://twitter.com/yayoiken_com))様

## 今回実装したサンプルは以下の内容
1. 単一ツイートをIDより取得する。
2. 直近一週間以内のツイートに対してキーワード検索をかけて取得する。
3. 指定したユーザの直近10件分のツイート/メンションを取得する。
4. 指定したユーザのフォロー/フォロワーユーザを取得する。

## ベースとなるサンプルコードはこちら
こちらの関数をベースにTwitterAPIv2を呼び出していきます。
※今回紹介するAPIは下記コード中の関数(call_api)に引数を変更するだけで呼び出せるようにしております。

コード中にあるBEARER_TOKENには[DeveloperPortal](https://developer.twitter.com/en/portal/dashboard)で取得したBearerTokenを入力してください。

```python:call_api.py
import urllib3
import json

http = urllib3.PoolManager()
# Developer Portalで取得した固有のBearer Token
# URL: https://developer.twitter.com/en/portal/dashboard
BEARER_TOKEN = r'(ここにBearerTokenを記述する)'

def call_api(url: str) -> dict:
    """TwitterAPIv2を実行する
    :param url              :   エンドポイントURL
    :return                 :   レスポンス内容
    """
    headers = {'Authorization': 'Bearer ' + BEARER_TOKEN}
    res = http.request(method='GET',
                       url=url,
                       headers=headers)
    if res.status != 200:
        raise urllib3.exceptions.HTTPError(res.status)
    return json.loads(res.data)
```

## 各APIの呼び出し方法
上記関数の呼び出し方は下記の通りとなります。
各APIの実行結果についてはセンシティブな内容が含まれるため割愛させていただきます。

### 単一ツイートの取得
試しにやよい軒（公式）様の[このツイート](https://twitter.com/yayoiken_com/status/1357101560531021825)を取得したいと思います。

```python
# 単一ツイートをtweet_idより取得する
# tweet_idには取得対象となるツイートのIDを指定(URL末尾に記載されているもの)
get_tweet_url = r'https://api.twitter.com/2/tweets/{tweet_id}'.format(tweet_id='1357101560531021825')
result = call_api(url=get_tweet_url)
print(result)
```


### キーワード検索
やよい軒についてキーワード検索をかけます。
やはり日本国民はやよい軒が大好きなのだとわかります。

```python
# 直近一週間以内のツイートに対してキーワード検索をかけて取得する
# queryには検索対象キーワードを指定する(Standardアカウントでは直近一週間分のtweetしか検索できないとのこと)
search_url = r'https://api.twitter.com/2/tweets/search/recent?query={query}'.format(query='やよい軒')
result = call_api(url=search_url)
print(result)
```

### 指定したユーザのツイート/メンションを取得する
user_nameから直接当該APIを実行できないため、初めにuser_nameからuser_idを取得するAPIを実行する必要があります。


```python
# 指定したユーザの直近10件分のツイートを取得する
# user_nameから直接ツイートを検索できないため、初めにuser_nameからuser_idを取得する
# user_nameには取得対象となるユーザ名を指定する(やよい軒の場合はyayoiken_com)
get_user_id_url = r'https://api.twitter.com/2/users/by/username/{user_name}'.format(user_name='yayoiken_com')
user_id = call_api(url=get_user_id_url).get('data').get('id')
# user_idからツイートを検索する
get_user_tweets_url = r'https://api.twitter.com/2/users/{id}/tweets'.format(id=user_id)
result = call_api(url=get_user_tweets_url)
print(result)

# 指定したユーザに対しての直近10件分のメンションを取得する(URL以外は上記と同じ手順のためコメントは割愛)
get_user_mentions_url = r'https://api.twitter.com/2/users/{id}/mentions'.format(id=user_id)
result = call_api(url=get_user_mentions_url)
print(result)
```
### 指定したユーザのフォロー/フォロワーユーザを取得する

先ほどと同様にuser_nameから直接当該APIを実行できないため、初めにuser_nameからuser_idを取得するAPIを実行する必要があります。

```python
# 指定したユーザのフォローユーザを取得する
# user_nameから直接ツイートを検索できないため、初めにuser_nameからuser_idを取得する
# user_nameには取得対象となるユーザ名を指定する(やよい軒の場合はyayoiken_com)
get_user_id_url = r'https://api.twitter.com/2/users/by/username/{user_name}'.format(user_name='yayoiken_com')
user_id = call_api(url=get_user_id_url).get('data').get('id')
# user_idからフォローユーザを検索する
get_user_following_url = r'https://api.twitter.com/2/users/{id}/following'.format(id=user_id)
result = call_api(url=get_user_following_url)
print(result)

# 特定のユーザのフォロワーユーザを取得する(URL以外は上記と同じ手順のためコメントは割愛)
get_user_followers_url = r'https://api.twitter.com/2/users/{id}/followers'.format(id=user_id)
result = call_api(url=get_user_followers_url)
print(result)
```