Package: tweepy-authlib
tweepy-authlibWarning旧 TweetDeck の完全廃止にともない、09/14 頃から内部的に残存していた Twitter API v1.1 の段階的なシャットダウンが開始されてしまいました。このため、v1.1.0 以前の TweetDeck の Bearer トークンを使い API v1.1 にアクセスする実装が動作しなくなっています。これに伴い、Bearer トークンに代わりに Twitter Web App の Bearer トークンを利用するように変更した、v1.2.0 をリリースしました。statuses/update を含めた主にツイート系の API v1.1 にすでにアクセスできない状態で、今後も段階的にアクセスできなくなる API が増えていくと思われます。09/14 時点では home_timeline や verify_credentials などの一部 API には今まで通りの方法で tweepy と tweepy-authlib を使いアクセスできますが、今後はそれらの API にもアクセスできなくなる可能性があります。Table of Contentstweepy-authlibDescriptionInstallationUsageWith JSONWith PickleLicenseDescriptionTwitter Web App (Web 版公式クライアント) の内部 API を使い、Tweepyでスクリーンネームとパスワードで認証するためのライブラリです。スクリーンネーム (ex:@elonmusk) とパスワードを指定して認証し、取得した Cookie などの認証情報で Twitter API v1.1 にアクセスできます。毎回ログインしていては面倒 & 不審なアクセス扱いされそうなので、Cookie をファイルなどに保存し、次回以降はその Cookie を使ってログインする機能もあります。Tweepy を利用しているソースコードのうち、認証部分 (tweepy.auth.OAuth1UserHandler) をtweepy_authlib.CookieSessionUserHandlerに置き換えるだけで、かんたんに Cookie ベースの認証に変更できます！Twitter API の有料化に伴って通常の OAuth API が利用できなくなった場合も、このCookieSessionUserHandlerを使えば引き続き Twitter API v1.1 にアクセスできるはず…！認証部分以外は OAuth API のときの実装がそのまま使えるので、ソースコードの変更も最小限に抑えられます。NoteOAuth API と公式クライアント用の内部 API がほぼ共通だった v1.1 とは異なり、v2 では OAuth API と公式クライアント用の内部 API が大きく異なります。そのため、CookieSessionUserHandlerは Twitter API v2 には対応していません。また、今のところ2段階認証にも対応していません (2段階認証に関しては技術的には実装可能だが、確認コードの送信周りの実装が面倒…) 。認証フローはブラウザ上で動作する Web 版公式クライアントの API アクセス動作や HTTP リクエストヘッダーを可能な限りエミュレートしています。ブラウザから抽出した Web 版公式クライアントのログイン済み Cookie を使うことでも認証が可能です。Noteブラウザから Cookie を抽出する場合、(不審なアクセス扱いされないために) できればすべての Cookie を抽出することが望ましいですが、実装上は Cookie 内のauth_tokenとct0の2つの値だけあれば認証できます。なお、ブラウザから取得した Cookie は事前にrequests.cookies.RequestsCookieJarに変換してください。さらに API アクセス時は TweetDeck の HTTP リクエスト (Twitter API v1.1) をエミュレートしているため、レートリミットなどの制限は TweetDeck と同一です。NoteCookieSessionUserHandlerで取得した認証情報を使うと、TweetDeck でしか利用できない search/universal などの内部 API にもアクセスできるようになります。ただし、Tweepy はそうした内部 API をサポートしていないため、アクセスするには独自にtweepy.API.request()で HTTP リクエストを送る必要があります。Warningこのライブラリは、非公式かつ内部的な API をリバースエンジニアリングし、ブラウザとほぼ同じように API アクセスを行うことで、本来 Web 版公式クライアントでしか利用できない Cookie 認証での Twitter API v1.1 へのアクセスを可能にしています。可能な限りブラウザの挙動を模倣することでできるだけ Twitter 側に怪しまれないような実装を行っていますが、非公式な方法ゆえ、このライブラリを利用して Twitter API にアクセスすると、最悪アカウント凍結やシャドウバンなどの制限が適用される可能性もあります。また、Twitter API の仕様変更により、このライブラリが突然動作しなくなることも考えられます。このライブラリを利用して API アクセスを行うことによって生じたいかなる損害についても、著者は一切の責任を負いません。利用にあたっては十分ご注意ください。Warningスクリーンネームとパスワードを指定して認証する際は、できるだけログイン実績のある IP アドレスでの実行をおすすめします。このライブラリでの認証は、Web 版公式クライアントのログインと同じように行われるため、ログイン実績のない IP アドレスから認証すると、不審なログインとして扱われてしまう可能性があります。また、実行毎に毎回認証を行うと、不審なログインとして扱われてしまう可能性が高くなります。初回の認証以降では、以前認証した際に保存した Cookie を使って認証することを強く推奨します。Installationpip install tweepy-authlibUsageWith JSONimportjsonimportosimporttweepyfrompathlibimportPathfromrequests.cookiesimportRequestsCookieJarfromtweepy_authlibimportCookieSessionUserHandlertry:terminal_size=os.get_terminal_size().columnsexceptOSError:terminal_size=80# 保存した Cookie を使って認証## 毎回ログインすると不審なログインとして扱われる可能性が高くなるため、## できるだけ以前認証した際に保存した Cookie を使って認証することを推奨ifPath('cookie.json').exists():# 保存した Cookie を読み込むwithopen('cookie.json','r')asf:cookies_dict=json.load(f)# RequestCookieJar オブジェクトに変換cookies=RequestsCookieJar()forkey,valueincookies_dict.items():cookies.set(key,value)# 読み込んだ RequestCookieJar オブジェクトを CookieSessionUserHandler に渡すauth_handler=CookieSessionUserHandler(cookies=cookies)# スクリーンネームとパスワードを指定して認証else:# スクリーンネームとパスワードを渡す## スクリーンネームとパスワードを指定する場合は初期化時に認証のための API リクエストが多数行われるため、完了まで数秒かかるtry:auth_handler=CookieSessionUserHandler(screen_name='your_screen_name',password='your_password')excepttweepy.HTTPExceptionasex:# パスワードが間違っているなどの理由で認証に失敗した場合iflen(ex.api_codes)>0andlen(ex.api_messages)>0:error_message=f'Code:{ex.api_codes[0]}, Message:{ex.api_messages[0]}'else:error_message='Unknown Error'raiseException(f'Failed to authenticate with password ({error_message})')excepttweepy.TweepyExceptionasex:# 認証フローの途中で予期せぬエラーが発生し、ログインに失敗したerror_message=f'Message:{ex}'raiseException(f'Unexpected error occurred while authenticate with password ({error_message})')# 現在のログインセッションの Cookie を取得cookies=auth_handler.get_cookies()# Cookie を pickle 化して保存withopen('cookie.json','w')asf:json.dump(cookies.get_dict(),f,ensure_ascii=False,indent=4)# Tweepy で Twitter API v1.1 にアクセスapi=tweepy.API(auth_handler)print('-'*terminal_size)print(api.verify_credentials())print('-'*terminal_size)print(api.home_timeline())print('-'*terminal_size)# 継続してログインしない場合は明示的にログアウト## 単に Cookie を消去するだけだと Twitter にセッションが残り続けてしまう## ログアウト後は、取得した Cookie では再認証できなくなる#auth_handler.logout()#os.unlink('cookie.json')With PickleimportosimportpickleimporttweepyfrompathlibimportPathfromtweepy_authlibimportCookieSessionUserHandlertry:terminal_size=os.get_terminal_size().columnsexceptOSError:terminal_size=80# 保存した Cookie を使って認証## 毎回ログインすると不審なログインとして扱われる可能性が高くなるため、## できるだけ以前認証した際に保存した Cookie を使って認証することを推奨ifPath('cookie.pickle').exists():# 保存した Cookie を読み込むwithopen('cookie.pickle','rb')asf:cookies=pickle.load(f)# 読み込んだ RequestCookieJar オブジェクトを CookieSessionUserHandler に渡すauth_handler=CookieSessionUserHandler(cookies=cookies)# スクリーンネームとパスワードを指定して認証else:# スクリーンネームとパスワードを渡す## スクリーンネームとパスワードを指定する場合は初期化時に認証のための API リクエストが多数行われるため、完了まで数秒かかるtry:auth_handler=CookieSessionUserHandler(screen_name='your_screen_name',password='your_password')excepttweepy.HTTPExceptionasex:# パスワードが間違っているなどの理由で認証に失敗した場合iflen(ex.api_codes)>0andlen(ex.api_messages)>0:error_message=f'Code:{ex.api_codes[0]}, Message:{ex.api_messages[0]}'else:error_message='Unknown Error'raiseException(f'Failed to authenticate with password ({error_message})')excepttweepy.TweepyExceptionasex:# 認証フローの途中で予期せぬエラーが発生し、ログインに失敗したerror_message=f'Message:{ex}'raiseException(f'Unexpected error occurred while authenticate with password ({error_message})')# 現在のログインセッションの Cookie を取得cookies=auth_handler.get_cookies()# Cookie を pickle 化して保存withopen('cookie.pickle','wb')asf:pickle.dump(cookies,f)# Tweepy で Twitter API v1.1 にアクセスapi=tweepy.API(auth_handler)print('-'*terminal_size)print(api.verify_credentials())print('-'*terminal_size)print(api.home_timeline())print('-'*terminal_size)# 継続してログインしない場合は明示的にログアウト## 単に Cookie を消去するだけだと Twitter にセッションが残り続けてしまう## ログアウト後は、取得した Cookie では再認証できなくなる#auth_handler.logout()#os.unlink('cookie.pickle')LicenseMIT License