PythonでDiscordにメッセージ送信しようとすると403エラーが返ってきた。
HTTP Error 403: Forbidden
ソースコードは↓。
import urllib.request
import urllib.parse
import json
url = "https://...."
data = {"content": "hello"}
data = json.dumps(data)
data = data.encode("utf-8")
request = urllib.request.Request(
url,
headers={
"Content-Type": "application/json",
"User-Agent": ""
},
data=data,
method="POST"
)
try:
with urllib.request.urlopen(request) as res:
body = json.loads(res.read())
print(body)
except Exception as e:
print(e)
答えは↓。ユーザエージェントの設定によってはDiscordがリクエストを受け付けてくれないらしい。
DiscordのWebhooksをurllib経由でたたいて簡単自動発言ボット作成 - Qiita
概要AWS Lambda の Python 3.7 ランタイムを使ってDiscordのWebhook URL を叩くと 403 でうまいこと叩けずに困った。原因を調べたらどうやらUAをチェックし…
ヘッダーでUser-Agentを明示的に空文字を指定すると動くようになった。
import urllib.request
import urllib.parse
import json
url = "https://...."
data = {"content": "hello"}
data = json.dumps(data)
data = data.encode("utf-8")
request = urllib.request.Request(
url,
headers={
"Content-Type": "application/json",
"User-Agent": ""
},
data=data,
method="POST"
)
try:
with urllib.request.urlopen(request) as res:
body = json.loads(res.read())
print(body)
except Exception as e:
print(e)
原因をまとめると
- urllibはユーザエージェントを設定しない場合は Python-urllib を設定する
- DiscordはユーザエージェントがPython-urllibの場合は403を返す
ユーザエージェントをPythonに設定してもメッセージ送信成功したので、urllib限定の対応が入っているらしい。
コメント