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
相关产品推荐
相关产品推荐

