python - 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.
`
解决方案
我已经阅读了一些不和谐的 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)。我还建议您在命令中添加一些边缘情况处理,以确保实际上有一个附加到进程等。
推荐阅读
- javascript - chartjs - 如果值低于以前的值,如何使用不同的颜色?
- javascript - react-native-immediate-phone-call 不起作用
- iis - iis站点停止时添加自定义HTML页面
- c - 如何使用文件描述符删除 C 中的文件?
- reactjs - Next Js:如何在不显示客户端请求的情况下调用外部 REST API(网络选项卡)
- bash - 带有变量的 wget bash 脚本进入链接
- microsoft-graph-api - MS Teams 呼叫队列 - 等待时间
- java - Android清单:如何指定应用程序需要ToF传感器(飞行时间)?
- arrays - 分配给数组时 rand() 的初始值设定项无效
- javascript - 如何更改复选框材料表ReactJS的颜色