Tweepy Documentation — tweepy 4.6.0 documentation
日本語ドキュメントが第三者による v3.6 の翻訳しかないためか、Twitter API v2 の利用例があまり見当たらなかったので書いてみる。
主に v2 で変更となったユーザー情報、ツイート情報の取得で使うクラスやメソッドについて。
class tweepy.Client
tweepy.Client — Twitter API v2 Reference — tweepy 4.6.0 documentation
Twitter API v2 を利用する場合は、tweepy.Client
クラスを利用する。もう一つ、tweepy.streamingClient
というクラスもあって、タイムラインなど流せるようだが、こちらは私は使ったことがない。
まずはインスタンス化。別途、api_key.py にアクセストークンなどを設定した例。もちろん、直接トークンを引数として渡してもいい。
from api_key import *
import tweepy
client = tweepy.Client(
bearer_token = BEARER_TOKEN,
consumer_key = CONSUMER_KEY,
consumer_secret = CONSUMER_SECRET,
access_token = ACCES_TOKEN,
access_token_secret = ACCES_TOKEN_SECRET)
設定したトークン保持者の Twitter ユーザー情報は、Client.get_me メソッドで取得できる。
>>> client.get_me()
Response(data=<User id=52938278 name=アキヤ username=K_akiya>, includes={}, errors=[], meta={})
戻り値は、基本的にレスポンスオブジェクトである。
この記事ではこの先、
id = client.get_me().data.id
と定義したものとして、引数の id は自身のユーザー ID として説明を続ける。
class tweepy.Paginator
Pagination — tweepy 4.6.0 documentation
問い合わせ結果が膨大な場合、Twitter API は1回で全データを返さない。レスポンスに 'next_token':
'previous_token':
が含まれるので、このトークンでページ送りをするように取得することになる。
フォローしているユーザーを取得した場合、デフォルトでは100件ずつの応答になる。
>>> client.get_users_following(id)
Response(data=[<User id=*** name=** username=***>, <User id=*** name=*** username=***>, ... ], includes={}, errors=[], meta={'result_count': 100, 'next_token': '***'})
tweepy.Paginator
クラスを利用すると、その辺りのページネーション処理をやってくれる。
自身がフォローしているユーザーを、10ユーザーずつ3リクエストで、30ユーザー取得した例。
>>> for response in tweepy.Paginator(client.get_users_following, id, max_results=10, limit=3):
... print(response)
Response(data=[<User id=*** name=*** username=***>, <User id=*** name=*** username=***>, .... ], includes={}, errors=[], meta={'result_count': 10, 'next_token': '***'})
Response(data=[<User id=*** name=*** username=***>, <User id=*** name=*** username=***>, .... ], includes={}, errors=[], meta={'result_count': 10, 'next_token': '***', 'previous_token': '***'})
Response(data=[<User id=*** name=*** username=***>, <User id=*** name=*** username=***>, ... ], includes={}, errors=[], meta={'result_count': 10, 'next_token': '***', 'previous_token': '***'})
レスポンスオブジェクトが3つ出力される。
Client.get_users_following メソッドは、結果を1000件までしか取得できないが、tweepy.Paginator
クラスを利用して取得件数をmax_result=1000, limit=5
などに指定すると、フォロー上限の5000件が取得できる(厳密には5001件だったり、上限数はユーザーによって異なる模様)
問い合わせ結果のdata
部をリストに入れたりして利用するときは、flatten
メソッドを追加しておくと、下記のように簡単に処理できるので便利。
following = { user.id for user in tweepy.Paginator(client.get_users_following, id, max_results=10, limit=3).flatten(limit=30) }
ページネーションのドキュメント下部に簡単に使用例がある。
user_fields / tweet_fields
ユーザー情報の詳細、Tweet の詳細を取得するときは user_fields
tweet_fields
で欲しいデータフィールドを指定する。
user_fields
を指定しないデフォルトのレスポンス内容は、ID・スクリーンネーム・ユーザー名のみ。
>>> client.get_user(id=id).data
<User id=52938278 name=アキヤ username=K_akiya>
Twitter API User object ページに、指定可能なフィールドが掲載されている。
例えば、ユーザー登録日とユーザー統計情報を取得する。
>>> akiya = client.get_user(id=id, user_fields=['created_at', 'public_metrics']).data
>>> akiya.created_at
datetime.datetime(2009, 7, 2, 2, 22, 52, tzinfo=datetime.timezone.utc)
>>> akiya.public_metrics
{'followers_count': 721, 'following_count': 4598, 'tweet_count': 117860, 'listed_count': 50}
同様に、Tweetの場合。
>>> akiya_tweet = client.get_tweet(1499352501639811074, tweet_fields=['author_id', 'created_at']).data
>>> akiya_tweet
<Tweet id=1499352501639811074 text=日本語だとAPIv1の使用方法しか見当たらない上に「開発は終了した」とまで書かれているWEB記事を見つけてしまったが、最新の公式ドキュメントが完全に機能している上にGitHubのリポジトリの最終更新は2日前なんですが、 それは…>
>>> akiya_tweet.created_at
datetime.datetime(2022, 3, 3, 11, 54, 27, tzinfo=datetime.timezone.utc)
>>> client.get_user(id=akiya_tweet.author_id)
Response(data=<User id=52938278 name=アキヤ username=K_akiya>, includes={}, errors=[], meta={})
これで色々とデータを取得してリストの整理をしようとスクリプトを組んでみた。Twitter歴も10年を超えてくると整理することもでてくる。
しかし、API制限に早々に引っかかってしまい中々に整理が進まないのである。