その他

PythonでDiscord Webhooksにメッセージを送ると403

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がリクエストを受け付けてくれないらしい。

ヘッダーで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限定の対応が入っているらしい。

スポンサーリンク

スポンサーリンク