如何用Python的urllib3通过Discord Webhooks发送带内嵌图片的Embed消息
解决Discord Webhook内嵌图片的urllib3实现问题
问题核心
你需要用urllib3发送带内嵌图片的Discord Embed,当前遇到的问题:
- 纯JSON请求能发送Embed标题和描述,但无法加载本地图片
- 尝试添加
attachments参数后仍无法显示图片 - 能发送图片附件,但无法将其嵌入到Embed中
关键原理
要同时发送Embed配置和本地图片,必须使用multipart/form-data格式构造请求:
- 将Embed的JSON配置放在
payload_json字段中 - 将图片文件作为单独的文件字段上传
- Embed里的
image.url通过attachment://文件名关联上传的文件
正确实现代码
import urllib3 import json WEBHOOK_URL = "你的Discord Webhook地址" # 初始化urllib3连接池 http = urllib3.PoolManager() with open("image.jpg", "rb") as f: image_data = f.read() # 构造Embed的JSON配置 payload_json = json.dumps({ "content": "Hello World", "embeds": [ { "title": "Image Name", "description": "Image Description", "image": { "url": "attachment://image.jpg" # 与上传的文件名保持一致 } } ] }) # 构造multipart请求的字段集合 fields = { "payload_json": payload_json, "file": ("image.jpg", image_data, "image/jpeg") # 文件名、二进制数据、MIME类型 } # 发送POST请求 response = http.request( "POST", WEBHOOK_URL, fields=fields, timeout=urllib3.Timeout(10) ) print(response.data.decode('utf-8'))
错误原因解析
纯JSON请求(第一种代码):
- 使用
application/json请求头只能传输文本数据,无法携带文件,Discord找不到attachment://image.jpg对应的文件资源,因此图片无法显示。
- 使用
错误的multipart请求(第二种代码):
- 虽然设置了
multipart/form-data头,但直接将JSON字符串作为请求体发送,没有将图片文件加入请求体中,Discord仅收到JSON配置,未收到图片文件,导致关联失败。
- 虽然设置了
仅发送附件(第三种代码):
- 仅传递了文件和
content字段,未在payload_json中定义Embed并关联图片,因此图片只会以普通附件形式展示,无法嵌入到Embed中。
- 仅传递了文件和
内容的提问来源于stack exchange,提问作者Chase Thompson
相关产品推荐
相关产品推荐

