Twitter API v2の認証のうち、OAuth1.0aによる認証ではエラーとなってしまうエンドポイントがあったので、OAuth2.0(with PKCE)による認証をクライアントに付与してtweepy経由で実行してみました。
TweepyをTwitter API v2経由で利用する
たとえば、自身のブックマークを取得する Client.get_bookmarksメソッドはoAuth1.0aによる認証だと、下記のようなエラーメッセージが表示されます。
client.get_bookmarks(max_results=10)
\\
TypeError: Access Token must be provided for OAuth 2.0 Authorization Code Flow with PKCE※ Client.get_bookmarksは結局、有料エンドポイントだったのでOAuth2.0による認証を経ても無料プランでは使えませんでした。ご注意ください。
When authenticating requests to the Twitter API v2 endpoints - Stack Overflow
以下、tweepyにてOAuth2.0による認証を得る方法を説明していきます。
- Twitter Developer PortalでOAuth2.0の設定を行う
- プロジェクトにOAuth2.0による認証を許可する
- 各種アクセスキー・トークンを再発行する
- ClientインスタンスにOAuth2.0による認証を付与
- OAuth2.0認証済クライアントでtweepyの各種メソッドを試す
- get_bookmarks()で自身のブックマークを取得
- get_me()メソッドで自身の情報を取得
Twitter Developer PortalでOAuth2.0の設定を行う
まず、デフォルトではOFFとなっているOAuth2.0の許可を行う設定を行います。
プログラム備忘録 Twitter API v2 を使ってツイートしてみた
PKCEについて: OAuth2.0拡張仕様のPKCE実装紹介 〜 Yahoo! ID連携に導入しました - Yahoo! JAPAN Tech Blog
そもそものDeveloper Portalアカウントの開設手続き・プロジェクトの作成方法などについては Tweepyで自動ツイート・自動いいねを実装。Developer Portalの設定方法から解説 の記事で解説しています。
プロジェクトにOAuth2.0による認証を許可する
Twitter Developer PortalのダッシュボードTOPから、自身のプロジェクトの設定へ。(歯車アイコンをクリック)
下へスクロールし、User authenticationj settings > Editを選択します。
続く画面で、パーミッション範囲を選択していきます。
後半のType of AppがOAuth2.0についての設定です。
“Web App, Automated App or Bot”を選択します。
つづくApp infoでは、”Callback URI / Redirect URL”を入力する必要があります。
ここはOAuth2.0によるユーザー認証が許可されたあと、リダイレクト先としてジャンプするページを設定します。
自分だけで利用する場合、基本的にはなんでもOKなので、自身のTwitterユーザープロフィール画面のURLを設定しています。
Website URLはなんでもOKです。
保存したら完了。
各種アクセスキー・トークンを再発行する
URLを設定したら「Keys and tokens」から「OAuth 2.0 Client ID and Client Secret」の項目でClient ID and Client Secretを生成して保存してください。またpermissionを変更した場合は上の4つのアクセスキーと認証トークンも再発行してください(そうしないとpermission設定の変更が反映されません)
Tweepyでブックマークしたツイートのテキストや画像情報を取得する | ミナピピンの研究室
未確認ですが、各種アクセスキー・トークンを再発行しないとOAuth2.0の設定が反映されないようです。
Developer Portalから、下記のアクセスキー・トークンを再発行して更新します。
- Consumer Key and Consumer Secret Key
- Access Token and Secret
- OAuth2.0 Client Secret
各種キーの定義や扱いについて、雑記: Tweepy による Twitter API v2 の利用 - クッキーの日記 が分かりやすいです。
ほか参考: 【Tweepy】Twitter API v2:ユーザーID、タイムライン、ツイートの取得[Python] | 3PySci
更新したキー情報をtwitter_key.jsonなどのキーファイルに格納・保存しておきます。
ClientインスタンスにOAuth2.0による認証を付与
実際にOAuth2.0による認証を行い、認証を得た状態をClientインスタンスに付与した形で生成していきます。
Authentication — tweepy 4.14.0 documentation
まず、認証済み状態のURL(コールバックURL: リダイレクトURL)を取得するために、各種キー情報をもたせたoauth2_user_handerを生成します。
oauth2_user_handler = tweepy.OAuth2UserHandler(
# OAuth2.0のクライアントID
client_id="your_OAuth2.0_client_id_from_dev_portal",
# Developer Portalで設定したリダイレクトURL
redirect_uri="https://twitter.com/Mktg_Wizard",
# インスタンスに許可を与える範囲を選択
scope=["tweet.read", "like.read", "bookmark.read", "users.read", "bookmark.write"],
# Client Secret is only necessary if using a confidential client
client_secret="your_OAuth2.0_client_secret_key_from_dev_portal"
)インスタンスに許可を与える範囲について、 OAuth 2.0 Authorization Code Flow with PKCE | Docs | Twitter Developer Platform の#Scopesの項目にリストがあります。
ブックマークを取得するget_bookmarksメソッドの実行には、bookmark.readのみならず、bookmark.writeとusers.read, tweet.readが必要らしいのでご注意ください。
ここでこの4つを指定しないと認証後にブックマークをclient.get_bookmarksで取得しようとして403 forbiddenになってしまうので注意してください
Tweepyでブックマークしたツイートのテキストや画像情報を取得する | ミナピピンの研究室
生成したhandlerを認証させるためのURLを生成し出力。
print(oauth2_user_handler.get_authorization_url())出力されたURLをクリックしてブラウザを開き、OAuth2.0認証の許可を了承します。ブラウザでは自身のTwitterアカウントにログインしている状態である必要があります。
“Authorize app”をクリックすると、Developer Portalで設定したURLへリダイレクトされます。私の場合はTwitterプロフィール画面へ設定していたので、プロフィール画面へ遷移します。
リダイレクトされた先のURLをブラウザからコピーします。このURLが「認証された」という状態をクエリパラメータとして保持しています。
下記のように、?state=xxxxx&code=xxxxxx という状態をもったURLになっているはず。
https://twitter.com/Mktg_Wizard?state=Emxxxxxxxxxxx&code=eHVxxxxxxxxxxこのURLをhandlerに渡して、認証済トークンを得ます。
oauth_token = oauth2_user_handler.fetch_token\
("https://twitter.com/Mktg_Wizard?state=Emxxxxx&code=eHVwxxxxxx")上記コールバックURLを、認証前のget_authorization_url()によって生成されたURLと勘違いしないようにしましょう。fetch_token()によって認証済トークンを取得するには、上記のようにブラウザ経由での認証によって生成されたコールバックURLが必要です。
oauth2_user_handler.fetch_token() needs Response URL, not the Authorization URL.You’ll need to print auth_link then visit that link in the browser then click Authorize.
After clicking Authorize, it will redirect you to a page that you specified in the Callback URL. (Even if the page is invalid)
Copy the Callback URL with the code and use that as your Response URL.
(missing_code) Missing code parameter in response - Twitter API / Twitter API v2 - Twitter Developers
認証済トークンをクライアントに渡す形で生成すれば、OAuth2.0(User Context)によって認証を得たクライアントが生成されます。
Client_2 = tweepy.Client(bearer_token=oauth2_token['access_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'])Unable to Post tweets via Oauth2-authenticated Client (using the Python tweepy library) - Twitter API / Twitter API v2 - Twitter Developers
OAuth2.0認証済クライアントでtweepyの各種メソッドを試す
get_bookmarks()で自身のブックマークを取得
この認証済クライアントでget_bookmarksメソッドを実施すれば、自身のブックマークリストが得られます。(有料プラン加入の場合)
Client_2.get_bookmarks(max_results=10)Client — tweepy 4.14.0 documentation
私の場合は無料プランなので、下記のようなエラーメッセージが表示されました。
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.get_me()メソッドで自身の情報を取得
無料プランでできる少ないことのうちに、自身のTwitterアカウントに関する情報取得があります。
対応するget_meメソッドにいくつかのパラメータを付与して実行してみました。
Client_2.get_me(expansions=["pinned_tweet_id", "most_recent_tweet_id"],\
tweet_fields=["referenced_tweets", "lang"],\
user_fields=["description", "location", "public_metrics", ])Expansions and Fields — tweepy 4.14.0 documentation
無事にレスポンスが返ってきました。
Response(data=<User id=95xxxxxxxxxxxxxxxxxx \
name=Nakata / まほウェブ username=Mktg_Wizard>, \
includes={'tweets': [<Tweet id=1701812717831795112 text='RT @beavis28: 1999年頃のサイバーエージェントと楽天。\n見てるだけでパワーもらえる気がする。 https://t.co/yMcMGOjFdO'>]}, errors=[], meta={})無料プランでは他に自身のアカウントによるtweet投稿などができますが、それについてはv2Endpoint: OAuth1.0aによる認証にて TweepyをTwitter API v2経由で利用する の記事で実施・解説しています。
この記事の気になった箇所を読み返す:
- Twitter Developer PortalでOAuth2.0の設定を行う
- プロジェクトにOAuth2.0による認証を許可する
- 各種アクセスキー・トークンを再発行する
- ClientインスタンスにOAuth2.0による認証を付与
- OAuth2.0認証済クライアントでtweepyの各種メソッドを試す
- get_bookmarks()で自身のブックマークを取得
- get_me()メソッドで自身の情報を取得
Category: 開発・プログラミング | エンジニアリング
Tags: Twitter | Python