Найти - Пользователи
Полная версия: Не удается корректно скачать тексты и медиафайлы телеграм-канала с помощью Pyrogram
Начало » Python для новичков » Не удается корректно скачать тексты и медиафайлы телеграм-канала с помощью Pyrogram
1
kiten
Я работаю над скриптом, который скачивает фото и видео, а также текст нескольких постов телеграм-канала. Задача состоит в том, чтобы для каждого сообщения создать отдельную папку (в качестве имени - 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())
kiten
Проблема решена.
py.user.next
kiten
Я работаю над скриптом, который скачивает фото и видео, а также текст нескольких постов телеграм-канала. Задача состоит в том, чтобы для каждого сообщения создать отдельную папку (в качестве имени - id сообщения), и в эту папку скачать медиафайлы сообщения, а также сохранить текст. И так для каждого сообщения. Все происходит в цикле с заданным лимитом.
Ну это всё не так делается, как у тебя написано.

Надо декомпозировать код на функции. Функции вызывают функции, которые вызывают функции, которые вызывают функции. Поэтому-то ты и не можешь поправить его - весь код представляет из себя не структурированную конструкцию, а кашу-малашу. К тому же всё это приправлено асинхронностью, которую новичкам рано изучать в любом случае.

Здесь писал, как учиться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB