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




