首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python中的aiogram bot框架从Telegram下载一个文件

使用Python中的aiogram bot框架从Telegram下载一个文件
EN

Stack Overflow用户
提问于 2021-09-09 17:17:16
回答 2查看 4K关注 0票数 0

如何下载用户在聊天中发送的文件?

例如

我需要从电报下载文件moonloader.log到我的本地路径C:\text-folder\moonloader.log并阅读它。

目前为止的代码

代码语言:javascript
运行
复制
def checkFile(path):
    if os.path.isfile(path):
        f = open(path, 'r')
        log = f.read()
        print('начинаю проверку...')
        # check log
        result = re.search('MoonLoader v.(.+) loaded.', log)
        if result:
            moonlog_version = result.group(1)
            print('• Версия moonloader: ' + moonlog_version)
            for err in range(0, len(errors)):
                for i in errors[err]:
                    print('   • Ошибка: ' + errors[err][i])

# ON RECEIVE FILE 
@dp.message_handler(content_types=types.ContentType.DOCUMENT)
async def fileHandle(message: types.File):
    await message.reply(text='файл получен, начинаю поиск ошибок...')
    ## LOAD FILE CODE
    checkFile(LOADED FILE PATH)

更新代码

我试着遵循answer of hc_dev并添加了下载方法。但不知道如何从Filefile_path获得message。我试过这个:

代码语言:javascript
运行
复制
def download_file(file: types.File):
    file_path = file.file_path 
    destination = r'C:\\Users\\admin\\Desktop\\moonlog inspector\\download'
    destination_file = bot.download_file(file_path, destination) # ON RECEIVE FILE 

@dp.message_handler(content_types=types.ContentType.DOCUMENT)
async def fileHandle(message: types.Document):
    await message.reply(text='файл получен, начинаю поиск ошибок...')
    ## LOAD FILE CODE
    download_file(message.file_id)

但是,当运行时,它会引发错误:

'Message‘对象没有属性'file_id'

EN

回答 2

Stack Overflow用户

发布于 2021-09-09 18:01:14

以下问题欢迎并解释了电报Bot中新的getFile操作:How do I download a file or photo that was sent to my Telegram bot?

在aiogram中,您可以在download_file对象上使用Bot:作为参数,您可以传递字符串file_path (在电报服务器上标识文件的路径)和本地卷上的destination

file_pathtypes.File对象的属性。

代码语言:javascript
运行
复制
bot = # your_bot accessing Telegram's API

def download_file(file: types.File):
     file_path = file.file_path
     destination = r"C:\folder\file.txt"
     destination_file = bot.download_file(file_path, destination)
票数 0
EN

Stack Overflow用户

发布于 2022-04-05 17:58:23

如果不想在本地保存文件,可以使用。在我的项目中,我习惯于保存这样的文件:

代码语言:javascript
运行
复制
@dp.message_handler(content_types=['photo', 'document'])
async def photo_or_doc_handler(message: types.Message):
    file_in_io = io.BytesIO()
    if message.content_type == 'photo':
        await message.photo[-1].download(destination_file=file_in_io)
    elif message.content_type == 'document':
        await message.document.download(destination_file=file_in_io)
    # file_in_io - do smth with this file-like object

或者使用上下文管理器:

代码语言:javascript
运行
复制
async with io.BytesIO() as file_in_io:
    await message.photo[-1].download(destination_file=file_in_io)
    file_in_io.seek(0)
    # file_in_io - do smth with this file-like object
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69122337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档