You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用aiogram框架开发Telegram bot下载用户发送文件问题求解

'Message' object has no attribute 'file_id'报错是因为aiogram的Message对象不会直接携带file_id属性,当接收到文档类消息时,文件元数据都存储在message.document属性中,同时你不能直接把file_id传给需要types.File类型参数的方法,需要先调用接口获取文件实例。

修正后完整可运行代码如下:

import os
import re
from aiogram import types
# 请确保此处已正确初始化dp和bot实例

def checkFile(path):
    if os.path.isfile(path):
        # 用with上下文管理器自动关闭文件,避免句柄泄漏
        with open(path, 'r', encoding='utf-8') as f:
            log = f.read()
            print('начинаю проверку...')
            # 匹配日志版本
            result = re.search('MoonLoader v.(.+) loaded.', log)
            if result:
                moonlog_version = result.group(1)
                print(f'• Версия moonloader: {moonlog_version}')
                # 请确保errors变量已提前定义
                for err in range(0, len(errors)):
                    for i in errors[err]:
                        print(f'   • Ошибка: {errors[err][i]}')

async def download_file(file_id: str, save_path: str):
    # 通过file_id获取文件实例
    file: types.File = await bot.get_file(file_id)
    # 下载文件到指定路径
    await bot.download_file(file.file_path, save_path)

@dp.message_handler(content_types=types.ContentType.DOCUMENT)
async def fileHandle(message: types.Message):
    await message.reply(text='файл получен, начинаю поиск ошибок...')
    # 从document属性中提取file_id
    doc_file_id = message.document.file_id
    # 按需求指定完整保存路径
    target_path = r'C:\text-folder\moonloader.log'
    # 异步调用下载方法
    await download_file(doc_file_id, target_path)
    # 下载完成后执行日志检查
    checkFile(target_path)

注意事项:

  • 与bot交互的get_file、download_file都是异步方法,必须加await调用,对应的函数也要声明为async
  • 保存路径需填写完整的文件名,不要仅传文件夹路径,否则会触发下载错误
  • fileHandle接收的参数是types.Message类型,并非types.Document类型

内容的提问来源于stack exchange,提问作者chapo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:27:01