PythonでTwitter APIを扱いやすくしてくれるライブラリ”Tweepy”からTwitter API v2を利用して、さまざまな情報を取得する方法を解説します。本記事では接続のためにClientクラスから認証済インスタンスを得る方法と、実装例としてRecent Searchを実行する方法を紹介しています。
Developer Portalでのアプリ設定や接続に必要な要素の詳細(秘密鍵など)については Tweepyで自動ツイート・自動いいねを実装。Developer Portalの設定方法から解説 および Twitter API v2をPostman, Thunder Clientでテスト の記事をご覧ください。API疎通テストについても解説しています。
目次:
- 2023年2月のTwitter API仕様変更により、v2でのアクセスが原則に
- Twitter API v2によるエンドポイントもほとんどが有料化
- 所属プランで許可されていないエンドポイントを呼び出すと401
- 秘密鍵・接続情報を別ファイルに格納して読み取る
- JSONで読み取る場合
- configモジュールを用いて読み取る場合
- Clientクラスからインスタンスを作成: キー情報から認証済インスタンスを作成
- Bearer Tokenのみによる認証はうまくいかない
- consumer_keyとconsumer_secretを引数にとる認証方式を利用する
- Tweepyで実行可能なメソッドを試す
- 無料プランでも投稿可能な「自分自身のアカウントでツイート投稿」を試す
- OAuth1.0aによるクライアント認証では不十分なメソッドもある
- tweepyのブックマーク取得メソッド:get_bookmarksはOAuth2.0認証を経ても有料エンドポイント
- Twitter API v2の機能”Recent Search”を実行(有料プラン)
- Responseオブジェクト
- Responseオブジェクトのもつ属性
- data属性の中身
- ツイートの中身だけ抽出して出力する
- Tweepy公式ドキュメントの実装サンプルを参考にする
- Twitter API v2利用の参考になった動画
2023年2月のTwitter API仕様変更により、v2でのアクセスが原則に
2023年2月のTwitter API仕様変更により、原則としてTwitter API v2でのアクセスが必要となりました。
参考: 【2023年6月最新版】TwitterのAPIが有料化。各種ツールへの影響とは?
Twitter API v2によるエンドポイントもほとんどが有料化
また、現在ではv2のほとんどのエンドポイントは有料化されています。
たとえば、以前はSandboxにて無料で利用できていた30日間検索も利用できなくなってしまいました…
453 - You currently have access to a subset of Twitter API v2 endpoints \
and limited v1.1 endpoints (e.g. media post, oauth) only. \
If you need access to this endpoint, you may need a different access level. \
You can learn more here: https://developer.twitter.com/en/portal/product
無料レベルのAPIでできることは、現在では下記のようてす。
- 自分自身のアカウントについて、ツイートを投稿
自分自身のアカウントについて、メディアつきツイートを投稿(v1.1)- 2023/07/20追記: 上記のメディアつきツイート投稿のみv1.1の方式でしばらく利用できていた状態でしたが、上記含めてTwitter API v1.1はすべて廃止となりました。
- 自分自身のアカウントについて、特定のツイートを削除
- 自分自身のアカウント情報を取得
後述しますが、無料プランで上記以外のエンドポイントを利用しようとすると401エラーとなります。
所属プランで許可されていないエンドポイントを呼び出すと401
所属するプランで許可されていないエンドポイントを呼び出すと、401エラーが返ってきます。
client.search_recent_tweets(query="SEOコンサルティング", expansions="author_id")
実行結果:
Unauthorized: 401 Unauthorized
もう少し親切なエラーメッセージにしてほしいところですね…
以降のコードは、かつては無料プランで呼び出せていたものを含みます。現在ではそのほとんどが有料プランでないと正しいレスポンスを得られないことをご承知おきください。
また、Tweepyを最新版にアップデートしてから試してみることをおすすめします。
pip3 install -U tweepy
秘密鍵・接続情報を別ファイルに格納して読み取る
JSONで読み取る場合
各種キー情報をtwitter_key.jsonファイルにjson形式で保存します。
{
"consumer_key": "xxxxxxxxx",
"consumer_secret": "xxxxxxxxx",
"bearer_token": "xxxxxxxxxxxx",
"access_token": "xxxxxxxxx",
"access_token_secret": "xxxxxxxxxxxxxx"
}
アプリファイルで、jsonファイルを読み込みます。
import tweepy
import json
with open('twitter_key.json') as f:
twitter_keys = json.load(f)
configモジュールを用いて読み取る場合
config.pyという名称のpythonファイルを作成します。
API_KEY = "xxxxxxxxx"
API_KEY_SECRET = "xxxxxxxxxx"
BEARER_TOKEN = "xxxxxxxxxx"
ACCESS_TOKEN = "xxxxxxxx"
ACCESS_TOKEN_SECRET = "xxxxxxxxxxxxxx"
PATH = "xxxxxxxxxxxxxxxxx"
PATHはpythonモジュールのファイルパスを指定しておきますが、特に記述しなくてもOK。
アプリファイル内でtweepyライブラリとconfigモジュールをインポート。
import tweepy
import config
Clientクラスからインスタンスを作成: キー情報から認証済インスタンスを作成
tweepyの提供するClientクラスから、インスタンスを生成します。
Clientクラスから生成することで、接続認証済のインスタンスを得ることができます。
各種認証情報を引数にとり、clientインスタンスを作成します。
Bearer Tokenのみによる認証はうまくいかない
基本的な”App”での利用の場合、Twitter API v2の場合にはBearer Tokenによる認証のみで足ります。
2023/06/17現在、tweepy経由ではBearer Tokenのみの認証: OAuth 2.0 Bearer Token (App-Only) は上手くいきません。
client = tweepy.Client(twitter_keys['bearer_token'])
Bearer Tokenのみによる認証の場合、下記のような403エラーが返ってきます。
Forbidden: 403 Forbidden
When authenticating requests to the Twitter API v2 endpoints, \
you must use keys and tokens from a Twitter developer App that is attached to a Project. \
You can create a project via the developer portal.
“v2エンドポイントへのリクエストを送る場合、プロジェクトに紐づいたDeveloper Appのキーとトークンによる認証が必要です” のような意味のことを言われます。
上エラーは作成アプリがプロジェクトに紐づいていない、という場合にも発生するようですが、私の場合はきちんと紐づいていました。
TypeError: Consumer key must be string or bytes, not NoneType
consumer_keyとconsumer_secretを引数にとる認証方式を利用する
したがって、consumer_keyとconsumer_secretを引数に含む OAuth 1.0a User Context または OAuth 2.0 Authorization Code Flow with PKCE (User Context) による認証をおすすめします。
OAuth 1.0a User Context の認証方式において、JSONファイルからキー情報を格納する場合は下記。 (bearer_tokenは本来は不要)
client = tweepy.Client(bearer_token=twitter_keys['bearer_token'],
consumer_key=twitter_keys['consumer_key'],
consumer_secret=twitter_keys['consumer_secret'],
access_token=twitter_keys['access_token'],
access_token_secret=twitter_keys['access_token_secret'])
configライブラリでconfig.pyに格納したキー情報を用いる場合は下記。
client = tweepy.Client(bearer_token=config.BEARER_TOKEN,
consumer_key=config.API_KEY,
consumer_secret=config.API_KEY_SECRET,
access_token=config.ACCESS_TOKEN,
access_token_secret=config.ACCESS_TOKEN_SECRET)
これで生成したclientに対して、さまざまなAPI操作が可能となりました。
Tweepyで実行可能なメソッドを試す
無料プランでも投稿可能な「自分自身のアカウントでツイート投稿」を試す
2023/06/17現在、無料プランでもTwitter API v2による操作が可能なエンドポイント、 POST /2/tweets/ によるツイート投稿を試します。
tweepyでは、Client.create_tweet() メソッドが認証済クライアントによるツイート投稿に該当します。
client.create_tweet(text="Hello, world!")
エラーなく実行され、確認してみると自身のアカウントによる投稿が実行できていました。
OAuth1.0aによるクライアント認証では不十分なメソッドもある
次に、自分自身の(認証されたクライアントの)ブックマークを取得するメソッドを試してみます。
Client.get_bookmarks | Client — tweepy 4.14.0 documentation
client.get_bookmarks(max_results=10)
すると、次のようなエラーが返ってきます。
TypeError: Access Token must be provided for OAuth 2.0 Authorization Code Flow with PKCE
いくつかのAPIコールによってはOAuth1.0aの認証では不十分で、 OAuth 2.0 による認証を必要とするものがあります。この場合は、認証済クライアントを生成するときに OAuth 2.0 Authorization Code Flow with PKCE (User Context) の認証方式によって生成するようにしましょう。
tweepyのブックマーク取得メソッド:get_bookmarksはOAuth2.0認証を経ても有料エンドポイント
なお、上記の自身のブックマーク取得メソッドについて、OAuth2.0による認証を通過させても、get_bookmarksは無料プランでは制限がかかっているエンドポイントのようでした。
tweepyでOAuth2.0(PKCE: User Context)の認証を行う: Twitter API v2
Client_2.get_bookmarks(max_results=10)
\\
Forbidden: 403 Forbidden
When authenticating requests to the Twitter API v2 endpoints, \
you must use keys and tokens from a Twitter developer App that is attached to a Project. \
You can create a project via the developer portal.
エラーメッセージでは”v2エンドポイントで認証させるには、プロジェクトに紐づいたキーとトークンが必要です”と表示されていますが、自身のプロジェクトがエンドポイントの課金プランに対応していない場合にもこのようなメッセージとして表示されるようです。
When authenticating requests to the Twitter API v2 endpoints - Stack Overflow
Twitter API v2の機能”Recent Search”を実行(有料プラン)
Twitter API v2の機能である、Recent Search(直近7日間から該当するツイートを取得)を呼び出してみます。
Tweepy公式Docsを見ると、Recent Searchはさまざまな引数を取ることができますが、必須となっている引数はquery(指定検索ワード)のみです。
ここでは、queryとmax_results(呼び出し上限数の指定)を引数に指定して、実行します。
max_resultsの値は10以上、100以下である必要があります。max_resultsを指定しない場合のデフォルト値は10です。
client.search_recent_tweets(query="SEOコンサルティング", max_results=20)
返ってきたclientの内容を出力すると、Response(data=…)というResponseオブジェクトが返ってくるのが分かります。
Responseオブジェクト
Responseオブジェクトのもつ属性
Responseオブジェクトは、以下の属性を持ちます。
- data
- includes
- errors
- meta
Response — tweepy 4.12.1 documentation
先程のRecent Searchを行った場合で成功した場合だと、返ってきたResponseオブジェクトはdata属性とmeta属性を含んでいることが、clientの内容から分かりました。
data属性は返ってきたデータの中身、meta属性ではそのデータ群のメタ属性(最新のツイートid, 合計取得数)などを持っています。
data属性の中身
clientを介してRecent Searchを呼び出したときの実行結果を変数に格納し、data属性の中身を見てみます。
recent_tweets = client_sample.search_recent_tweets(query="SEOコンサルティング", max_results=20)
print(recent_tweets.data)
すると、以下のようにそれぞれ1つの中身がid属性とtext属性をもつリストが返ってきました。
[<Tweet id=1xxxxxxx text='tweet contents 1'>, <Tweet id=1yyyyyyyyy text='@someone tweet contents 2 ……]
ツイートの中身だけ抽出して出力する
返ってきたリストで一番最初のツイートの、コンテンツ中身だけを取り出してみます。
recent_tweets.data[0].text
これで中身が取り出せたので、for文でid情報とtext情報をかんたんに整形して出力してみます。
for recent_tweet in recent_tweets.data:
id, text = recent_tweet.id, recent_tweet.text
print(f"{id} || {text}\n")
これで簡易的なツイート検索分析ができるようになりました。
もっと本格的な分析がしたい場合には、CSVに吐き出したりpandasを用いて分析するのが良いでしょう。
Tweepy公式ドキュメントの実装サンプルを参考にする
公式Tweepyドキュメントには、API v1.1 と API v2 それぞれにおける、いくつかの実装サンプルが用意されています。
場所が分かりにくいのですが、META > Examples にありました。
認証方法から、それぞれのメソッドにおける具体的な実装例まで。コメント付きで親切に説明されています。
Twitter API v2利用の参考になった動画
YouTubeでいくつか参考にした動画をご紹介します。(英語)
↑シンプルで分かりやすい解説です。
ほかに、 Twitter API V2 - Python Tweepy Automation - Search Twitter - YouTube の動画も、柔軟性をもたせるために関数化するなどの手法が参考になりました。
たとえばRecent Searchを関数化し、queryを引数で渡すことで、呼び出すたびに異なるキーワードでのRecent Search実行が可能となります。
この記事の気になった箇所を読み返す:
- 2023年2月のTwitter API仕様変更により、v2でのアクセスが原則に
- Twitter API v2によるエンドポイントもほとんどが有料化
- 所属プランで許可されていないエンドポイントを呼び出すと401
- 秘密鍵・接続情報を別ファイルに格納して読み取る
- JSONで読み取る場合
- configモジュールを用いて読み取る場合
- Clientクラスからインスタンスを作成: キー情報から認証済インスタンスを作成
- Bearer Tokenのみによる認証はうまくいかない
- consumer_keyとconsumer_secretを引数にとる認証方式を利用する
- Tweepyで実行可能なメソッドを試す
- 無料プランでも投稿可能な「自分自身のアカウントでツイート投稿」を試す
- OAuth1.0aによるクライアント認証では不十分なメソッドもある
- tweepyのブックマーク取得メソッド:get_bookmarksはOAuth2.0認証を経ても有料エンドポイント
- Twitter API v2の機能”Recent Search”を実行(有料プラン)
- Responseオブジェクト
- Responseオブジェクトのもつ属性
- data属性の中身
- ツイートの中身だけ抽出して出力する
- Tweepy公式ドキュメントの実装サンプルを参考にする
- Twitter API v2利用の参考になった動画
Category: 開発・プログラミング | エンジニアリング