Я работаю над скриптом, который скачивает фото и видео, а также текст нескольких постов телеграм-канала. Задача состоит в том, чтобы для каждого сообщения создать отдельную папку (в качестве имени - 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())