- BrainTools - https://www.braintools.ru -

Как я перестал перечитывать десятки Telegram-каналов: локальный архив на Telethon, SQLite FTS5 и ИИ-дайджесты

Я ложусь поздно и просыпаюсь уже ближе к середине дня. За ночь и утро в Telegram успевает накопиться приличный хвост сообщений: часть новостей повторяется в пяти–десяти каналах почти одинаково, часть появляется только в одном месте, а что-то важное легко пропустить просто потому, что оно потерялось в ленте. При этом я не хотел подписываться ещё на десятки каналов только ради редких тематических подборок. Сегодня мне может быть интересен ИИ, завтра спорт, послезавтра кино или дорамы, а раздувать список подписок ради разового поиска не хотелось.

Из этой бытовой задачи и вырос TelegramNewsAI. Сейчас у меня в постоянном мониторинге около 25 каналов, на которые я подписан, и ещё примерно 10 публичных каналов, которые программа читает без подписки. Идея была не в том, чтобы сделать ещё один «пересказчик Telegram», а в том, чтобы собрать сообщения за нужный период без ручного листания ленты, сохранить первоисточники и подготовить материал так, чтобы из него можно было быстро получить понятную картину событий.

Что я хотел получить

Главное требование к итоговому дайджесту я сформулировал для себя просто: больше фактов, меньше аналитики, прогнозов и выводов. Если десять каналов написали об одном событии, мне не нужны десять почти одинаковых абзацев. Но если в одном из сообщений появилась новая цифра, уточнение, комментарий стороны или важная деталь, она не должна потеряться. То же самое с противоречиями: лучше показать две версии и оставить возможность перейти к источнику, чем сделать вид, что одна из них автоматически «правильная».

Простая суммаризация пачки сообщений эту задачу решает не полностью. Мне нужна не краткость сама по себе, а скомпонованная и структурированная информация, а при необходимости — тематическая выборка по конкретному вопросу. Допустим, за несколько часов вышло 200 сообщений: 60 из них повторяют [1] пять крупных сюжетов, 30 — мелкие новости, остальное — комментарии, уточнения и продолжение уже начавшихся историй. Сократить всё это до двадцати абзацев недостаточно: нужно сначала понять, какие сообщения относятся к одному событию, что появилось первым, что позже уточнилось и где источники расходятся.

Поэтому я разделил задачу на две части:

Telegram → локальный архив → структурированный JSON → ИИ → итоговый дайджест

TelegramNewsAI отвечает за сбор, хранение, поиск и подготовку исходного материала. ИИ уже работает не с хаотичной лентой, а с подготовленными данными и правилами оформления, которые я сам задаю.

Почему Telethon

Мне нужен был доступ к публичным Telegram-каналам от имени обычного аккаунта, в том числе к тем, на которые я не подписан, поэтому в основе используется Telethon. При первом запуске пользователь вводит свои Telegram API ID и API Hash, номер телефона и код подтверждения. После этого программа работает напрямую с Telegram; устанавливать Telegram Desktop на компьютер не обязательно.

Публичные каналы можно добавлять по @username, обычной ссылке t.me или ссылке на конкретный пост, а несколько каналов — одной строкой через запятую. Для моего сценария это важно: если появляется интерес [2] к какой-то теме, я могу через ИИ быстро получить список подходящих публичных каналов, добавить их в TelegramNewsAI и собрать тематическую выборку, не превращая основной Telegram в свалку подписок.

Первичная настройка TelegramNewsAI

Первичная настройка TelegramNewsAI

Локальный архив вместо постоянного сервиса

Один из принципов проекта — локальность. Я не хотел отдельный сервер, обязательный платный API, постоянный фоновый сервис и привязку к одной конкретной модели ИИ. Программа работает на Windows 10/11 и хранит историю локально в SQLite. Её не нужно держать запущенной постоянно: можно закрыть программу, а при следующем запуске она догрузит пропущенные публикации в пределах доступной истории.

Для личного инструмента SQLite оказался достаточным и удобным вариантом: один файл базы, индексы, транзакции, простое резервное копирование и отсутствие отдельной службы базы данных. Для полнотекстового поиска используется SQLite FTS5. Поиск работает по уже собранной истории, поэтому, если меня интересует конкретная тема или факт, я могу не строить общий дайджест, а сделать отдельную поисковую выборку и отправить её ИИ.

Например:

общий мониторинг → дайджест за последние 8 часов

или

локальный поиск → только тема X → отдельный JSON → тематический дайджест

Тематический режим оказался для меня не менее полезным, чем обычный ежедневный дайджест.

Что оказалось самым трудным

Самая сложная часть была не в получении сообщений из Telegram, а в том, чтобы добиться нормального итогового дайджеста. Первая проблема — повторы: одна новость может выйти в десятке каналов разными словами, и если оставить всё как есть, итог получается раздутым и бесполезным. Вторая — не переборщить с анализом. ИИ охотно объясняет, строит прогнозы и добавляет выводы, а мне чаще нужен ответ на более приземлённые вопросы: что произошло, что нового появилось, какие есть важные цифры и детали, откуда информация, что подтверждено, а что пока нет и где источники расходятся.

Поэтому правила дайджеста постепенно сместились в сторону фактов и структуры. Отдельно пришлось следить за тем, чтобы не терялся первоисточник: если какая-то деталь вызывает сомнение или просто хочется прочитать сообщение полностью, должна оставаться возможность вернуться к исходной публикации. Поэтому в подготовленных данных сохраняются ссылки на конкретные Telegram-посты, когда это возможно.

Как это выглядит в реальной жизни

Мой основной сценарий очень простой: я просыпаюсь, запускаю TelegramNewsAI и выбираю период примерно за последние восемь часов. Пока пью утренний кофе, читаю уже не ленту из сотен сообщений, а готовый дайджест того, что пропустил. Второй типичный запуск — вечером, после работы и тренировки.

Если за день появилась отдельная тема, которая меня заинтересовала, я использую программу иначе. Через ИИ получаю список каналов по нужной тематике, добавляю подходящие публичные каналы в TelegramNewsAI, собираю сообщения, формирую отдельную выборку и прошу ИИ сделать итоговый дайджест именно по этому вопросу. При необходимости уточняю, чему уделить особое внимание [3]. Темы могут быть совершенно разными — новости, спорт, кино, ИИ, сериалы, дорамы: программа к тематике не привязана.

Выбор периода и создание дайджеста

Выбор периода и создание дайджеста

После обработки программа создаёт JSON-файл и открывает его в Проводнике. Обычно дальше я просто прикладываю файл к ChatGPT и пишу:

Подготовь дайджест

Основные инструкции по анализу уже находятся внутри экспортированного файла, поэтому каждый раз составлять большой промпт не нужно.

Готовый JSON после синхронизации

Готовый JSON после синхронизации

Почему исходники хранятся отдельно от ИИ

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

Сам архив при этом не зависит от конкретной модели. Сегодня это может быть ChatGPT, завтра — другой сервис или локальная модель. ИИ остаётся сменным последним звеном, а собранные сообщения и история находятся отдельно.

Безопасность

Поскольку TelegramNewsAI работает от пользовательского Telegram-аккаунта, API Hash и файл сессии являются чувствительными данными. Учётные данные сохраняются локально, а credentials.bin защищён Windows DPAPI. База, Telegram-сессия, настройки, выбранные каналы, логи и сами дайджесты тоже остаются на компьютере пользователя.

В проекте есть отдельный SECURITY.md, а CI проверяет, что локальные данные вроде credentials.bin, *.session, news.db и файлов настроек случайно не попали в Git. Для такого проекта это было важнее, чем строить сложную серверную архитектуру. При необходимости программу можно просто удалить вместе с её папкой и ярлыком — отдельной серверной части с пользовательскими данными нет.

Что уже работает и что дальше

На текущем этапе программа уже работает так, как я изначально хотел: собирает публикации за выбранный период, догружает пропущенную историю, читает публичные каналы без обязательной подписки, ищет по локальному архиву, формирует общий или тематический JSON, сохраняет ссылки на источники и подключает ИИ только на финальном этапе анализа.

Сейчас я скорее думаю не о полном переписывании проекта, а о следующих направлениях — Android-версии и английской версии интерфейса и документации. При этом главный принцип хочется сохранить тем же: локальный архив должен оставаться простым, надёжным и независимым от конкретного ИИ.

Итог

TelegramNewsAI появился не как попытка сделать большую систему анализа новостей. Я просто хотел перестать тратить время на ручное перелистывание накопившейся ленты, не терять важные детали и первоисточники и при необходимости анализировать публичные каналы, на которые не подписан.

Для меня рабочая схема сейчас выглядит так:

35 каналов
    ↓
локальный архив
    ↓
выбранный период или тема
    ↓
структурированные данные
    ↓
ИИ
    ↓
понятный дайджест за чашкой кофе

Если вы решаете похожую задачу по-другому, особенно интересно было бы сравнить подходы к дедупликации, тематическому поиску и разделению «сбор данных / интерпретация ИИ».

Исходный код, Windows-релиз и инструкция по установке находятся в репозитории TelegramNewsAI [4].

Автор: ccuriu

Источник [5]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/35718

URLs in this post:

[1] повторяют: http://www.braintools.ru/article/4012

[2] интерес: http://www.braintools.ru/article/4220

[3] внимание: http://www.braintools.ru/article/7595

[4] репозитории TelegramNewsAI: https://github.com/ccuriu/TelegramNewsAI

[5] Источник: https://habr.com/ru/articles/1084068/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1084068

www.BrainTools.ru

Rambler's Top100