如何将Data Image URL以图片文件形式发送至Discord?遇400错误
问题解决:内存中直接发送图片到Discord Webhook
问题原因
你的代码返回400错误,是因为Discord Webhook不支持在content字段里直接传入base64格式的数据URL。要发送图片,必须使用multipart/form-data格式上传文件,这种方式可以在内存中完成处理,无需将图片保存到硬盘。
修正后的代码
import requests import base64 from io import BytesIO WEBHOOK_URL = "https://discord.com/api/webhooks/10304540869963366XXX/XXXXXXXXXXXXXXbiAhIF68Yt-yGBsSKlcKUsDvQdJ" # 读取图片到内存二进制对象 with open("image.jpg", "rb") as image_file: image_data = image_file.read() # 将二进制数据包装为内存文件对象,避免写入硬盘 image_buffer = BytesIO(image_data) # 构造请求参数 payload = { "username": "My Bot", "avatar_url": "https://cdn.discordapp.com/attachments/434487340535382018/1053728327036305418/Screen_Shot_2022-12-17_at_12.40.07_PM.png" } # 包装内存中的图片文件 files = { "file": ("image.jpg", image_buffer, "image/jpeg") } # 发送请求,requests会自动处理multipart/form-data格式 response = requests.post(WEBHOOK_URL, data=payload, files=files) # 验证请求结果(Discord成功时可能返回200或204) if response.status_code in [200, 204]: print("图片发送成功") else: print(f"发送失败,状态码: {response.status_code}") print(f"错误详情: {response.text}")
针对Data Image URL的处理
如果你的原始输入是Data Image URL(格式如data:image/jpeg;base64,xxxxxx),可以直接解码后存入内存对象,无需读取本地文件:
# 示例Data Image URL data_url = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAAAAAAAD..." # 提取并解码base64部分 base64_content = data_url.split(",")[1] image_data = base64.b64decode(base64_content) image_buffer = BytesIO(image_data) # 后续上传代码与上方一致
关键提示
- Discord的
content字段有长度限制,直接传入base64数据会超出限制,这也是报错的核心原因 - 使用
multipart/form-data是Discord Webhook接受文件的标准方式,无需手动设置Content-Type,requests会自动处理
内容的提问来源于stack exchange,提问作者CrazyChicken
相关产品推荐
相关产品推荐

