You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键说明

  1. 顺序很重要:必须先读取附件内容,再删除原消息,否则原消息删除后无法再获取附件数据。
  2. 内存中处理文件:用BytesIO将附件内容存在内存里,避免在repl.it这类环境中处理本地文件的问题。
  3. 引用上传的文件:嵌入消息中通过attachment://{文件名}的方式引用附带的文件,Discord会自动生成永久有效的图片链接。

内容的提问来源于stack exchange,提问作者darkcatsenpai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:30:55