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

Discord.py中'say'命令实现附件转发功能时触发InvalidArgument错误的问题排查咨询

Discord.py 'say' Command: InvalidArgument When Trying to Forward Attachments

我为我的Discord机器人编写了一个'say'命令,用来重复用户输入的内容,但在处理附件时总是触发错误。我的代码如下:

@commands.command(name = "say", aliases = ['s'], brief = "Repeats <message>", help = "Repeats <message> passed in after the command." )
@commands.cooldown(1, cmd_cd, commands.BucketType.user)
async def say(self, ctx, *, message):
    if ctx.message.attachments:
        await ctx.send(content=message, files=ctx.message.attachments)
    await ctx.send(message)

运行时会抛出错误:Command raised an exception: InvalidArgument: files parameter must be a list of File。根据Discord.py文档,ctx.message.attachments应该返回一个列表,为什么还会出现这个错误?我想要实现和用户发送方式完全一致的附件转发,请问能不能不用Embed做到这一点?


问题原因

你遇到这个错误的核心原因是:ctx.message.attachments返回的是discord.Attachment对象的列表,而不是discord.File对象的列表。ctx.send()的files参数只接受discord.File类型的对象列表,直接传入Attachment对象自然会触发参数错误。

解决方案

要实现和用户发送一致的附件转发,你完全不需要用Embed,只需要把每个Attachment对象转换成File对象即可。同时还要调整代码逻辑——原来的代码会在有附件时先发送一次带附件的消息,然后又单独发送一次纯文本消息,这会导致内容重复。

修改后的代码如下:

@commands.command(name = "say", aliases = ['s'], brief = "Repeats <message>", help = "Repeats <message> passed in after the command." )
@commands.cooldown(1, cmd_cd, commands.BucketType.user)
async def say(self, ctx, *, message=None):
    # 处理没有输入文本的情况(比如只发附件)
    message = message or ""
    
    files = []
    if ctx.message.attachments:
        # 把每个Attachment转换为File对象
        for attachment in ctx.message.attachments:
            file = await attachment.to_file()
            files.append(file)
    
    # 统一发送:如果有文件就带files参数,没有就只发文本
    await ctx.send(content=message, files=files)

额外说明

  • attachment.to_file()方法会异步从Discord服务器下载附件内容,并转换成discord.File对象,这是官方推荐的转换方式,能保证附件正确转发。
  • 我添加了message=None的默认值,并处理了message = message or ""的情况,这样用户只发送附件不输入文本时,命令也能正常工作。
  • 现在代码只会发送一次消息,避免了原来的重复发送问题,完全复刻用户的发送格式(文本+附件/纯附件/纯文本)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:27:44