@yuutayaro

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

初めての質問です。PythonでTwitterアカウントのAccess Tokenの取得を半自動化について

つたない質問の仕方かもしれませんがよければ教えて下さい

解決したいこと

PythonでTwitterアカウントのAccess Tokenの取得を半自動化しようとしています[OAuth認証]

記事を投稿する機能の実装中にエラーが発生しました。
解決方法を教えて下さい。

発生している問題・エラー

Traceback (most recent call last):
  File "C:\Users\ゆう\OneDrive\デスクトップ\python\TwitterOauth.py", line 51, in <module>
    authenticate_url = t.get_authenticate_url()  # 認証ページのURLを取得する
  File "C:\Users\ゆう\OneDrive\デスクトップ\python\TwitterOauth.py", line 20, in get_authenticate_url
    request_token = self.request_token_content["oauth_token"][0]
KeyError: 'oauth_token'

例)

KeyError: 'oauth_token'

該当するソースコード

import urllib
import webbrowser
import oauth2 as oauth


class TwitterOauth:

    REQUEST_TOKEN_URL = "https://api.twitter.com/oauth/request_token"
    ACCESS_TOKEN_URL  = "https://api.twitter.com/oauth/access_token"
    AUTHENTICATE_URL  = "https://api.twitter.com/oauth/authenticate"

    def __init__(self, key, secret):
        self.consumer = oauth.Consumer(key=key, secret=secret)

    def get_authenticate_url(self):
        """
        認証ページのURLを返す
        """
        self._set_request_token_content()
        request_token = self.request_token_content["oauth_token"][0]
        query = urllib.parse.urlencode({"oauth_token": request_token})
        authenticate_url = self.AUTHENTICATE_URL + "?" + query
        return authenticate_url

    def get_access_token_content(self, pin):
        """
        Access Token などの情報が入ったdictを返す
        """
        oauth_token = self.request_token_content["oauth_token"][0]
        oauth_token_secret = self.request_token_content["oauth_token_secret"][0]
        token = oauth.Token(oauth_token, oauth_token_secret)
        client = oauth.Client(self.consumer, token)
        body = urllib.parse.urlencode({"oauth_verifier": pin})
        resp, content = client.request(self.ACCESS_TOKEN_URL, "POST", body=body)
        return urllib.parse.parse_qs(content.decode())

    def _set_request_token_content(self):
        client = oauth.Client(self.consumer)
        resp, content = client.request(self.REQUEST_TOKEN_URL, "GET")
        self.request_token_content = urllib.parse.parse_qs(content.decode())


if __name__ == '__main__':

    ###############################################################################
    CONSUMER_KEY = "<< 入力済 >>"            # ここに API key を設定する
    CONSUMER_SECRET = "<< 入力済 >>"  # ここに API secret key を設定する
    ###############################################################################

    t = TwitterOauth(CONSUMER_KEY, CONSUMER_SECRET)
    authenticate_url = t.get_authenticate_url()  # 認証ページのURLを取得する
    webbrowser.open(authenticate_url)            # ブラウザで認証ページを開く

    print("PIN? >> ", end="")
    pin = int(input())

    access_token_content = t.get_access_token_content(pin)
    access_token = access_token_content["oauth_token"][0]
    access_token_secret = access_token_content["oauth_token_secret"][0]
    s = "ACCESS TOKEN        = {}\nACCESS TOKEN SECRET = {}"
    s = s.format(access_token, access_token_secret)
    print(s)

自分で試したこと

https://qiita.com/s-col/items/4262b21815b09d4b5885
上記記事を参考にし実装しようとしていました。

・スペルミスがないか確認を行いました。
・当機能に必要なライブラリ(?)のインポートが出来ていないと思い
 pip listで確認したところインポートはされていました

0 likes

2Answer

KeyError: 'oauth_token'

self.request_token_contentoauth_tokenというキーが存在しない、というエラーのようです。
self.request_token_contentにはREQUEST_TOKEN_URLへリクエストした結果が入っているようなので、そこに想定した形のデータが入っていないのだろうと推測します。

self.request_token_contentをdumpなどして確認してみてはいかがでしょうか?

1Like

Comments

  1. @yuutayaro

    Questioner

    返信ありがとうございます!
    >>self.request_token_contentをdumpなどして確認してみてはいかがでしょうか?
    リクエストした結果を入れる際にdump関数またはdumps関数を使って文字列に変換して
    データが入るか確認してみてはいかがでしょうかという認識で合っていますでしょうか?

    試してみます。拙い質問に答えていただきありがとうございます!!!
  2. 「self.request_token_content」に入っているデータを確認、ですね。
    Pythonは詳しくないのでdumpは具体的な関数名ではなく、一般的なダンプを意図しています。
    具体的な方法はともかく、コンソールなりファイルなりに出力して、どのようなデータが入っているか確認することで進展があるのではないかと思います。

プログラム自体に問題は無いと思われます。
おそらくPINを入力後に該当のエラーが出ると思われますが、これは

self.request_token_content = urllib.parse.parse_qs(content.decode())

にてデコードしているTwitterのOAuthAPIからのレスポンスに
oauth_tokenが存在していないのが原因だと思われます。

つまり、TwitterAPI側の設定が正しく済んでいない若しくは、OAuth後に表示されるPINの入力を間違えている可能性があります。
確認ですが、TwitterAPI側で「3-legged OAuth」は無効化していますか?

1Like

Your answer might help someone💌