@nerdhhh

Можно ли скрапить телеграмм?

Недавно у меня появилась задача - собирать статистику по телеграм каналам, условно - есть пост id по нему нужно получить количество реакций/просмотров/комментариев.
В базовом апи для ботов такого нет, только в апи для клиентов, но насколько это не противоречит правилам телеграм? У них на этот счёт нет никаких четких правил, не хочется получить бан на аккаунт.
Также есть ещё библиотека telethon она вроде умеет скрапить посты в телеграмм, если не ошибаюсь, но тут тоже вопрос, насколько это безопасно?
Может кто то реализовал уже?
Буду рада любой обратной связи
  • Вопрос задан
  • 288 просмотров
Пригласить эксперта
Ответы на вопрос 1
Код
from pyrogram import Client
from pyrogram.errors import FloodWait
import asyncio


async def get_post_stats(client: Client, channel_id: int, message_id: int):
    """
    Получает статистику поста: просмотры, реакции и количество комментариев.

    Args:
        client: Экземпляр клиента Pyrogram
        channel_id: ID канала
        message_id: ID сообщения

    Returns:
        dict: Словарь со статистикой
    """
    try:
        # Получаем сообщение
        message = await client.get_messages(channel_id, message_id, replies=-1)

        # Получаем статистику просмотров
        views = message.views if message.views else 0

        # Получаем реакции
        reactions = {}
        if message.reactions:
            for reaction in message.reactions.reactions:
                reaction_id = reaction.custom_emoji_id if reaction.custom_emoji_id else reaction.emoji
                reactions[reaction_id] = reaction.count

        comments_count = await client.get_discussion_replies_count(channel_id, message_id)
        stats = {
            "views": views,
            "reactions": reactions,
            "forwards": message.forwards or 0,
            "comments": comments_count
        }

        return stats

    except FloodWait as e:
        print(f"Превышен лимит запросов, ждем {e.value} секунд")
        await asyncio.sleep(e.value)
        return await get_post_stats(client, channel_id, message_id)
    except Exception as e:
        print(f"Произошла ошибка: {e}")
        return None


# Пример использования
async def main():
    # Замените на свои данные
    api_id = "0"
    api_hash = "0"
    channel_id = -1 # ID канала
    message_id = 1 # ID сообщения

    async with Client("my_account", api_id=api_id, api_hash=api_hash) as app:
        stats = await get_post_stats(app, channel_id, message_id)
        if stats:
            print(f"Просмотры: {stats['views']}")
            print(f"Переслали: {stats['forwards']}")
            print(f"Реакции: {stats['reactions']}")
            print(f"Комментарии: {stats['comments']}")


if __name__ == "__main__":
    asyncio.run(main())


Вывод:
Просмотры: 1
Реакции: {'': 1, '❤': 1}
Комментарии: 1
Ответ написан
Ваш ответ на вопрос

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

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