【2022年 Twitter API】v2のBearer Tokenでツイートを収集するシンプルなスクリプト



Twitter API v2を利用してツイートを収集したい方向けに､
とりあえずサクッと試せるシンプルなコードを紹介します｡

Twitter APIの種類についてはこちらの記事をご参照ください｡

https://qiita.com/mochi_gu_ma/items/d9237ab75262b1015b48

# この記事の想定読者
- Twitter API(v2)を利用したツイート収集を試してみたい
- Pythonユーザー



# 筆者の環境
```python:
import platform
print(platform.platform())
# macOS-12.2.1-x86_64-i386-64bit
print(platform.python_version())
# 3.10.2
```
Visual Studio Codeのインタラクティブウインドウを利用しています｡


# 結論: 今回のコード全文
まず今回使うコードの全文を記載します｡[^1]
[^1]:検索クエリが"ゴールデンカムイ"なのは筆者の趣味です｡

詳細はこの後説明します｡


```python:simple_get_tweets.py
import json
from typing import NamedTuple

import urllib3

URL = 'https://api.twitter.com/2/tweets/search/recent'
KEY = 'AAAAAAAAAAAAAAAAAAAAA***'
# ご自分のBEARER TOKENを入力してください

class RequestItems(NamedTuple):
    http: urllib3.PoolManager
    key: str
    params: dict


def request_tweets(ritems: RequestItems):
    headers = {'Authorization': 'Bearer '+ ritems.key}
    return ritems.http.request('GET', URL, fields=ritems.params, headers=headers)


def simple_get_tweets(ritems: RequestItems):
    res = request_tweets(ritems)
    return res


http = urllib3.PoolManager()

params = {
        'query':'ゴールデンカムイ -is:retweet',
        'max_results':10,
        }

ritems = RequestItems(http, KEY, params)

res = simple_get_tweets(ritems)

print(res.status)
# 200
print(res.reason)
# OK
print(res.headers)
# HTTPHeaderDict({'date': 'Sun, 24 Apr 2022 …(略)})
print(json.loads(res.data))
# id等は適当に＊＊＊でマスキングしてます
# {'data': [{'id': '151817293***', 'text': 'ゴールデンカムイでなんか胸毛をむしるらしいから読んでみたいんですよ！！！！！！！！！'}, {'id': …(略)}],
# 'meta': {'newest_id': '15181729311***', 'oldest_id': '151817270348811***', 'result_count': 10, 'next_token': 'b26v89c19zqg8o3fpy***'}}
```

# 前準備
## Twitter APIのBEARER TOKENを取得する
まだTwitter API v2の利用をしたことがない方は､以下のページが参考になると思います｡

- [Twitter API v2 の Essential Access ができた手順メモ](https://www.1ft-seabass.jp/memo/2022/02/16/twitter-essential-access/#:~:text=%E3%82%B5%E3%83%96%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E6%96%B9%E3%81%A7%20Essential%20Access%20%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%9D%E3%81%86%E3%81%AA%E3%81%AE%E3%81%A7%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)

## urllib3のインストール
`urllib3`というライブラリをpip等でインストールしてください｡

# コードの実行
## 関数定義パート
引数を`request_tweets()`に渡しやすいようにネームドタプルを使っています｡

```python:simple_get_tweets.py
import json
from typing import NamedTuple

import urllib3

URL = 'https://api.twitter.com/2/tweets/search/recent'
KEY = 'AAAAAAAAAAAAAAAAAAAAA***'
# ご自分のBEARER TOKENを入力してください

class RequestItems(NamedTuple):
    http: urllib3.PoolManager
    key: str
    params: dict


def request_tweets(ritems: RequestItems):
    headers = {'Authorization': 'Bearer '+ ritems.key}
    return ritems.http.request('GET', URL, fields=ritems.params, headers=headers)


def simple_get_tweets(ritems: RequestItems):
    res = request_tweets(ritems)
    return res

```
## 実行パート
ツイート検索(収集)用のパラメータを適当にセットして実行します｡
`-is:retweet`で単純なリツイートのツイートを除外しています｡

Jupyterなどの対話的環境であれば､
`res`の中身をいろいろと観察してみると面白いかもしれません｡

statusが200の場合は成功ですが､それ以外の場合はツイート取得に失敗しています｡
失敗した理由を調べるには､`res.reason`などが参考になります｡

ツイートのデータ本体は`res.data`の中にあります｡
日本語で読みたい場合には`json.loads(res.data)`を使うとよいでしょう｡


```python:simple_get_tweets.py

http = urllib3.PoolManager()

params = {
        'query':'ゴールデンカムイ -is:retweet',
        'max_results':10,
        }

ritems = RequestItems(http, KEY, params)

res = simple_get_tweets(ritems)

print(res.status)
# 200
print(res.reason)
# OK
print(res.headers)
# HTTPHeaderDict({'date': 'Sun, 24 Apr 2022 …(略)})
print(json.loads(res.data))
# id等は適当に＊＊＊でマスキングしてます
# {'data': [{'id': '151817293***', 'text': 'ゴールデンカムイでなんか胸毛をむしるらしいから読んでみたいんですよ！！！！！！！！！'}, {'id': …(略)}],
# 'meta': {'newest_id': '15181729311***', 'oldest_id': '151817270348811***', 'result_count': 10, 'next_token': 'b26v89c19zqg8o3fpy***'}}
```

# まとめ
- Twitter API v2でBEARER TOKENを使ったツイート収集ができた！

# 今後の展開
この記事ではツイート収集のシンプルなやり方について説明しました｡

次回以降(の記事を書くことがあれば)､この関数を利用して､
より多くのツイートを収集するコードを紹介します｡[^2]
[^2]:次回以降の記事を書かないかもしれません｡筆者のやる気によります｡

`next_token`をうまく利用することが鍵になります｡