Twitter API v2
前回、Twitter Developer PortalでTwitter API v2を使えるようにしてみました。
今回はAPIに接続して、ユーザーID、タイムライン、ツイートを取得してみましょう。
ちなみにAPIの使用にはPythonのTwitter制御ライブラリである「Tweepy」を使っていきます。
使用できるコマンド一覧(Endpointとの一覧)はこちらをご覧ください。
またそれぞれのコマンドには一定時間内に使用できる回数が制限されています。
どのコマンドがどれだけ使えるはこちらのページをご覧ください。
それでは始めていきましょう。
Tweepyを使ったTwitter API v2への接続
まずは接続方法からです。
前回、Twitter Developer Portalで5種類のTokenを取得しました。
- API Key
- API Key Secret
- Bearer Token
- Access Token
- Access Token Secret
Twitter API v2のみに接続する場合、必要なのは「Bearer Token」だけです。
「API Key」、「API Secret」、「Access Token」、「Access Token Secret」はTwitter API v1.1に接続する際に用います。
しかしコマンド(Endpoint)によってはv1.1でしか動作しないものもありますので、明確にv2のコマンドしか使わないと言う時以外は全てのTokenを使って接続するのが良いようです。
tweepyを使ってTwitter API v2+v1.1に接続するにこのようなプログラムになります。
import tweepy
BT = "Your bearer token"
CK = "Your API key"
CS = "Your API secret"
AT = "Your Access token"
ATS = "Your access token secret"
client = tweepy.Client(bearer_token=BT, consumer_key = CK, consumer_secret=CS, access_token=AT, access_token_secret=ATS)
もしTwitter API v2しか使わない場合は必要なのはBearer tokenだけなのでこうなります。
import tweepy
BT = "Your bearer token"
client = tweepy.Client(bearer_token=BT)
ユーザーIDの取得
Twitter API v2ではユーザー名よりもユーザーIDの方が使いやすそうです。
ちなみに私のアカウントの場合、「@3PySci_Nori」はユーザー名になります。
ユーザーIDは「1364192130936107008」です。
このユーザーIDはなかなか目にすることがないので、APIを使って取得してみましょう。
ユーザーIDを取得するには「.get_user(username=’ユーザー名’)」を使います。
user = client.get_user(username=account)
print(user)
実行結果
Response(data=<User id=1364192130936107008 name=のり@3PySci Python&NoCode&Arduino勉強中👍
username=3PySci_Nori>, includes={}, errors=[], meta={})
このコマンドで取得できたものは「ユーザーID」、「表示名」、「ユーザー名」が取得できています。
この中から「ユーザーID」を取得するにはタプルの中に辞書(?)として入っているのでこんな感じで取得することができます。
print(user.data.id)
print(user.data['id'])
print(user[0].id)
print(user[0]['id'])
実行結果
1364192130936107008
1364192130936107008
1364192130936107008
1364192130936107008
使用可能回数は900回 /15分です。
今回はまずはTwitter API v2に慣れるのを優先して「.get_user()」に関してはここまで。
また今度詳しくみていきましょう。
自分のタイムラインを取得
次に自分のタイムラインを取得してみましょう。
タイムラインを取得するには「.get_home_timeline()」を用いますが、これは現状Twitter API v1.1で動いているようです。
そのため「.get_home_timeline()」を使う際はv1.1でも接続しておいてください。
timeline = client.get_home_timeline()
print(timeline)
実行結果
Response(data=[<Tweet id=1544655684729544708 text='球宴初選出の日本ハム野村、ヤクルト村上に〝弟子入り〟
熱望「4番としての心構えを」(サンケイスポーツ) https://t.co/5brYyVZPAP'>, <Tweet id=1544655684511596544
text='RT @chan1606: ぉはょー☀️\n今日の暑さゃばそぅ。\nぅちのモコゎクーラーの中で涼しんでぉります🤣笑 #暑い
#熱中症気をつけて\n今日から⑦月🌠今月もょろしくです❤️\n#いいね #相互フォロー #拡散
#RT\n#フォローしてくれると嬉しいな\n#仲良くしてね https…'>,
(中略)
<Tweet id=1544655604798484481 text='RT @nauru_japan: また、下記でもチャリティグッズの販売を開始いたします。
皆様のご協力をよろしくお願い申し上げます。\n\nhttps://t.co/GtdqEDKGNu\n\n(つづく)'>, <Tweet id=154465560
2953363456 text='RT @navyblueaoao46: 「ウルトラ音楽術」は長持ちする内容となっておりますので、
いつでもお手すきのときに❗️😊✨'>], includes={}, errors=[],
meta={'next_token': '7140dibdnow9c7btw4228egiptzawnr1qjzxm6utj7gae',
'result_count': 65, 'newest_id': '1544655684729544708', 'oldest_id': '1544655602953363456'})
各ツイートはdataの中にリストとして入っているので、for文で一つずつ取り出せます。
for tw in timeline.data:
print(tw)
実行結果
RT @umagon751: 【🎁第363回毎日プレゼント企画🎁】
🎁iTunes、PayPay、Amazonの中から1000円🎁
◆応募方法◆
・ウマゴンをフォロー
・このツイートをリツイート
⚠️締切 7月6日23時59分
(以下略)
やってみるとたくさんのツイートを取得できているように見えますが、このままでは最大で100ツイートしか取得できません。
しかしこのコマンドは最大で3200ツイート取得することができます。
実はTwitter API v2では「ページ」という概念があり、先ほど取得したのは1ページ目の結果だったのです。
そしてさらに2ページ目、3ページ目の結果を取得していくことでさらに多くのツイートを取得できるという仕組みです。
この仕組みを「ページネーション」というようです。
次のページを取得するには「pagination token」が必要になります。
先ほど「.get_home_timeline()」を実行した結果の最後の方に「next_token」というのがあるのが分かるでしょうか。
再度、「.get_home_timeline()」を実行する際にこの「next token」を使用することで次のページの結果を取得することができます。
ちなみに「timeline.meta[‘next_token’]」でnext tokenを取得できます。
timeline2 = client.get_home_timeline(pagination_token=timeline.meta['next_token'])
print(timeline2)
実行結果
Response(data=[<Tweet id=1545026592119742465 text='RT @ROOMMATE_Ryoko: #ルリルリ
\n#ホシノルリ誕生祭\n\n本日7月7日は、ホシノルリちゃんの誕生日!!!!!\nそんなわけでルリルリのキャラケーキを
作りました!\n(少しケーキ自体が雑ですが💦)\n\nハァハァよく出来たねルリ偉いよルリ可愛いよルリばんざーいばんざーい…'>,
(中略)
<Tweet id=1545026491331006464 text='RT @calpis_mizutama: #七夕 で103周年を迎える #カルピス の\n#7月7日
はカルピスの日大賞\n投票キャンペーン実施中🎉\n\n1⃣ @calpis_mizutama をフォロー\n2⃣推しの作品に投票\n3⃣投票結果を
ツイート\n\nあなたの1票で大賞が決まる!\n投…'>], includes={}, errors=[], meta={'previous_token':
'77qpymm88g5h9vqklurdow1sr26cajsrbimvif0dz7705', 'next_token': '7140dibdnow9c7btw4228gjg021bd4635y
ttgtahsdtf8', 'result_count': 100, 'newest_id': '1545026592119742465', 'oldest_id': '1545026491331
006464'})
ただしこのようにして毎回、next tokenを取得して、それを使って再度実行するというのは繰り返し作業なので、プログラムに落とし込みましょう。
繰り返しというとfor文を使いたくなりますが、今回の場合はnext tokenがなくなるまで何回実行しなければいけないのか分かりませんので、while文を使う方が良さそうです。
ということでこんな感じ。
tweet = []; pagination_token = None
while len(tweet) < 150:
timeline = client.get_home_timeline(pagination_token=pagination_token)
for tw in timeline[0]:
tweet.append(tw)
print(tw)
pagination_token = timeline.meta['next_token']
実行結果
RT @BREEZE_FO: /
#DODとBREEZE 初コラボ記念🐰
プレゼントキャンペーン🎉
\
『オトナ用コラボTシャツ&オトナ用コラボICE RING』を抽選で5名様にプレゼント!
(以下略)
今はAPIの使用回数を無闇に増やしたくないので、「while len(tweet) < 150:」として取得ツイート数が150を超えたら終了するようにしています。
API使用制限回数まで、もしくは取得できるツイートを全て取得したいという場合は「while True:」とすれば上限いっぱいまで取得できます。
使用可能回数は180回 /15分です。
特定のユーザーのツイートの取得
次に特定のユーザーのツイートの取得です。
ツイートを取得するには「.get_users_tweets(id=ユーザーID)」とします。
usertweet = client.get_users_tweets(id=1364192130936107008)
print(usertweet)
実行結果
Response(data=[<Tweet id=1544607253797384192 text='【バックナンバー】 Pythonで温度・湿度ロガー
IBS-TH1 PLUSのデータを分析してみる その6:グラフの表示 https://t.co/0OHnS2daJw #python #ツール作成
#プログラミング'>,
(中略)
Pythonで複数のグラフを一括表示 #Matplotlib その7:subplots、subplotでのX軸名、Y軸名の表示: xlabel、
set_xlabel、ylabel、set_ylabel https://t.co/WKHirHAn3j #python #プログラミング'>], includes={},
errors=[], meta={'next_token': '7140dibdnow9c7btw4228eeproeey4t4l3w7cyx98jfaw', 'result_count':
10, 'newest_id': '1544607253797384192', 'oldest_id': '1544004091504119808'})
こちらも「next token」がありますので、もっとツイートを取得したい場合は先ほどページネーションにより取得可能です。
使用可能回数は900回/15分です。
とりあえず今回ははTwitter API v2に慣れるということで、今回は詳細までは立ち入っていません。
また必要に応じてそれぞれの紹介をしていきたいと思います。
次回はフォロー、フォロワーのリストの取得の仕方を学びましょう。
ではでは今回はこんな感じで。
コメント