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がリクエストを受け付けてくれないらしい。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9RGlzY29yZCVFMyU4MSVBRVdlYmhvb2tzJUUzJTgyJTkydXJsbGliJUU3JUI1JThDJUU3JTk0JUIxJUUzJTgxJUE3JUUzJTgxJTlGJUUzJTgxJTlGJUUzJTgxJTg0JUUzJTgxJUE2JUU3JUIwJUExJUU1JThEJTk4JUU4JTg3JUFBJUU1JThCJTk1JUU3JTk5JUJBJUU4JUE4JTgwJUUzJTgzJTlDJUUzJTgzJTgzJUUzJTgzJTg4JUU0JUJEJTlDJUU2JTg4JTkwJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz04YTcwY2RmODI5NTU3NTNhNGM3Y2VlZGY2YmNkMDRmZA&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBQaGFyYW9oS0omdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTM2NzQyODEwZTNlNTgwYzhiOTdiODc0ZGZmN2I4NGQw&blend-x=142&blend-y=486&blend-mode=normal&s=87ffbb70a8d5e57060b3f1891ee13cf7)
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限定の対応が入っているらしい。
コメント