Парсер Telegram-каналов: экспорт сообщений в CSV
Промпт генерирует готовый Python-скрипт для парсинга Telegram-каналов с сохранением сообщений, дат и медиа-ссылок в CSV-файл.
Готовый промпт
Роль: Ты - опытный Python-разработчик, специализирующийся на автоматизации и работе с Telegram API. Задача: Напиши полноценный Python-скрипт для парсинга публичного Telegram-канала [название_канала] с экспортом данных в CSV-файл. Требования к скрипту: 1. Библиотека: Telethon (asyncio-based). Версия Python: 3.10+. 2. Авторизация через переменные окружения: APIID, APIHASH, PHONE (загружать из .env через python-dotenv). 3. Парсить последние [количество_сообщений] сообщений из канала. 4. Для каждого сообщения извлекать: - id сообщения - дату и время (UTC, ISO 8601) - текст сообщения (очищенный от HTML-тегов) - тип медиа (photo / video / document / none) - количество просмотров - количество реакций (сумма всех) - ссылку на сообщение (https://t.me/channel/id) 5. Реализовать пагинацию через iter_messages с лимитом. 6. Фильтр по дате: экспортировать только сообщения начиная с [дата_начала] (формат YYYY-MM-DD). Если поле пустое - без фильтра. 7. Сохранять результат в файл [имя_файла].csv с разделителем «;» и кодировкой UTF-8-BOM (для корректного открытия в Excel). 8. Добавить прогресс-бар через tqdm. 9. Логировать ошибки через модуль logging (уровень WARNING и выше) в файл parser.log. 10. Обработать исключения: FloodWaitError, ChannelPrivateError, UsernameNotOccupiedError. Формат ответа: - Сначала выведи полный код скрипта в одном блоке. - После кода - блок «Зависимости» с командой pip install для всех нужных библиотек. - Затем - блок «Настройка .env» с примером файла .env. - В конце - блок «Запуск» с командой запуска и примером вывода в терминале. Ограничения: - Не использовать Bot API - только User API через Telethon. - Не использовать сторонние парсеры типа snscrape. - Весь код должен быть покрыт type hints. - Добавить docstring к каждой функции. - Не хардкодить токены и учётные данные в коде.
Заполнить переменные 4
Подставьте свои значения — промпт обновится автоматически.
Ваш промпт
Роль: Ты - опытный Python-разработчик, специализирующийся на автоматизации и работе с Telegram API. Задача: Напиши полноценный Python-скрипт для парсинга публичного Telegram-канала [название_канала] с экспортом данных в CSV-файл. Требования к скрипту: 1. Библиотека: Telethon (asyncio-based). Версия Python: 3.10+. 2. Авторизация через переменные окружения: APIID, APIHASH, PHONE (загружать из .env через python-dotenv). 3. Парсить последние [количество_сообщений] сообщений из канала. 4. Для каждого сообщения извлекать: - id сообщения - дату и время (UTC, ISO 8601) - текст сообщения (очищенный от HTML-тегов) - тип медиа (photo / video / document / none) - количество просмотров - количество реакций (сумма всех) - ссылку на сообщение (https://t.me/channel/id) 5. Реализовать пагинацию через iter_messages с лимитом. 6. Фильтр по дате: экспортировать только сообщения начиная с [дата_начала] (формат YYYY-MM-DD). Если поле пустое - без фильтра. 7. Сохранять результат в файл [имя_файла].csv с разделителем «;» и кодировкой UTF-8-BOM (для корректного открытия в Excel). 8. Добавить прогресс-бар через tqdm. 9. Логировать ошибки через модуль logging (уровень WARNING и выше) в файл parser.log. 10. Обработать исключения: FloodWaitError, ChannelPrivateError, UsernameNotOccupiedError. Формат ответа: - Сначала выведи полный код скрипта в одном блоке. - После кода - блок «Зависимости» с командой pip install для всех нужных библиотек. - Затем - блок «Настройка .env» с примером файла .env. - В конце - блок «Запуск» с командой запуска и примером вывода в терминале. Ограничения: - Не использовать Bot API - только User API через Telethon. - Не использовать сторонние парсеры типа snscrape. - Весь код должен быть покрыт type hints. - Добавить docstring к каждой функции. - Не хардкодить токены и учётные данные в коде.
Как использовать
- Заполните плейсхолдеры: Укажите username канала (без @), желаемое количество сообщений, дату начала (или оставьте пустой) и имя выходного файла.
- Вставьте промпт в ChatGPT (GPT-4o) или Claude: Скопируйте заполненный промпт и отправьте в чат. Модель сгенерирует полный скрипт с инструкциями.
- Создайте .env файл: Скопируйте пример из блока «Настройка .env» и заполните своими API_ID, API_HASH и номером телефона. Получить ключи можно на my.telegram.org.
- Установите зависимости: Выполните команду pip install из блока «Зависимости» в своём виртуальном окружении.
- Запустите скрипт: При первом запуске Telethon запросит код подтверждения из Telegram. После авторизации скрипт создаст .session файл и начнёт парсинг с прогресс-баром.
- Откройте CSV: Файл сохранится в кодировке UTF-8-BOM - Excel откроет его корректно без дополнительных настроек.
Пример результата
import asyncio
import csv
import logging
import os
from datetime import datetime, timezone
from html.parser import HTMLParser
from typing import Optional
from dotenv import load_dotenv
from telethon import TelegramClient
from telethon.errors import ChannelPrivateError, FloodWaitError, UsernameNotOccupiedError
from telethon.tl.types import Message
from tqdm.asyncio import tqdm
load_dotenv()
logging.basicConfig(filename="parser.log", level=logging.WARNING)
logger = logging.getLogger(__name__)
API_ID: int = int(os.environ["API_ID"])
API_HASH: str = os.environ["API_HASH"]
PHONE: str = os.environ["PHONE"]
class _HTMLStripper(HTMLParser):
"""Strips HTML tags from a string."""
def __init__(self) -> None:
super().__init__()
self._parts: list[str] = []
def handle_data(self, data: str) -> None:
self._parts.append(data)
def get_text(self) -> str:
return "".join(self._parts)
def strip_html(text: str) -> str:
"""Remove HTML tags from message text."""
s = _HTMLStripper()
s.feed(text)
return s.get_text()
def get_media_type(msg: Message) -> str:
"""Determine media type of a Telegram message."""
if msg.photo:
return "photo"
if msg.video:
return "video"
if msg.document:
return "document"
return "none"
async def parse_channel(
channel: str,
limit: int,
output_file: str,
date_from: Optional[datetime] = None,
) -> None:
"""Parse Telegram channel and export messages to CSV."""
async with TelegramClient("session", API_ID, API_HASH) as client:
await client.start(phone=PHONE)
try:
entity = await client.get_entity(channel)
except (ChannelPrivateError, UsernameNotOccupiedError) as e:
logger.warning("Cannot access channel %s: %s", channel, e)
return
rows: list[dict] = []
try:
async for msg in tqdm(client.iter_messages(entity, limit=limit), total=limit):
if not isinstance(msg, Message):
continue
if date_from and msg.date.replace(tzinfo=timezone.utc) < date_from:
break
reactions_count = 0
if msg.reactions:
reactions_count = sum(r.count for r in msg.reactions.results)
rows.append({
"id": msg.id,
"date": msg.date.isoformat(),
"text": strip_html(msg.text or ""),
"media_type": get_media_type(msg),
"views": msg.views or 0,
"reactions": reactions_count,
"link": f"https://t.me/{channel}/{msg.id}",
})
except FloodWaitError as e:
logger.warning("FloodWait: sleeping %s seconds", e.seconds)
await asyncio.sleep(e.seconds)
with open(f"{output_file}.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys(), delimiter=";")
writer.writeheader()
writer.writerows(rows)
print(f"✅ Сохранено {len(rows)} сообщений → {output_file}.csv")
if __name__ == "__main__":
asyncio.run(parse_channel(
channel="bbcrussian",
limit=500,
output_file="telegram_export",
date_from=datetime(2024, 1, 1, tzinfo=timezone.utc),
))
Зависимости: pip install telethon python-dotenv tqdm
.env: API_ID=12345678 | API_HASH=abcdef... | PHONE=+79001234567
Советы и вариации
-
Увеличьте скорость парсинга: Добавьте параметр
wait_time=0вiter_messagesдля каналов с большим архивом, но будьте осторожны с FloodWait от Telegram. -
Парсинг нескольких каналов: Попросите ИИ обернуть вызов функции в цикл по списку каналов и добавить задержку
asyncio.sleep(2)между каналами, чтобы избежать бана. -
Фильтрация по ключевым словам: Добавьте в промпт требование фильтровать сообщения по списку ключевых слов
[ключевые_слова]- ИИ добавит проверкуany(kw in text for kw in keywords). -
Экспорт в Excel напрямую: Попросите заменить CSV на
openpyxlдля генерации .xlsx с автоформатированием столбцов и заморозкой первой строки. - Добавьте Webhook-уведомления: Расширьте промпт запросом отправки итоговой статистики (кол-во сообщений, диапазон дат) в Telegram-бот через Bot API после завершения парсинга.
Альтернативные подходы: Для парсинга без авторизации (только публичные каналы) попросите ИИ использовать telethon.sync или pyrogram. Для визуализации данных добавьте в промпт генерацию графика активности через matplotlib.