如何下载发送到我的机器人的文件?


@dp.message_handler(content_types=types.ContentType.DOCUMENT)
async def scan_message(file: types.File):
print("downloading document")
file_path = file.file_path
destination = r"C:usersaleksPycharmProjectspythonProjectfile.pdf"
destination_file = bot.download_file(file_path, destination)
print("success")

我希望能够下载用户发送给我的机器人的文件(在本例中为 pdf)。但问题是机器人甚至无法识别文件(当我发送文件时,它甚至不会打印"正在下载文档")

TL;博士

我希望您使用的是 aiogram v2.x。

确保这是没有筛选器types.ContentType.DOCUMENT的唯一处理程序,并且机器人可以获取所需的更新,然后:

@dp.message_handler(content_types=types.ContentType.DOCUMENT)
async def scan_message(message: types.Message):
print("downloading document")
destination = r"C:usersaleksPycharmProjectspythonProjectfile.pdf"
await message.document.download(destination)
print("success")
<小时 />

详细

下面描述的所有内容都适用于稳定图形 v2.x。

  1. aiogram.Dispatcher类解析原始电报更新并将其解析和解压缩到相应的处理程序,例如dp.message_handler将收到包含message的更新的aiogram.types.Messagedp.callback_query_handler将收到包含callback_query等更新的aiogram.types.CallbackQuery。在您的情况下,您期待aiogram.types.File,这是错误的。然后调度程序检查过滤器并按注册顺序调用相应的处理程序,并在调用任何处理程序时停止调度。

    请考虑以下示例:

    # Some code omitted in favor of brievity
    @dp.message_handler()
    async def handle1(msg: types.Message):
    print("handled 1")
    @dp.message_handler()
    async def handle2(msg: types.Message):
    print("handled 2")
    

    您发送任何短信,然后查看机器人的控制台。只会打印"handle 1",因为它是第一个匹配处理程序,并且只调用了一个处理程序。

  2. 机器人
  3. 在群聊中具有所谓的"隐私模式",因此并非每条消息都会在群组中发送给您的机器人。在私人(直接)消息中并非如此,因此最好私下测试机器人。可以在官方机器人 API 文档中阅读有关隐私模式的更多信息:https://core.telegram.org/bots#privacy-mode。

  4. 使用每个类中包含的快捷方式更好,更具可读性,例如,您可以.reply().answer()aiogram.types.Message,这是aiogram.Bot.send_message()的快捷方式。与下载文件相同,您只需在aiogram.types.Documentaiogram.types.PhotoSize等上使用.download()。您可以通过查找实现aiogram.types.mixins.Downloadable的类来查找更多可下载的类型。

  5. 所有.download()方法都返回保存文件的目标。如果您将自己的可选目标作为方法的第一个参数传递给该方法,则将其取回将毫无用处,因为您已经知道它。

因此,经过这些修改后,您将获得 TL 中的代码;DR 部分。

您没有指定 aiogram 的版本。我想是2.x。

所有异步函数注册,作为消息处理程序必须接受接收消息的第一个位置参数。如果你喜欢类型提示,你必须将你的函数指定为

async def scan_message(message: types.Message):

要下载您的文档,您只需要:

destination_file = await message.document.download(destination)

因此,下载文档的正确处理程序是:

async def scan_message(message: types.Message):
print("downloading document")
destination = r"C:usersaleksPycharmProjectspythonProjectfile.pdf"
destination_file = await message.document.download(destination)
print("success")

相关内容

  • 没有找到相关文章

最新更新