mstdn.jpへのAPIでつまづいた件(解決済み)

Mastodonアイキャッチ Uncategorized
Mastodonアイキャッチimg

Twitterだけでなく、MastodonもAPIを触ってみたいと思い試しました!Twitterとは違い、簡単にできそうだと思ったらつまづきました。ネットの情報を参考にしながら、なんとか解決!同じところでつまづいている人がいるようなので、記事にしました。

PythonでMastodonのAPIをいじる。しかしエラー発生

まさに、こちらの記事を参考にさせていただきました!

こちらの記事通りに進めば簡単にできそうだ!と思いました。が、、、

raise MastodonNetworkError(“Could not complete request: %s” % e)

のエラー。早速このエラーでググる。そうすると下記のページに行き当たりました。

Pythonで、mstdn.jpだけが操作できません。 - Pythonを使用して、Mastodonへの投稿を行うツールを自作し... - Yahoo!知恵袋
Pythonで、mstdn.jpだけが操作できません。 Pythonを使用して、Mastodonへの投稿を行うツールを自作していますが、mstdn.jpだけがどうしてもログインできません。Fedibirdは正常にこのコードでログインできます...

なるほど!User Agentを設定すればよいのか!
と思ったものの、どこを書き換えればよいのか格闘。

mastodonのauthentication.pyの中を確認

環境によって「authentication.py」がある場所は異なると思いますが、Pythonがインストールされている場所の「/Lib/site-packages/mastodon/」の中にauthentication.pyがあるのではないかと思います。(私はWindows11上から実行しています。)

「authentication.py」をさわる前にバックアップを取りました(これはやっておいたほうが良いと思います)。

「raise MastodonNetworkError(“Could not complete request: %s” % e)」が発生していることもあり、「authentication.py」の中をみて、下記「if session:」あたりで失敗していそうなことがわかりました。

            if session:
                ret = session.post(api_base_url + '/api/v1/apps', data=request_data, timeout=request_timeout)
                response = ret.json()
            else:
                response = requests.post(api_base_url + '/api/v1/apps', data=request_data, timeout=request_timeout)
                response = response.json()
        except Exception as e:
            raise MastodonNetworkError("Could not complete request: %s" % e)

Exceptionをスルーさせて、responseをprintすると、やはり403でエラー

ということでUser-Agentを追加することにしました。

User-Agentの取得

あまりスマートな方法ではないと思うのですが、手っ取り早くMastodonのAPIを使いたかったので、User-Agentをそのまま入力することにしました。

User-AgentはChromeのURL欄に「chrome://version/」と入力して取得。

authentication.pyの編集

無事User-Agentも取得できたので、authentication.pyを編集することに。

49行目

        request_data = {
            'client_name': client_name,
            'scopes': " ".join(scopes)
        }

の後に、下記を追加(3行で表示されてしまうかもしれませんが2行で)

        ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
        headers={"User-Agent":ua}

そして先ほどの

            if session:
                ret = session.post(api_base_url + '/api/v1/apps', data=request_data, timeout=request_timeout)
                response = ret.json()
            else:
                response = requests.post(api_base_url + '/api/v1/apps', data=request_data, timeout=request_timeout)
                response = response.json()

部分に「headers=headers」を追加(こちらも表示が改行されていたら修正してください)

            if session:
                # headers=headers 追加
                ret = session.post(api_base_url + '/api/v1/apps',headers=headers, data=request_data, timeout=request_timeout)
                response = ret.json()
            else:
                # headers=headers 追加
                response = requests.post(api_base_url + '/api/v1/apps',headers=headers, data=request_data, timeout=request_timeout)
                response = response.json()

これで、元の記事の通り、user keyが作成できました!

最後にトゥート

元の記事では

from mastodon import Mastodon

while True:
    toot = input('> ',)
    
    mastodon = Mastodon(
    client_id="app_key.txt",
    access_token="user_key.txt",
    url = "https://mstdn.jp")

と記載されていましたが、下記に変更して無事APIでのトゥートができました!

mastodon = Mastodon(
    client_id="app_key.txt",
    access_token="user_key.txt",

    api_base_url = "https://mstdn.jp"
)

mastodon.toot("Mastodon API test toot")

url = “https://mstdn.jp”」を「api_base_url = “https://mstdn.jp”」に変更する必要がありそうです。

最後まで記事を読んでくださりありがとうございました。

コメント

タイトルとURLをコピーしました