You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python urllib调用Discord Webhook遇403错误,求排查及可行性确认

问题分析与解决

你的urllib实现确实漏了关键的请求头配置,这就是导致403 Forbidden错误的核心原因。

为什么会出现这个报错?

Discord的Webhook接口明确要求请求必须携带Content-Type: application/json的请求头,否则会直接拒绝请求返回403。你当前的urllib代码虽然把消息转成了JSON格式的字节流,但没有告诉Discord请求体的类型,所以接口判定你的请求不合法。

对比来看:

  • requests.post方法在处理字典类型的data参数时,会自动帮你适配请求头(如果用json=data参数会更直接地设置正确的Content-Type);
  • 你能用curl成功发送,肯定是手动指定了-H "Content-Type: application/json"这个头;
  • Slack的接口对请求头的要求没那么严格,所以你的Slack脚本即使没设置这个头也能正常运行。

修正后的urllib代码

只需要给Request对象添加必要的请求头即可解决问题:

#!/usr/bin/python
from urllib.request import Request, urlopen
import json

# Provide the webhook URL that Discord generated
discord_webhook_url = 'https://discordapp.com/api/webhooks/252534154132/knskdnvoangoe0940507230'

# Post the message to the Discord webhook
message = { "content": "Hello world" }
# 添加Content-Type请求头,明确告诉Discord请求体是JSON格式
req = Request(
    discord_webhook_url,
    json.dumps(message).encode('utf-8'),
    headers={'Content-Type': 'application/json'}
)
response = urlopen(req)
response.read()

小细节提醒

另外注意你原来的Discord脚本里变量名写错了——用了slack_webhook_url而不是discord_webhook_url,不过你说curl能正常运行,应该是实际测试时已经改对了,这个小细节可以留意下。

当然可以用urllib发送Discord请求,只要满足接口的请求格式要求就行,核心就是正确设置请求头和请求体格式。

内容的提问来源于stack exchange,提问作者zzenonn

火山引擎 最新活动