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

Когда нужен скрипт#
Готовый парсер удобен для штатной задачи с формой и журналом. Скрипт нужен, когда требуется своя схема выгрузки, обработка текста или интеграция. В этом примере собираются сообщения, а не список участников и не скрытые телефоны.
Для запуска подготовьте 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 импортируйте как текст. Пустая дата означает отсутствие значения в объекте, а не время выгрузки.
Проверка результата и ошибки#
- Откройте CSV с кодировкой UTF-8 и разделителем-запятой; сохраните
chat_idиmessage_idкак текст. - Сверьте несколько сообщений в том же источнике. Пустой text допустим у сообщения без текста; скачивание вложений в пример не входит.
- При объединении каналов используйте пару
(chat_id, message_id). Один message_id недостаточен: в разных каналах номера могут совпадать. - Сохраните исходник отдельно. Для следующей выгрузки перенесите предыдущий файл в свой архив или измените OUTPUT в локальной копии скрипта.
- При ошибке доступа проверьте источник тем же аккаунтом. Требуемое 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 в одном кабинете. Сроки доступа, цены и условия — на странице подписки.
В этой инструкции описана только часть возможностей платформы. Полный список доступен в разделе функций.