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

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

コメント