Twitterだけでなく、MastodonもAPIを触ってみたいと思い試しました!Twitterとは違い、簡単にできそうだと思ったらつまづきました。ネットの情報を参考にしながら、なんとか解決!同じところでつまづいている人がいるようなので、記事にしました。
PythonでMastodonのAPIをいじる。しかしエラー発生
まさに、こちらの記事を参考にさせていただきました!
こちらの記事通りに進めば簡単にできそうだ!と思いました。が、、、
raise MastodonNetworkError(“Could not complete request: %s” % e)
のエラー。早速このエラーでググる。そうすると下記のページに行き当たりました。
なるほど!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”」に変更する必要がありそうです。
最後まで記事を読んでくださりありがとうございました。
コメント