Discord.py:如何编辑频道内发送的非嵌入图片?
解决Discord.py中更新非嵌入消息图片的问题
Discord.py的message.edit()方法确实没有提供直接修改非嵌入图片附件的参数,要实现Midjourney那样的图片更新效果,得绕开官方库的封装,直接调用Discord REST API来操作,具体思路如下:
核心原理
Discord的消息修改API支持替换附件,但Discord.py的高层方法没暴露这个能力。我们需要通过API的PATCH请求,指定要替换的附件ID并上传新文件数据,来实现图片更新。
具体步骤
- 第一步:获取目标消息的原附件ID。如果消息只有一张图片,直接取
message.attachments[0].id即可;多附件的话需要对应指定要替换的ID。 - 第二步:构造API请求,使用
PATCH方法访问/channels/{channel_id}/messages/{message_id}路径。 - 第三步:请求体中通过
attachments字段声明要保留或替换的附件,同时在请求中携带新的文件数据。
代码示例
import aiohttp import json from io import BytesIO async def update_message_image(bot, message, new_image_bytesio: BytesIO, filename="image.png"): # 确保BytesIO指针在起始位置 new_image_bytesio.seek(0) # 获取原附件ID(假设消息只有一张图片) if not message.attachments: raise ValueError("目标消息没有可替换的附件") original_attachment_id = message.attachments[0].id # 构造请求表单数据 form = aiohttp.FormData() # 添加新文件 form.add_field("files[0]", new_image_bytesio.read(), filename=filename) # 声明替换指定ID的附件 form.add_field("payload_json", json.dumps({ "attachments": [ { "id": original_attachment_id, "filename": filename } ] })) # 发送API请求 api_url = f"https://discord.com/api/v10/channels/{message.channel.id}/messages/{message.id}" headers = {"Authorization": f"Bot {bot.http.token}"} async with aiohttp.ClientSession() as session: async with session.patch(api_url, headers=headers, data=form) as resp: if resp.status != 200: raise Exception(f"更新失败,状态码:{resp.status},响应:{await resp.text()}") # 可选:获取更新后的消息对象 updated_message = await message.channel.fetch_message(message.id) return updated_message
注意事项
- 机器人需要拥有
manage_messages权限才能修改消息附件。 - 如果要替换多附件,需在
attachments列表中对应每个要替换的ID,同时在files字段按顺序添加新文件。 - 若原消息无附件,这种方法无法直接添加新附件(只能替换已有附件),添加附件需重新发送消息。
内容的提问来源于stack exchange,提问作者Questionner
相关产品推荐
相关产品推荐

