Tweepy で Twitter API v2 を利用する


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制限に早々に引っかかってしまい中々に整理が進まないのである。

カテゴリー:

最終更新: