JavaRush /Курси /Модуль 4: FastAPI /Отримання даних з каналів і чатів Telegram

Отримання даних з каналів і чатів Telegram

Модуль 4: FastAPI
Рівень 19 , Лекція 3
Відкрита

Ласкаво просимо на чергову порцію знань про Telethon і Telegram API! Сьогодні зануримось в одну з найцікавіших і найкорисніших практичних задач: роботу з каналами й чатами Telegram. Ми вивчимо, як підключатися до каналів і груп, витягувати повідомлення, отримувати список учасників і налаштовувати сповіщення про нові події. Поїхали!

Чим відрізняються канали й групи?

Перш ніж лізти в код, треба зрозуміти, що Telegram розділяє чати на кілька типів:

  • Групи: орієнтовані на спілкування між учасниками. Усі можуть писати, лайкати, флеймити (якщо дозволено).
  • Канали: більше схожі на стрічки новин, де адміністратори публікують контент, а підписники просто читають (і іноді коментують, якщо це дозволено).

Telethon дозволяє працювати з обома видами, але підходи до обробки інформації можуть трохи відрізнятися.

Підключення до чату або каналу

Найперше розберемося, як узагалі підключитися до групи чи каналу. У Telethon це робиться через об'єкт client. Для отримання повідомлень нам потрібно "підписатися" на чат.

Приклад підключення до чату і отримання інформації:


from telethon.sync import TelegramClient

# Ваші облікові дані
API_ID = 'ваш_api_id'
API_HASH = 'ваш_api_hash'
SESSION = 'example_session'

# Ініціалізація клієнта
client = TelegramClient(SESSION, API_ID, API_HASH)

async def fetch_chat_info():
    # Підключаємося
    async with client:
        # Отримуємо інформацію про чат або канал
        chat = await client.get_entity('t.me/example_channel_or_group')
        print(f"Назва: {chat.title}")
        print(f"ID чату: {chat.id}")
        print(f"Посилання: {chat.username}")

# Запуск асинхронної функції
import asyncio
asyncio.run(fetch_chat_info())

У цьому прикладі ми підключаємося до конкретного чату або каналу за його короткою посиланням (t.me/example_channel_or_group) і витягуємо базову інформацію: назва, ID і username. Не забудьте замінити на реальні дані!


Вилучення інформації

Окей, ми підключилися. Але ж найцікавіше — це дані, правда? Давайте навчимося вивантажувати історію повідомлень і список учасників.

Отримання історії повідомлень

Ми можемо вивантажувати історію повідомлень за допомогою методу client.iter_messages. Він дозволяє обробляти повідомлення асинхронно.

Приклад витягання останніх 10 повідомлень:


async def fetch_messages():
    async with client:
        # Вказуємо чат, з якого будемо тягти повідомлення
        async for message in client.iter_messages('t.me/example_channel_or_group', limit=10):
            print(f"[{message.date}] {message.sender_id}: {message.text}")

# Запуск функції
asyncio.run(fetch_messages())

Цей код дістає останні 10 повідомлень із чату example_channel_or_group. Зауважте: message.text містить текст повідомлення, а message.sender_id — ID відправника.

Навіщо це може знадобитись?

  • Моніторинг новин: автоматична вивантаження повідомлень і сповіщення користувачів.
  • Аналіз даних: наприклад, побудова графіків активності в групах.
  • Архівування повідомлень: збереження локальної копії чату.

Отримання списку учасників

Тепер займемося одним із найкрутіших аспектів роботи з чатами — витягненням списку учасників. Це може бути корисно для аналізу аудиторії.

Приклад отримання списку учасників:


async def fetch_participants():
    async with client:
        # Отримуємо об'єкт чату
        chat = await client.get_entity('t.me/example_group')

        # Витягуємо всіх учасників
        participants = await client.get_participants(chat)

        # Виводимо інформацію про кожного учасника
        for participant in participants:
            print(f"ID: {participant.id}, Ім'я: {participant.first_name}, Прізвище: {participant.last_name}")

# Запуск функції
asyncio.run(fetch_participants())

Цей скрипт підключається до вказаного чату і виводить ID, ім'я і прізвище кожного учасника. Для каналів теж працює, але список учасників може бути обмежений (Telegram не завжди повертає всіх підписників каналу).


Налаштування сповіщень про нові повідомлення

Потрібне автоматичне сповіщення, коли в групі з'являється нове повідомлення? Це легко зробити за допомогою обробників подій у Telethon!

Обробник нових повідомлень додається через декоратор client.on. Наприклад:


from telethon import events

async def new_message_handler():
    async with client:
        @client.on(events.NewMessage(chats='t.me/example_channel_or_group'))
        async def message_listener(event):
            print(f"Нове повідомлення від {event.sender_id}: {event.text}")

        print("Слухаємо чат...")
        await client.run_until_disconnected()

# Запуск функції
asyncio.run(new_message_handler())

Цей код слухає вказаний чат і виводить текст кожного нового повідомлення. Ти можеш змінити поведінку, наприклад, надсилати сповіщення на email або обробляти команди.


Типові помилки та підводні камені

Коли починаєш працювати з Telegram API, можна зіткнутися з деякими сюрпризами:

  • Помилка "FloodWait": Telegram може обмежувати частоту запитів, якщо ти занадто активний. Рішення — додати штучні затримки (await asyncio.sleep(1)).
  • Недостатньо прав: переконайся, що твій акаунт або бот має доступ до чату або каналу.
  • Неповний список учасників: ти можеш отримати тільки публічні дані учасників.

Не бійтесь цих проблем — це природна частина взаємодії з API.


Практичне застосування

Отже, як використовувати ці знання в реальних проєктах?

  1. Моніторинг активності: сповіщення про нові повідомлення, аналіз кількості постів за певний період.
  2. Збір даних: вивантаження повідомлень або учасників для аналітики.
  3. Автоматизація роботи: створення чат-ботів, які відповідають на певні ключові слова або команди.
  4. Управління спільнотою: вивантаження даних про нових підписників, автоматичне вітання.

Переходимо до наступної частини курсу, де ми будемо працювати з обробкою повідомлень у реальному часі. А поки — експериментуйте з кодом вище!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ