narzantaria
@narzantaria
Программист С++, JavaScript, Node.js, React

Как корректно скачать тексты и медиафайлы телеграм-канала?

Я работаю над скриптом, который скачивает фото и видео, а также текст нескольких постов телеграм-канала. Задача состоит в том, чтобы для каждого сообщения создать отдельную папку (в качестве имени - id сообщения), и в эту папку скачать медиафайлы сообщения, а также сохранить текст. И так для каждого сообщения. Все происходит в цикле с заданным лимитом. Скрипт работает корректно, если у каждого сообщения только по одному фото или видео. Однако если в каком-то или во всех сообщениях по несколько медиафайлов, то процесс сбивается. Папки создаются, но фото скачиваются поодиночке и не в свои папки. Также и текст сохраняется только в некоторых папках.
Даже не знаю, где может быть моя ошибка - в методах библиотеки Pyrogram, или нужно вызвать методы самого Telegram API, или ошибка в коде самого Python.
Я не программист Python и не до конца понимаю, как в нем работает асинхронность. Подскажите пожалуйста, как модифицировать код, чтобы он корректно скачивал данные. То есть, в каждой созданной папке сохранялся текст сообщения, и все его медиа-файлы. или один. Для примера я привел телеграм-канал про Подмосковье, где как раз любят к каждому посту прикреплять по несколько фото. Буду весьма признателен за вашу помощь. Вот код:
import os
from pyrogram import Client

api_id = api_id
api_hash = "api_hash"
channel_name = 'wondermoscow'
docs_limit = 3

# init app
app = Client("my_name", api_id=api_id, api_hash=api_hash)

async def main():
  # check directory exists/create
  if not os.path.isdir(channel_name):
    os.mkdir(channel_name)

  await app.start()
  chat = await app.get_chat(channel_name) 

  async for message in app.get_chat_history(chat.id, limit=docs_limit):
    doc_folder = os.path.join(channel_name, str(message.id))
    os.mkdir(doc_folder)
    if(message.photo or message.video):
      await app.download_media(message)
      # copy downloaded content
      await move_files('downloads',doc_folder)
    text = str(message.caption)
    with open(os.path.join(doc_folder,'data.txt'), 'w', encoding='utf-8') as file:
      file.write(text)

# move files drim one directory to another
async def move_files(src,dest):
  # gather all files
  allfiles = os.listdir(src)
  # iterate on all files to move them to destination folder
  for f in allfiles:
    src_path = os.path.join(src, f)
    dst_path = os.path.join(dest, f)
    os.rename(src_path, dst_path)

app.run(main())
  • Вопрос задан
  • 504 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы