@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。
aiogram.Dispatcher
类解析原始电报更新并将其解析和解压缩到相应的处理程序,例如dp.message_handler
将收到包含message
的更新的aiogram.types.Message
,dp.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",因为它是第一个匹配处理程序,并且只调用了一个处理程序。
机器人在群聊中具有所谓的"隐私模式",因此并非每条消息都会在群组中发送给您的机器人。在私人(直接)消息中并非如此,因此最好私下测试机器人。可以在官方机器人 API 文档中阅读有关隐私模式的更多信息:https://core.telegram.org/bots#privacy-mode。
使用每个类中包含的快捷方式更好,更具可读性,例如,您可以
.reply()
或.answer()
到aiogram.types.Message
,这是aiogram.Bot.send_message()
的快捷方式。与下载文件相同,您只需在aiogram.types.Document
,aiogram.types.PhotoSize
等上使用.download()
。您可以通过查找实现aiogram.types.mixins.Downloadable
的类来查找更多可下载的类型。所有
.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")