PythonでTwitter API v2を使ってみよう。ツイートを探す編

こんにちは。:relaxed:だよ。
夏も終わるねー。朝晩が涼しくて、気持ちがいいよね。

さてさて今日は新しくなった（らしい）TwitterAPIのSearchを使ってみるよ。

## TwitterAPI v2で変わったことは？

>[TwitterAPIv２の新機能](https://developer.twitter.com/en/docs/twitter-api/early-access)

詳しくは公式を読んでね。　:relaxed: がおっと思ったところだけ載せると・・

1. v1では、スタンダード・プレミアム・エンタープライズの３つのプランごと、別々のAPIが提供されていた。
→v2では１つのAPIに対して、Basic・Elevate・Customのアクセスレベルを設定するようになった。
プランの切り替え時にAPIの変更が不要になり、移行が容易に！


2. デフォルトのレスポンスはコンパクトになり、必要なデータフィールドをAPIのparameterで指定することで、必要な情報だけを取得できるようになった。
しかも、取得できるデータフィールドもより詳細になったらしい！以前よりもデータの活用度が上がりそうだね！
実際のフィールドは、お試ししながら説明するよ。

3. レスポンスとしてconversation_idを取得できるように！
誰かの呟きに対して、返信、それのまた返信、など会話が続いた場合に、一致するIDを持っているため、会話の流れを追いやすくなったみたいだよ！

間違っていたらごめんね。


## 実際に使ってみよう.
<dl>
  <dt>環境:</dt>
  <dd> Python3.8.5 </dd>
  <dt>使用したライブラリ：</dt>
  <dd> urllib3 </dd>
  <dd> json </dd>  
</dl>
 *python-dotenvでTwitterAPIに必要なTokenを管理しているよ。
PGMでimportしているsettingファイルでシステム環境変数→keyとして設定しているよ。

<dl>
  <dt>前準備：</dt>
  <dd> Twitter API 利用申請</dd>
  <dd>Twitter APIを使うためには、利用申請が必要なんだけれど、こちらはいろいろわかりやすい記事が多いので、今回は割愛するよ。</dd>
</dl>


今回、認証はOAuth 2.0 Bearer tokenを使って行うよ。
このKeyはTwitterのDeveloperPortalにログインし、
「Project」→「今回使用するプロジェクト」→「Keys and tokens」の画面から、発行ができるよ。
 



###API：Tweet lookup
Tweetごとの固有Idを指定して探す方法だよ。

```
https://api.twitter.com/2/tweets/ + XXXXXX
```

XXXXはWeb画面でツイートを開いた時のURLの最後の部分（多分数字）が入るよ。
pythonではこんなコードを書いたよ。
1.デフォルトの項目だけ取得する場合。
２.項目を選択して取得する場合　の２パターンを試してみるよ。

```python:getTweetById

import urllib3
import setting #Key項目を設定しているファイルだよ。別で管理していない人は、KEY=直書きしてね。
import json

http = urllib3.PoolManager()
KEY  = setting.TWITTER_BEARER_TOKEN ## DeveloperPortalで取得したBearer Token。お試し時は、直書きでもOK。


def getTweetById(http, key, searchId, searchFeild={}):
    url  = 'https://api.twitter.com/2/tweets/' + searchId
    req = http.request('GET',
                        url,
                        headers= {'Authorization': 'Bearer '+key},
                        fields = searchFeild
                      )

    result = json.loads(req.data)
    if (req.status == 200):
        print(result)
    else:
        print(req.status)
        print(result['errors'])




#1. デフォルトの項目を取ってくる場合
getTweetById(http,KEY, "XX-TweetID-XX")


#2. 項目を選んで取ってくる場合
params = {"expansions"   :'author_id,attachments.media_keys',
          'media.fields' : 'preview_image_url,type',
          'place.fields' : 'country,country_code',
          'tweet.fields' : 'created_at,lang',
          'user.fields'  : 'created_at,description,id,name'
          }


getTweetById(http,KEY, "XX-TweetID-XX",params)

```

####１.デフォルトの項目を取ってくる場合で試してみよう。
![スクリーンショット 2020-09-07 8.52.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/597c80c6-9a48-ff42-96cc-7a88148b9bbb.png)

実行すると・・

![スクリーンショット 2020-09-07 9.18.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/9db3a88a-69f7-89dd-62c6-2faa496df357.png)


こんな感じ。

####2. 項目を選んで取ってくる場合を試してみよう。
![スクリーンショット 2020-09-07 9.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/4c8fa52a-f7df-9cbe-e7b7-d8abd9b80eff.png)

なるほど、さっきよりいろいろな情報がとってきているね。
でも、よーくみると、指定したのに入っていないフィールドもあるね。

####唐突にフィールドのお勉強
>[TwitterAPI Fieldsについて](https://developer.twitter.com/en/docs/twitter-api/fields)

フィールドは５つあって、

|戻り値| フィールド名 | 内容 |
|:-----------|------------|:------------|
| Tweet| tweet.fields| ツイート本体に関する情報         |
| User | user.fields　| ツイートしたユーザーに関する情報       |
| Media| media.fields|ツイートに添付されたファイルの情報。添付あった場合のみ表示される。         |
| Poll　| poll.fields          | 投票形式のツイートに関する情報。投票の場合のみ表示される。|
| Place　| place.fields       | Tweetした場所に関する情報。ロケーション情報が含まれている場合のみ表示される。       |



となっているよ。
今回はただのテキストなので、TweetとUserの情報しかとってこなかったんだね。

上記を踏まえて、画像付きのURLを２のパターンで取得するとどうなるかな？
![スクリーンショット 2020-09-07 9.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/7bed3173-9636-4017-49b4-e707fb40fc81.png)



![スクリーンショット 2020-09-07 9.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/c63f4ea0-890d-de6c-baad-de3a225f1358.png)
おお、メディア情報が含まれるようになったね。

###API:Tweet recent search
Tweetの内容で探す方法だよ。

```
https://api.twitter.com/2/tweets/search/recent
```

searchの名前の通り、Tweetの内容や誰が書いたかで検索してデータをとってくることができるよ。
過去７日間のデータが対象だよ。


pythonではこんなコードを書いたよ。
paramsによって１〜５の内容を調べられるよ。
1.Tweetの内容で検索をしてみよう
2.Tweetをした人で検索してみよう
3.AND条件で検索してみよう
4.OR条件で検索してみよう
5.もっと詳細も調べてみよう

```python:getTweetByText

import urllib3
import setting　#別で管理していない人は、KEY=直書きしてね。
import json

http = urllib3.PoolManager()
KEY  = setting.TWITTER_BEARER_TOKEN ## DeveloperPortalで取得したBearer Token。お試し時は直書きでもOK。

def getTweetByText(http,key,searchFeild):
    url  = 'https://api.twitter.com/2/tweets/search/recent'


    req = http.request('GET',
                        url,
                        headers= {'Authorization': 'Bearer '+key},
                        fields = searchFeild
                      )


    result = json.loads(req.data)
    if (req.status == 200):
        if ('meta' in result):
          print('検索結果は' + str(result['meta']['result_count']) + '件でした')

        if ('data' in result):
          for tweet in result['data']:
            print(tweet)
    else:
        print(req.status)
        print(result['errors'])

#1.Tweetの内容で検索をしてみよう。
params1 = {'query'       : 'ねこ'}
#2.Tweetをした人で検索してみよう。
params2 = {'query'       : 'from:tokyo_bousai'}
#3.AND条件で検索してみよう
params3 = {'query'       : 'from:tokyo_bousai #防災の日'}
#4.OR条件で検索してみよう
params4 = {'query'       : 'from:tokyo_bousai OR from:KanagawaPref_PR'}
#5.もっと詳細も調べてみよう
params5 = {
          'query'        : 'from:tokyo_bousai',
          'max_results'  : 100,
          'expansions'   : 'author_id,attachments.media_keys',
          'media.fields' : 'preview_image_url,type',
          'place.fields' : 'country,country_code',
          'tweet.fields' : 'created_at,lang',
          'user.fields'  : 'created_at,description,id,name'
          }

getTweetByText(http, KEY, XX-調べたいparams-XX)
```

実行結果をかくと長くなるので、実際は動かしてみて欲しいな:relaxed:

簡単に解説すると、検索の条件をqueryに書くよ。

・このワードに引っかかるツイートを検索したい！　→ １
・この人のTweetを検索したい! →２　fromの後ろは「＠XXXX」のXXXか、userIDが使えるよ。
・AND条件→3 条件同士の間をスペースで繋ぐよ。
・OR条件→4 条件同士をORで繋ぐよ。

５のように、ID検索で使ったFiled選択も使えるし、デフォルトの取得件数は１０件なので、
'max_results'  : XXX(~100)でもっと多くのデータを取得したい時もOKだよ。

もちろんもっと複雑な検索もできて、それは公式のここを参考にするとわかりやすいよ。
>[API: recent searchのqueryの作り方](https://developer.twitter.com/en/docs/twitter-api/tweets/search/integrate/build-a-rule)



##まとめ
v1を使ったことがないので、比較がうまくできないけれど、簡単にTweetを取得できたよ。
また今回は手っ取り早く、OAuth 2.0 Bearer token方式で認証をしたけれど、分析などに使用されるメトリック（という言い方であっているのかな？）を取得するにはOAuth １.0方式でuserAccessTokenを渡す必要があるみたいだよ。

実はTweetを取得してそれを分析に使いたくてここまで準備を進めてきたので、次回はそっちの話ができると良いな。

##すごくありがとう :relaxed:
>[TwitterDeveloper](https://developer.twitter.com/en)