Как спарсить из телеграм-канала сообщения, опубликованные за последние 5 минут? (Python, Telethon)

Рейтинг: 2Ответов: 1Опубликовано: 31.07.2023

Есть задача спарсить и загрузить в json-файл сообщения из определенного телеграм-канала с помощью Python (я использую библиотеку Telethon).
Но нужны не все посты, а только те, что были опубликованы за последнее время, например, 5 минут.
Для получения всех сообщений использовал такой код:

from telethon import TelegramClient
from telethon.errors import SessionPasswordNeededError
from telethon.tl.functions.messages import (GetHistoryRequest)
from telethon.tl.types import (
    PeerChannel
)
        
# Setting configuration values
api_id = 57272
api_hash = '...'
        
        
phone = '...'
username = '...'
        
# Create the client and connect
client = TelegramClient(username, api_id, api_hash)

async def main(phone):
    await client.start()
    print("Client Created")
    # Ensure you're authorized
    if await client.is_user_authorized() == False:
        await client.send_code_request(phone)
        try:
            await client.sign_in(phone, input('Enter the code: '))
        except SessionPasswordNeededError:
            await client.sign_in(password=input('Password: '))
        
        me = await client.get_me()
        
        user_input_channel = input('enter entity(telegram URL or entity id):')
        
        if user_input_channel.isdigit():
            entity = PeerChannel(int(user_input_channel))
        else:
            entity = user_input_channel
        
        my_channel = await client.get_entity(entity)
        
        offset_id = 0
        limit = 100
        all_messages = []
        total_messages = 0
        total_count_limit = 0
        
        while True:
            print("Current Offset ID is:", offset_id, "; Total Messages:", total_messages)
            history = await client(GetHistoryRequest(
                peer=my_channel,
                offset_id=offset_id,
                offset_date=None,
                add_offset=0,
                limit=limit,
                max_id=0,
                min_id=0,
                hash=0
            ))
            if not history.messages:
                break
            messages = history.messages
            for message in messages:
                all_messages.append(message.to_dict())
            offset_id = messages[len(messages) - 1].id
            total_messages = len(all_messages)
            if total_count_limit != 0 and total_messages >= total_count_limit:
                break
        
        
with client:
    client.loop.run_until_complete(main(phone))

Как теперь заставить его парсить только последние сообщения?

Ответы

▲ 0

Могу предложить использовать словарь, в который будет вноситься информация вида:

dict ={"key": "msg_id"}

key - к примеру, первое предложение сообщение. msg_id - id сообщения.

Используя конструкцию вида:

first_msg = next(iter(dict))
if len(dict) > 5:
     dict.pop(first_msg)

Можно отслеживать, чтобы длина словаря не превышала пяти сообщений, а если превысит - то удалится самое старое сообщение.