PythonでTwitter API v2を叩いてツイートを取得する方法【サンプルコードあり】
目次
こんにちは。
Twitterでつぶやきたいけど、TL(タイムライン)を見て余計な俗な情報を脳にinputしたくないとき、ありますよね。
ということで、Pythonを使ってTwitterの画面を一切見ずにツイートしたり、自分のツイートを確認する方法を試してみました。
今回はTwitter APIの利用登録と、ツイートの取得方法をまとめていきます。
この方法だと、Twitterにアクセスすることなく、ツイートを確認できるようになります。
Twitter APIの利用登録
こちら(https://developer.twitter.com/en/apps)にアクセスし自分のTwitterアカウントでログインします。
Create an App
を押すと、Please apply for a Twitter developer account
とかいうダイアログが出てくるのでApply
を押します。
使用目的を聞かれるので、Hobbyist
のExploring API
にしました。
この後、いくつかApplicationの使用目的を問われるテキストボックスが出てきます。
設問が英語なので、回答も一応英語で書いてみました。設問は100~200文字程度で、多分何を書いても大丈夫だと思います。私はpythonでツイートを分析するとか、1日に数回自動でツイートしてユーザーに情報を知らせる、みたいなことを書きました。
あとは、アプリケーションの作成画面に入れますので、アプリケーション名など基本的な情報を入力して作成します。
Pythonのパッケージをインストールする
Pythonでツイートの読み込みと書き込みをしてみるために、サンプルコードを調べてみました。
こちらのQiita記事が出てきました。
とりあえず、上記の記事を参考に、必要なパッケージをインストールします。
$ pip install requests requests-oauthlib
Pythonで Twitter API v2を使ってみる。
記事で使用しているTwitter APIは古いv1.1対応だったので、v2に対応させてみます。
v2は2020年8月にリリースされたバージョンのようです。
v1.1が2012年にリリースされたそうなので、8年ぶりのアップデートだとか。
認証情報の設定
上の記事のサンプルコードにかかれているCustomer Keyというのは、今はAPI keyと呼ばれているようです。
そこで、config.py
の中身を以下のように名前を置き換えて使用してみました。
AK = config.API_KEY
AS = config.API_SECRET_KEY
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(AK, AS, AT, ATS)
必要なキーの情報はTwitter Developer PortalのアプリケーションのSettingsから確認・再発行できます。
エンドポイントURLの設定
エンドポイントのURLをv2のURLに変える必要があります。
MY_ID = config.TWITTER_ID
url = f"https://api.twitter.com/2/users/{MY_ID}/tweets"
v2ではTwitter IDが必要になります。
とりあえず複数のプログラムから参照できるように、自分のIDをconfig.py
に書いておきました。
# Twitter ID
TWITTER_ID = "1368027189870956548"
Twitter IDの調べ方。というかTwitter IDって何。
Twitter IDって何って感じですが、上記のような数字列で、@penguinchordのようなアカウント名とは異なるものです。
APIでユーザを特定するために使用されているようですね。
調べ方はTwitter Developerのドキュメントを見るとPostman使えって書いてありますが、面倒なのでブラウザから調べました。
自分のTwitterページにアクセスし、WebページのソースをブラウザF12
で開いてentities
で検索すると出てきます。
F12
はChromeやFireFoxで提供しているDeveloper Toolのショートカットです。
API v2でGETできるTweetsオブジェクトの構造
ツイートを取得するTweets
というAPIの基本的な使い方はこちら(DeveloperリファレンスのTimelines)から調べられます。
Tweets
は主にdata
とincludes
に分かれて入ってきます。
data
の中にツイートの情報が、includes
の中にユーザの情報が入っています。
Pythonで自分のツイートを取得してみる
上記のリファレンスを参考に、以下のパラメータを渡してGET
してみました。
params = {
'expansions' : 'author_id',
'tweet.fields': 'created_at,public_metrics',
'user.fields' : 'name',
'max_results' : 5,
}
res = twitter.get(url, params = params)
デフォルトでGetできるのはtext
(ツイート文章)くらいですが、パラメータでOptionをつけることができます。
expansions
を指定することで、user.fields
を連れてこれるようです。
tweets.fields
のcreated_at
で日付を、public_metrics
でリツイート数やいいねの数を取得できます。
user.fields
はincludes
に入ってきます。name
が表示される名前で、username
が@に続くアカウント名ですね。
max_results
で最大取得数を指定できます。
ここで注意ですが、created_at,public_metrics
のように複数渡す場合は、間にスペースを空けないようにします。スペースを空けたりリスト型で渡すと、一つのパラメータを重複して渡していると誤解され、エラーが返ってきます。
GETで取得したレスポンスの中身
さて、上記で取得したres.content
を表示すると、このような中身でした。
{'data': [{'text': 'tweet test from python',
'public_metrics': {'retweet_count': 0,
'reply_count': 0,
'like_count': 0,
'quote_count': 0},
'created_at': '2021-04-24T04:59:26.000Z',
'id': '1385820656713879553',
'author_id': '1368027189870956548'},
...
'includes': {'users': [{'id': '1368027189870956548',
'name': 'Penta@PenguinChord',
'username': 'penguinchord'}]},
'meta': {'oldest_id': '1368438406481543173',
'newest_id': '1385820656713879553',
'result_count': 3}}
まだ3件しかツイートしていないので、result_count
は3になってますね^^;
取得したツイートを表示してみる
以下のfor文で、上記のres
に取得したAPIのGETレスポンスの中身を表示させてみます。
表示させる内容は、ユーザ名と、ツイートした文章と、日付です。
tl = json.loads(res.text)
print(f"name : {tl['includes']['users'][0]['name']}")
print(f"user : {tl['includes']['users'][0]['username']}")
print('----------------------------')
for l in tl['data']:
print(l['text'])
print(l['created_at'])
print('----------------------------')
表示内容は以下のようになりました。
name : Penta@PenguinChord
user : penguinchord
----------------------------
tweet test from python
2021-04-24T04:59:26.000Z
----------------------------
BlogをVercelでデプロイ。
まだ99.8%チュートリアルのまま。
ここからいじっていくのが楽しい。頑張ります〜
2021-03-07T05:50:40.000Z
----------------------------
hello, world!
2021-03-07T05:48:35.000Z
----------------------------
良い感じです。
ツイートを取得するPythonサンプルコード
ここまでをまとめたサンプルコードです。
基本は参考記事のコードを拝借し、v2に対応させました。
import json, config
from requests_oauthlib import OAuth1Session
MY_ID = config.TWITTER_ID
AK = config.API_KEY
AS = config.API_SECRET_KEY
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(AK, AS, AT, ATS)
url = f"https://api.twitter.com/2/users/{MY_ID}/tweets"
params = {
'expansions' : 'author_id',
'tweet.fields': 'created_at,public_metrics',
'user.fields' : 'name',
'max_results' : 5,
}
res = twitter.get(url, params = params)
tl = json.loads(res.text)
if res.status_code == 200:
tl = json.loads(res.text)
print(f"name : {tl['includes']['users'][0]['name']}")
print(f"user : {tl['includes']['users'][0]['username']}")
print('----------------------------')
for l in tl['data']:
print(l['text'])
print(l['created_at'])
print('----------------------------')
else:
print("Failed: %d" % res.status_code)
自分以外のツイートを取得してみる
こちら(https://tweeterid.com/)にアカウント名(@に続く文字列)を入力すると、簡単にIDが調べられました。
試しにvercel
を入力すると、IDが4686835494
とわかります。
上のサンプルの{MY_ID}
をこのIDに書き換えると、無事にVercelのツイートが取得できました。
まとめ
というわけで、PythonでTwitter API v2を叩いてツイートを取得する方法をDeveloper登録の方法からまとめてみました。
上記のサンプルコードですぐお試し頂けます。
また、IDを変えれば自分でなくとも好きなアカウントのツイートが取得できました。
これでブラウザからTwitterにアクセスせずにツイートがチェックできますね。
ご参考に。^^