Ласкаво просимо на чергову порцію знань про 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.
Практичне застосування
Отже, як використовувати ці знання в реальних проєктах?
- Моніторинг активності: сповіщення про нові повідомлення, аналіз кількості постів за певний період.
- Збір даних: вивантаження повідомлень або учасників для аналітики.
- Автоматизація роботи: створення чат-ботів, які відповідають на певні ключові слова або команди.
- Управління спільнотою: вивантаження даних про нових підписників, автоматичне вітання.
Переходимо до наступної частини курсу, де ми будемо працювати з обробкою повідомлень у реальному часі. А поки — експериментуйте з кодом вище!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ