首页 > 解决方案 > Discord.py bot 将文件作为命令的参数

问题描述

我需要通过将文件附加到命令文本来将文件作为不和谐机器人命令的参数。我该怎么做?我目前有这个代码,但是该文件没有作为参数被拾取:

@bot.command()
async def upload_file(ctx, file:discord.File):
    f = file.fp
    txt = f.read().decode("utf-8")
    file.close()
    print(txt)

为什么文件没有作为参数传递?

而且,更重要的是,我怎样才能做到这一点?

确切的错误如下:

Ignoring exception in command upload_file:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/bot.py", line 863, in invoke
    await ctx.command.invoke(ctx)
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 721, in invoke
    await self.prepare(ctx)
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 685, in prepare
    await self._parse_arguments(ctx)
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 599, in _parse_arguments
    transformed = await self.transform(ctx, param)
  File "/usr/local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 445, in transform
    raise MissingRequiredArgument(param)
discord.ext.commands.errors.MissingRequiredArgument: file is a required argument that is missing.
`

标签: pythonpython-3.xdiscorddiscord.pydiscord.py-rewrite

解决方案


我已经阅读了一些不和谐的 py 文档,并且我相信您以错误的方式解决了这个问题。命令参数通过它看到的消息的纯文本上下文简单地解析,因此不会以这种方式拾取在那里放置附件,但您仍然可以做您想做的事情,尽管以不同的方式。

关键是命令(ctx)的上下文参数:https ://discordpy.readthedocs.io/en/latest/ext/commands/api.html#discord.ext.commands.Context

查看文档,您会看到它有一个 Message 实例: https ://discordpy.readthedocs.io/en/latest/api.html#discord.Message ,其中包含附件列表:https://discordpy。阅读thedocs.io/en/latest/api.html#discord.Attachment

附件有一个 url 参数,该参数存储附件上传到 discord 的位置(这是为什么不能将文件作为参数的关键,附件独立于 discord 机器人上传到 discord 的服务器)。url 参数将使您能够下载所述文件的内容并执行您想要对其进行的任何处理。所以这里有一些伪代码应该可以使用 requests 模块下载附件(同样,这都是粗略地浏览一下文档):

@bot.command()
async def upload_file(ctx):
    attachment_url = ctx.message.attachments[0].url
    file_request = requests.get(attachment_url)
    print(file_request.content)

回顾一下,当您将此命令与附件一起发送到您的机器人时,该附件会上传到 discords 服务器和一个 url,并且一些其他信息会与消息一起发送到您的命令机器人(以及其他任何收听的人)。要获取实际的文件数据,您必须从该 url 下载文件。从那里,你可以用它做任何你想做的事情。请注意,请求库是第 3 方,但比对 http 的内置支持要好得多(imo)。我还建议您在命令中添加一些边缘情况处理,以确保实际上有一个附加到进程等。


推荐阅读