@Stariy2003

Как из Telegram-бота скачать файл с помощью telethon?

Пишу бота, который должен получать файлы от пользователя, обрабатывать их некоторым образом и отправлять обратно. Пока делал средствами telebot - все было нормально, но столкнулся с ограничением в 20 Мб на максимальный размер файла, а мне нужно 200-300 Мб. Посоветовали скачивать и отправлять файлы через telethon. Не получается, и не могу понять, что я делаю неправильно. Посоветуйте, как получить присланный пользователем файл и сохранить его на сервере с заданным именем. Упрощенный код бота:
from telethon.sync import TelegramClient
import os
import telebot
import config
from datetime import datetime
import asyncio


def get_or_create_eventloop():
    try:
        return asyncio.get_event_loop()
    except RuntimeError as ex:
        if "There is no current event loop in thread" in str(ex):
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            return asyncio.get_event_loop()


bot = telebot.TeleBot(config.tg_bot_token)
client = TelegramClient(config.tt_number, config.tt_api_id, config.tt_api_hash)
assert client.start(phone=config.tt_number)


@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, text="Привет!")


@bot.message_handler(content_types=["video"])
def handle_video(message):
    bot.send_message(message.chat.id, 'неправильно, отправь видео как документ')


@bot.message_handler(content_types=["document"])
def handle_document(message):
    bot.send_message(message.chat.id, 'Подожди немного...')
    if message.document.file_size > 100 * 1000 * 1000:
        bot.reply_to(message, "файл должен быть меньше 100 Мб")
        return

    file_info = bot.get_file(message.document.file_id)
    src = os.path.join(config.videos_dir, str(message.from_user.id) + datetime.now().strftime("%d_%m_%Y_%H_%M_%S"))
    ext = ".mp4"
    in_name = src + ext
    out_name = src + "_u" + ext
    get_or_create_eventloop()
    res = client.download_file(message.document, in_name)
##Тут будет некоторая обработка файла и сохранение его в out_name
    with open(out_name, "rb") as file:
        f = file.read()
        client.send_file(file_info.file_id, f)


bot.polling(none_stop=True)
  • Вопрос задан
  • 1039 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы