Практика работы с Telegram

Парсер сообщений Telegram на Python: пример CSV

Материал · Редакционная проверка текста: · Как проверяем материалы

Небольшой пример чтения последних сообщений своего доступного канала через Telethon. Подготовка, код и проверка результата.

Первоначальная инструкция: сентябрь 2026. Даты снимков и отдельных проверок указаны в материале.

ПАРСЕР СООБЩЕНИЙ TELEGRAM НА PYTHON — тематическая обложка с персонажем Telecobra
Тематическая иллюстрация к материалу; не снимок интерфейса.

Когда нужен скрипт#

Готовый парсер удобен для штатной задачи с формой и журналом. Скрипт нужен, когда требуется своя схема выгрузки, обработка текста или интеграция. В этом примере собираются сообщения, а не список участников и не скрытые телефоны.

Для запуска подготовьте Python в отдельном окружении, библиотеку Telethon и параметры собственного Telegram-приложения. Учебный пример рассчитан на интерфейс Telethon 1.x. Установите python -m pip install "Telethon>=1.45,<2". Авторизация выполняется владельцем аккаунта.

Подготовка переменных#

Задайте TG_API_ID, TG_API_HASH и TG_SOURCE средствами своей оболочки. TG_SOURCE — username или ссылка на свой доступный канал. Сохраните код как export_messages.py в отдельной папке. API-параметры не помещайте в публикуемый репозиторий.

При первом запуске Telethon может запросить телефон, код и пароль 2FA. В этой версии reader.session и messages.csv располагаются рядом с файлом скрипта: путь вычисляется через Path(__file__).resolve().parent. Запуск из другой рабочей папки не меняет эти пути. В прежнем фрагменте относительный путь зависел от рабочей папки запуска; если уже использовали его, сначала найдите и сохраните прежнюю сессию.

Скрипт запускают из сохранённого файла, не вставкой в интерактивную консоль: там __file__ может отсутствовать. Не запускайте два процесса с одной сессией. Это самостоятельное чтение Telegram владельцем аккаунта, а не задача Telecobra.

Код выгрузки#

import asyncio
import csv
import os
from pathlib import Path
from telethon import TelegramClient

BASE = Path(__file__).resolve().parent
OUTPUT = BASE / "messages.csv"
SESSION = BASE / "reader.session"


async def main():
    # Отказываемся до входа, если предыдущий результат уже существует.
    if OUTPUT.exists():
        raise FileExistsError(f"Сохраните предыдущую выгрузку: {OUTPUT}")
    client = TelegramClient(str(SESSION), int(os.environ["TG_API_ID"]),
                            os.environ["TG_API_HASH"])
    async with client:
        rows = []
        source = os.environ["TG_SOURCE"]  # свой доступный канал
        async for msg in client.iter_messages(source, limit=100):
            if msg.chat_id is None:
                raise ValueError("Не установлен chat_id; выгрузка не сохранена")
            text = msg.raw_text or ""
            if text.lstrip().startswith(("=", "+", "-", "@")):
                text = "'" + text
            rows.append([str(msg.chat_id), str(msg.id),
                         msg.date.isoformat() if msg.date else "", text])
        # x также защищает от файла, появившегося во время чтения.
        with OUTPUT.open("x", encoding="utf-8-sig", newline="") as f:
            writer = csv.writer(f)
            writer.writerow(["chat_id", "message_id", "date_utc", "text"])
            writer.writerows(rows)
        print(f"Сохранено сообщений: {len(rows)}; файл: {OUTPUT}")


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

Запуск: python export_messages.py. В CSV четыре колонки: chat_id, message_id, date_utc, text. Один запуск читает до 100 последних доступных сообщений одного источника. Это выбранный предел примера, а не гарантированная полнота истории и не квота Telegram. Вложения не скачиваются.

Если файл уже существует, проверка остановит запуск до создания клиента. Режим записи x повторно защищает от перезаписи, если другой процесс создал файл во время чтения. Ошибка чтения Telegram до этапа записи не создаёт CSV. Сбой диска во время записи может оставить частичный файл: наличие файла само по себе не подтверждает успешное завершение.

Текст, начинающийся после пробелов с =, +, - или @, получает ведущий апостроф для просмотра в таблицах. Это преобразование исходного текста; поведение импорта зависит от редактора. Для точного анализа учитывайте этот префикс, а столбцы с ID импортируйте как текст. Пустая дата означает отсутствие значения в объекте, а не время выгрузки.

Проверка результата и ошибки#

  1. Откройте CSV с кодировкой UTF-8 и разделителем-запятой; сохраните chat_id и message_id как текст.
  2. Сверьте несколько сообщений в том же источнике. Пустой text допустим у сообщения без текста; скачивание вложений в пример не входит.
  3. При объединении каналов используйте пару (chat_id, message_id). Один message_id недостаточен: в разных каналах номера могут совпадать.
  4. Сохраните исходник отдельно. Для следующей выгрузки перенесите предыдущий файл в свой архив или измените OUTPUT в локальной копии скрипта.
  5. При ошибке доступа проверьте источник тем же аккаунтом. Требуемое Telegram ожидание учитывайте по фактическому ответу; автоматического продолжения здесь нет.

12 октября 2026 года пример проверен локально с подставным клиентом: смена рабочей папки, отказ до подключения при существующем файле, защита от его появления во время чтения, CSV с запятой, переносом и пустым текстом. Подставной клиент не проверяет реальную авторизацию, права или доступность Telegram.

Комментарии и анализ с ИИ#

Комментарии канала связаны с обсуждением. Приведённый код выгружает верхний уровень сообщений указанного источника и не обещает автоматически собрать все ветки комментариев. Для анализа обсуждений задайте отдельный источник и проверьте связи ответов.

ИИ может группировать уже собранные обезличенные тексты по темам. Сохраните исходные сообщения для проверки выводов: количество найденных вопросов не равно размеру рынка и не подтверждает намерение купить. Для участников и аудиторий используйте экспорт парсера Telecobra.

Проверка CSV на повторяющихся и многострочных данных#

Пять сообщений, четыре номера: проверка составного ключа

Скачать учебный CSV. Он объединяет два вымышленных источника; DEMO-CHAT-A/B заменяют настоящие числовые ID. В A есть сообщения 101–104, в B — своё сообщение 101. Скрипт выше читает один источник за запуск; файл показывает последующее объединение результатов.

Правильный итог: 5 сообщений и 5 уникальных пар «чат + сообщение». Различных значений message_id только 4. Удаление дублей по одному этому столбцу ошибочно потеряет одно сообщение. Одинаковый текст также не является основанием удалить запись с другой парой ID.

Один text содержит запятую, один — перевод строки, один пуст. CSV-парсер должен вернуть пять записей, а не число физических строк файла. Контрольные результаты · Условия проверки. Сам файл не устанавливает число авторов и не доказывает полноту истории.

Основа полей: chat_id в Telethon и пространства идентификаторов сообщений Telegram. Это правила идентификации записей; принадлежность реального аккаунта человеку ими не проверяется.

Редактура структуры: . Упорядочены разделы и пояснения. Даты исходных снимков, примеров и функциональных проверок указаны отдельно.

Источники и документация#

Одна платформа · разные задачи

Подписка Telecobra

Соберите инструменты для работы с Telegram в одном кабинете. Сроки доступа, цены и условия — на странице подписки.

В этой инструкции описана только часть возможностей платформы. Полный список доступен в разделе функций.