Twitter API v2の認証のうち、OAuth1.0aによる認証ではエラーとなってしまうエンドポイントがあったので、OAuth2.0(with PKCE)による認証をクライアントに付与してtweepy経由で実行してみました。
たとえば、自身のブックマークを取得する 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 の利用 - クッキーの日記 が分かりやすいです。
更新したキー情報を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になってしまうので注意してください
生成した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.
認証済トークンをクライアントに渡す形で生成すれば、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'])
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経由で利用する の記事で実施・解説しています。
この記事の気になった箇所を読み返す:
Category: 開発・プログラミング | エンジニアリング