Discord.py机器人图片引用后失效问题求助
解决Discord.py机器人删除原消息后嵌入图片失效的问题
问题根源在于Discord原消息的附件URL是临时绑定到原消息的,一旦原消息被删除,这个URL就会失效。要解决这个问题,需要让机器人先获取附件内容,再以自己的身份重新上传,这样生成的图片URL就不会随原消息删除而失效。
具体修改方案
核心思路是先读取附件内容,再删除原消息,最后将附件作为机器人的上传文件发送,同时在嵌入消息中引用这个上传的文件:
from io import BytesIO import discord # 检查前缀 if message.content.startswith("dq "): # 先处理附件(必须在删除原消息前完成) discord_file = None if message.attachments: attachment = message.attachments[0] # 将附件内容读取到内存中的BytesIO对象,无需本地保存 file_buffer = BytesIO(await attachment.read()) # 创建Discord文件对象,保留原文件名 discord_file = discord.File(file_buffer, filename=attachment.filename) else: # 可选:如果没有附件,发送提示后退出 await message.channel.send("请附带需要引用的图片!") await message.delete() return # 删除原消息 await message.delete() # 处理上下文文本 quot = message.content.split("//") context = "" if len(quot) == 1: text = quot[0].split() if text: text.pop(0) # 移除前缀"dq" context = "*" + " ".join(text) + "*" # 创建嵌入消息 embeda = discord.Embed(title=context, color=0xffffff) # 使用attachment://{文件名}引用机器人上传的文件 embeda.set_image(url=f"attachment://{attachment.filename}") embeda.set_footer(text=f"({message.author.name})") # 发送嵌入消息和附带的文件 await message.channel.send(embed=embeda, file=discord_file)
关键说明
- 顺序很重要:必须先读取附件内容,再删除原消息,否则原消息删除后无法再获取附件数据。
- 内存中处理文件:用
BytesIO将附件内容存在内存里,避免在repl.it这类环境中处理本地文件的问题。 - 引用上传的文件:嵌入消息中通过
attachment://{文件名}的方式引用附带的文件,Discord会自动生成永久有效的图片链接。
内容的提问来源于stack exchange,提问作者darkcatsenpai
相关产品推荐
相关产品推荐

