КороткоШесть выводов
- Читать каналы можно тремя путями. Для MVP «вставил ссылку — получил события» хватает публичной веб-версии
t.me/s/<канал>: без аккаунта, ключей и Telegram API, по 20 постов на страницу, листается в обе стороны. Она не видит чаты (группы), комментарии и закрытые каналы — для них нужен аккаунт (Telethon). Бот читает только те каналы и чаты, куда его добавили админом. - Наши сборщики стоят в России, а Telegram там заблокирован полностью. С VDS dusha (Новосибирск) 17.09 ни один домен Telegram не открывается, при этом Cloudflare Workers, Deno Deploy и Vercel открываются. Владелец: на salam0nn ничего не запускать, всё на VDS dusha или макмини. Обход — бесплатное реле на Cloudflare Workers (код готов, раздел 2); через него же тянуть обложки, CDN Telegram тоже заблокирован.
- Характер поста надёжно определяет модель. На 198 живых постах Claude Opus 5 без единого примера совпал с ручной разметкой по виду поста в 87 % случаев; в главном вопросе «есть ли событие для афиши» — точность 97,5 %, полнота 94 %. Дата извлечена у 94 % событий, площадка — у 84 %. Уверенность модели отличает ошибки (0,70) от верных ответов (0,87). По решению владельца собран и алгоритм без модели: на 64 постах из пяти незнакомых каналов он не пропустил ни одного события, но каждое третье найденное — мусор, и площадку не находит у половины анонсов; модель на тех же постах — ноль мусора и 91 % по виду поста (раздел 6).
- Что внутри каналов. 104 из 198 постов — анонсы, 19 — подборки; 40 постов — дословные копии из канала-зеркала, ещё 5 событий повторяются между каналами. Каждый четвёртый уникальный анонс ссылается на Мосбилет, Timepad или Russpass — уже собран другими сборщиками, склейка обязательна. Пять из восьми каналов в каждом посте зовут читателей в MAX.
- Правила Telegram. Условия API (п. 1.5) и «Условия лицензирования контента и ИИ-скрапинга» прямо запрещают собирать данные платформы для создания и работы ИИ-систем. На практике блокировок за чтение публичных каналов не описано; риск при Telethon — отзыв
api_idи аккаунта, при веб-версии — троттлинг IP. Юридическую чистоту ранее решено не оценивать — фиксирую факт. - Цена модели. При 1000 постов в день: Sonnet 5 ≈ 100 $ в месяц (пакетным режимом ≈ 50 $), Opus 5 ≈ 255 $ (≈ 130 $), Haiku 4.5 ≈ 50 $. Через панель salam0nn (подписка, уже кормит раздел SEO) — 0 $, но канал общий с SEO, без пакетного режима и строгой JSON-схемы.
1Три способа читать Telegram
| Веб-версия t.me/s/ | Аккаунт (Telethon, MTProto) | Бот (Bot API) | |
|---|---|---|---|
| Что читает | Открытые каналы: текст, дата, фото и видео, «переслано из», просмотры | Всё, что видит аккаунт: каналы, открытые и закрытые чаты (после вступления), комментарии, альбомы, правки и удаления | Только каналы и чаты, куда бота добавили админом |
| Чего не видит | Чаты и группы (редирект), комментарии, закрытые каналы, каналы 18+ и с жалобами; историю глубже нескольких сотен постов | Ничего существенного | Всё чужое; истории до добавления нет |
| Что нужно | Ничего: HTTP-запрос с обычным User-Agent | Номер телефона, api_id/api_hash, файл сессии, код и 2FA при входе; хранение как у VK и Добро | Токен бота (бот анонсов у нас уже есть) |
| Ограничения | 20 постов на страницу, ?before= назад и ?after= вперёд; троттлинг при частых запросах с одного IP | 100 сообщений на запрос, FloodWait при спешке (библиотека сама ждёт до 60 с); пауза 1–2 с | 100 обновлений за запрос |
| Риски | Разметка HTML меняется без предупреждения; блокировка IP | Бан аккаунта (для чтения каналов случаев не описано; быстрее банят свежие аккаунты на виртуальных номерах); прямой запрет п. 1.5 условий API | Нет |
| Кому подходит | MVP: «вставил ссылку — получил события» | Чаты районов и сообществ, комментарии, закрытые каналы | Партнёры, которые сами добавляют нашего бота в свой чат |
| Прецеденты | RSSHub (маршрут /telegram/channel/ парсит именно t.me/s/), скраперы Apify | Telethon-архиваторы, teledigest, статья Amvera на Хабре | — |
Проверено живьём 17.09 с salam0nn.ru
t.me/s/telegram→ 200 и 20 постов;?before=441→ 20 более старых;?after=430→ 20 более новых;t.me/telegram/441?embed=1→ одиночный пост.- Группа
t.me/s/ru_python→ редирект без постов: чаты веб-версией не читаются. Несуществующие имена дают тот же редирект — «канала нет» и «канал без веб-версии» внешне неразличимы. - В HTML:
data-post="канал/id",<time datetime="…+00:00">(UTC), текст, «переслано из», фото, видео, превью ссылки, просмотры. Ссылки на регистрацию лежат внутри текста; хештеги — ссылки вида?q=%23….
Платный обходной путь — TGStat API (публикации любого открытого канала без аккаунта, тариф платный). Годится как запасной, если веб-версию начнут резать.
2Где запускать
| Машина | Где стоит | Telegram | Что там есть |
|---|---|---|---|
| salam0nn.ru | США (Hostinger, Бостон) | t.me и web.telegram.org открываются | панель, ручка к модели, артефакты; сборщиков нет |
| VDS dusha | Новосибирск | как у всех в РФ — замедлен/заблокирован | стек сборщиков и стенд |
| Ноутбук владельца | РФ | то же (туннель на ноутбук 17.09 не поднят, не проверял) | основной стенд сборщиков |
Хронология по Википедии: 10.02.2026 РКН подтвердил замедление; 14–16.03 массовые сбои; 10.04 OONI — интенсивность блокировки около 95 %; 29.06 Дуров объявлен в розыск; в сентябре ограничения ужесточились. 65 млн россиян продолжают пользоваться через VPN — это и наши пользователи: ссылка на пост t.me в карточке может не открыться без VPN.
Решение владельца 17.09 (вечер): на salam0nn ничего не запускать — сервер слабый; всё на макмини или на стенде dusha; обход блокировки продумать.
Замер с VDS dusha 17.09
| Адрес | С VDS dusha (Новосибирск) | С salam0nn (США) |
|---|---|---|
| t.me, web.telegram.org, api.telegram.org, core.telegram.org | соединение не устанавливается | 200 |
| *.workers.dev (Cloudflare Workers) | 200 | 200 |
| deno.com, vercel.com | 200 | 200 |
| rsshub.app (публичный RSSHub) | 403, челлендж | 403 |
| r.jina.ai (читалка Jina) | 451, закрыто для РФ | 200 |
| tg.i-c-a.su (чужой JSON-фид каналов) | соединение не устанавливается | 200 |
Макмини: внешние имена не резолвятся штатным DNS (известная особенность), сетевой сборщик там неудобен. Естественное место — VDS dusha, где уже живёт стек сборщиков.
Обход без salam0nn и без нового сервера
- Реле на Cloudflare Workers (рекомендую): десять строк JavaScript, бесплатный тариф — 100 000 запросов в сутки, крутится у Cloudflare вне РФ, а адреса workers.dev из РФ открываются. Сборщик на VDS ходит в
<имя>.workers.dev/<канал>?before=<id>с секретным заголовком и получает тот же HTML, что у t.me/s/. Тот же Worker отдаёт картинки обложек. Код —docs/fixtures/telegram-sample-2026-09-17/relay_worker.js. Нужен аккаунт Cloudflare, домен не нужен. - То же на Deno Deploy или Vercel Edge — запасной вариант с тем же кодом.
- Свой зарубежный VPS с nginx (5–10 $ в месяц) — если не хочется зависеть от бесплатных платформ; схема ниже.
- VPN на VDS — хрупко: РКН режет и протоколы VPN.
Обложки. Прямая ссылка на CDN Telegram в карточке бесполезна: из РФ она не откроется ни у консоли, ни у пользователя, а конвейер обложки не перехостит. Скачивать через реле в своё хранилище (правило Т-38).
Схема nginx для варианта 3 (свой VPS)
3Живая проба: 8 каналов, 198 постов
Каналы взяты из подборок «лучшие телеграм-каналы об афише Москвы» и по запросу владельца про йогу в парках: msk4free, moscowafishi, afishams, Mosgul, moscowculturelife, mscafisha, moscowfests, yogapark. Период 12–17 сентября. Все посты размечены вручную; файл с выборкой, разметкой и ответами модели лежит в репозитории (docs/fixtures/telegram-sample-2026-09-17/), телефоны из текстов вырезаны.
| Вид поста | Постов | Доля | Что с ним делать |
|---|---|---|---|
| Анонс — одно будущее событие с датой | 104 | 53 % | карточка |
| Подборка — несколько событий в одном посте | 19 | 10 % | карточка на каждую позицию с датой |
| Расписание — «каждый вторник», «вт–вс в 19:00» | 6 | 3 % | в MVP не карточка (решение владельца) |
| Напоминание — «стартовал», «работает до 18:00», перенос | 3 | 2 % | привязать к существующей карточке |
| Отчёт — «как прошло», фотоотчёт, «состоялась премьера» | 10 | 5 % | ничего |
| Реклама и акции — erid, розыгрыши, скидочные дни | 13 | 7 % | ничего, кроме рекламы с конкретным событием |
| Прочее — места, погода, мемы, новости, без текста | 43 | 22 % | ничего |
- Годных в карточку (анонс или подборка, офлайн, Москва и область, с датой) — 114 постов; уникальных, не копий — 89; у 22 из 89 есть ссылка на Мосбилет, Timepad или Russpass — уже в каталоге.
- Зеркала. mscafisha и moscowafishi — один канал «Бесплатная Москва» под двумя именами: 37 из 38 постов совпадают дословно. Ещё пять событий повторяются между разными каналами (500 бесплатных экскурсий 25–27.09 — в трёх каналах; закрытие мотосезона, «Окно в Азию», «Конное достояние» — в двух).
- MAX. В пяти каналах каждый пост заканчивается ссылкой на канал в MAX (107 ссылок в 198 постах): каналы переезжают в национальный мессенджер вслед за блокировкой. Через полгода часть контента может быть только там.
- Внешние ссылки: bilet.mos.ru — 25, Яндекс Карты — 18, афиша kp.ru — 16, Timepad — 8, ВДНХ — 5, Russpass — 2.
- Маркеры даты. Явная дата у 132 постов, время у 84, день недели или «сегодня/завтра» у 64; хоть один маркер — у 147 (74 %). Natasha нашла даты в 130 постах, dateparser — в 157 (шумит на числах вроде «500»). Предфильтр по дате отсёк бы четверть постов почти без потерь анонсов, но «Атомный вторник» от анонса он не отличит, а модель на всех постах стоит копейки.
- Сообщества (йога в парках). 27 из 30 постов — занятия с датой, временем, парком и преподавателем; оплата «донейшн» по номеру телефона (персональные данные в 23 постах); запись — «плюсик в комментариях или в чате парка»; занятие «состоится при записи от 4 человек / если нет ливня». Это ровно те «йога в парке и православные беседы», ради которых слой задуман, и у них свои правила.
- Постов без текста или короче 40 символов — 9.
| Канал | Постов | С датой | Переслано | Характер |
|---|---|---|---|---|
| msk4free | 10 | 5 | 0 | подборки мест вперемешку с анонсами; рекламные интеграции |
| moscowafishi / mscafisha | 38 / 38 | 28 / 29 | 3 / 0 | зеркала; короткие анонсы «дата · время · место · бесплатно» |
| afishams | 21 | 18 | 4 | афиша kp.ru: билетные события, цены «от … ₽», отчёты |
| Mosgul | 16 | 10 | 0 | места и новости, треть — анонсы, есть erid-реклама |
| moscowculturelife | 18 | 15 | 0 | строгий шаблон «ЧТО / ГДЕ / КОГДА» — идеален для извлечения |
| moscowfests | 27 | 13 | 11 | городской канал «Осень в Москве»: пересылки, видео, подборки |
| yogapark | 30 | 29 | 0 | занятия сообщества: донейшн, запись в комментариях |
4Как определять характер поста
| Вид | Признаки в тексте | Ловушки |
|---|---|---|
| announce | будущая дата или «сегодня/завтра/в субботу», время, площадка или адрес, «пройдёт, состоится, приглашаем, ждём», ссылка на регистрацию или билеты | многодневное событие или несколько сеансов — один анонс, не подборка; «уже в эту среду» — первое упоминание, не напоминание |
| digest | несколько дат и площадок, нумерация, «собрали», «планы на неделю», список музеев по дням | позиции без даты начала («до 30 декабря») — выставки и квесты: брать как «идёт до» |
| schedule | «каждый вторник», «по субботам», «вт–вс в 19:00», «расписание», «сезон» | постоянный режим работы музея или фонтана — не расписание событий (модель путает: 4 из 43 «прочих» ушли сюда) |
| reminder | «стартовал», «уже сегодня», «работает до 18:00», «осталось N мест», «перенос», «отмена» | без ссылки на исходный анонс модель считает это новостью (2 из 3 ушли в «прочее») |
| report | «прошёл», «состоялась», «итоги», «фотоотчёт», «спасибо всем», дата раньше публикации | отчёт с анонсом следующего события (мюзикл закрылся, премьера 6 ноября) — вытаскивать будущее |
| promo | erid, «реклама», «промокод», «розыгрыш: подпишись и поставь реакцию», скидка, брендовая акция | реклама с конкретным концертом и датой — это анонс с пометкой «реклама»; скидочный день в музее — не событие (3 ложных срабатывания из 3 — нужны примеры в промпте) |
| other | места без даты, погода, мемы, новости, пустой текст | «шоу фонтанов проходит днём и вечером» — не расписание |
Конвейер
t.me/s/<канал> (через прокси вне РФ)
→ разбор HTML: id, дата UTC→МСК, текст, ссылки, переслано, медиа
→ дешёвые правила: пусто или коротко → отсев; пересылка из канала в реестре → пропуск;
хеш текста уже видели (зеркало, правка без изменений) → пропуск
→ модель: вид поста + события по строгой JSON-схеме (промпт v0 в fixtures)
→ правила после модели: дата ≥ даты публикации, окно ≤ 120 дней, офлайн,
город поддерживается, есть площадка или адрес, персональные данные вырезаны
→ карточка каталога (source_object_id = "канал:id", source_url = t.me/канал/id)
→ дедуп каталога (та же сигнатура, что склеивает Timepad и KudaGo)
→ политика источника auto_publish=False → очередь оператора
→ решения оператора → пополнение оценочного набора
Один вызов модели на пачку 8–10 постов (в замере — 15 с на пачку из 8); ответ — массив объектов {i, kind, confidence, why, events[]}, поля события — как в §15 спецификации. Год и относительные даты модель считает от даты публикации, которую получает в шапке поста: «уже в эту среду» (пост 15.09) → 16.09; «сегодня 13 сентября» → 13.09; конфликт «СРЕДА 15 сент» (15.09 — вторник) → 16.09.
Почему модель, а не свой классификатор. Обучающих данных нет (это первые 198 размеченных постов), видов семь и они размытые, а поля всё равно надо извлекать — это задача на структурированное извлечение, где модель без примеров уже даёт 87 %. Бенчмарки классификации (Nyckel, 12 наборов) дают LLM без примеров около 62 % на сложных многоклассовых задачах и +6 п.п. от одного примера на класс; наша задача проще (бинарный вопрос «есть событие» — 97,5 % точности). Обученный классификатор (SetFit на rubert-tiny2) имеет смысл позже как дешёвый предфильтр, когда накопится 1–2 тысячи решений оператора.
Связанные сообщения
- Напоминание или обновление → ищем карточку того же канала за 30 дней по названию и дате; нашли — обновляем (перенос: новая сессия, отмена: статус), не нашли — считаем анонсом, если есть дата и место.
- Отчёт → ничего; будущая дата внутри — отдельный анонс.
- Пересылка из канала, который уже в реестре, — пропуск: оригинал придёт сам. Из чужого — обычный пост с пометкой источника.
- Комментарии веб-версия не показывает; «запись плюсиком в комментариях» превращается в ссылку регистрации = ссылка на пост.
- Правка поста (тот же id, другой текст) — заново; удаление веб-версия не сообщает — проверять точечно по
?embed=1у карточек, которые ждут проверки. - Зеркала и повторы — хеш нормализованного текста до модели, сигнатура каталога (название + дата + гео-ячейка) после.
5Правила слоя Telegram
Нумерация постоянная, как у правил R-n в спецификации сборщиков.
Доступ и забор
- Т-1Канал добавляется ссылкой любого вида (t.me/x, @x, t.me/s/x, t.me/x/123) и нормализуется в имя. Закрытые ссылки (t.me/+…, joinchat) и чаты в MVP отклоняются: «читаем только открытые каналы».
- Т-2При добавлении сборщик сразу пробует t.me/s/имя: 200 и есть посты — канал активен, показать оператору последние 5 постов; редирект — «канала нет или у него нет веб-версии».
- Т-3Читать t.me только с машины вне РФ или через прокси на ней. Один запрос на канал за проход, глубже — только при первичном заборе (не более 5 страниц); пауза ≥ 1,5 с; обычный User-Agent; при 429 или пустом ответе — парковка канала на 6 ч.
- Т-4Ключ поста — «канал:id»; время в HTML — UTC, переводить в МСК до подачи в модель.
- Т-5Пересылка из канала, который есть в реестре, — пропуск; из чужого — обычный пост с пометкой источника.
- Т-6Хеш нормализованного текста: один и тот же текст второй раз в модель не отправляется; карточка получает обе ссылки-источники.
- Т-7Пост без текста или короче 40 символов — не отправлять (9 из 198).
- Т-8Правка поста — повторная классификация; удаление проверяется точечно только у карточек в очереди проверки.
Классификация и даты
- Т-9Виды: announce, digest, schedule, reminder, report, promo, other. В карточку идут только announce и digest.
- Т-10Дата события считается от даты публикации; год без года — ближайший будущий; конфликт дня недели и числа — доверять числу и помечать.
- Т-11Событие раньше даты публикации — не карточка.
- Т-12Многодневное событие — одна карточка с началом и концом; несколько сеансов одного события (КВН: 5 сеансов за два дня) — одна карточка с сеансами, а не пять.
- Т-13Подборка — карточка на каждую позицию с датой и площадкой; позиция «до 30 декабря» без начала — карточка с датой окончания и пометкой «идёт до».
- Т-14Акция-зонтик (Музейная неделя, «Московские истории», «День без турникетов») — одна карточка на акцию, площадка «разные площадки», премодерация как у массовых.
- Т-15Расписание — в MVP не карточка; текст расписания сохраняется для будущего (или карточка на ближайшую дату — решение владельца).
- Т-16Онлайн — не карточка, как у всех источников.
- Т-17Другой город — карточка только если город поддерживается; область (Долгопрудный, Мытищи) — по правилу присоединения пригородов.
- Т-18Реклама (erid, «реклама», розыгрыш) — promo; реклама с конкретным событием, датой и адресом — анонс с пометкой «реклама».
- Т-19Скидочные дни и брендовые акции («Атомный вторник», завтраки во «Вкусно и точка», день бесплатной парковки) — не событие. В замере все три ушли в анонсы — обязательные примеры в промпте v1.
- Т-20Напоминание — не новая карточка: искать существующую в том же канале за 30 дней; отмена и перенос меняют статус и сеансы.
- Т-21Отчёт — ничего не менять; будущая дата внутри отчёта — отдельный анонс.
- Т-22Условные события («состоится при записи от 4 человек», «если нет ливня») — карточка с пометкой «условно» и условием в описании.
- Т-23«Запись плюсиком в комментариях или в чате парка» → ссылка регистрации = ссылка на пост, не на чат.
- Т-24Цена: «бесплатно» только по явному слову; «донейшн», «по желанию», «оплата по сердцу» — цена «донейшн», не бесплатно; «от 500 ₽» — текст цены. Пустая цена ≠ бесплатно.
- Т-25Поля не из текста — пусто; адрес по названию площадки достраивает геосправочник каталога, не модель. Метро и «за сценой на нашем месте» — в описание, не в адрес.
- Т-26Уверенность: ≥ 0,8 — «готово к проверке»; 0,5–0,8 — «сомнительно»; ниже 0,5 — отсев с сохранением сырья. Замер: у ошибок 0,70, у верных 0,87.
- Т-27Персональные данные: телефоны, e-mail и номера карт физлиц вырезать из текста до записи карточки; сырьё — под ретенцией 90 дней и стиранием по запросу. В выборке телефоны в 23 постах — все из сообществ.
- Т-28Обложка — фото поста; хосты CDN Telegram добавить в список разрешённых для консоли.
- Т-29Ссылка источника — ссылка на пост. Пользователю в РФ она может не открыться; если есть ссылка регистрации — показывать её первой (решение владельца, правка стенда).
- Т-30Указание канала-источника в карточке — по решению 24.07 «указание источника = копирайт».
Модель
- Т-31Один вызов на пачку 8–10 постов со строгой JSON-схемой; промпт и схема в репозитории с версией; в карточке — версия промпта, модель и уверенность.
- Т-32Ночная волна — пакетным режимом (−50 %); синхронно — только «добавили канал, покажи, что там».
- Т-33Системный промпт кэшируется; пост с тем же текстом повторно не классифицируется.
- Т-34Лимит стоимости на волну; при превышении — остановка и алерт.
- Т-35Оценочный набор: 198 постов из fixtures → tests/fixtures/tg_eval; порог приёмки из §15 (даты и адреса ≥ 90 %, ложных событий ≤ 5 %); изменение промпта = перепрогон.
Наблюдение
- Т-36Статистика: постов прочитано, отправлено в модель, по видам, событий извлечено, отсев по причинам, стоимость, средняя уверенность — по каналу и по волне.
- Т-37Канал без анонсов 30 дней — «пустой», предложение выключить; редирект три прохода подряд — «исчез».
Блокировка (после замера с VDS)
- Т-38Обложки постов скачивать через реле и хранить у себя; прямую ссылку на CDN Telegram в карточку не класть — из РФ она не откроется.
- Т-39Сборщик ходит в Telegram только через реле (адрес и секрет в секретах сервиса); реле недоступно три прохода подряд — парковка источника на 20 часов, как у остальных.
6Замер качества: модель и алгоритм
198 постов пачками по 8, два потока, ручка панели salam0nn (Opus 5). 453 секунды на всё; 100,8 тыс. входных токенов (из них около 50 тыс. — служебная обвязка панели) и 55,9 тыс. выходных.
| Метрика | Значение |
|---|---|
| Вид поста совпал с ручной разметкой | 173 из 198 (87,4 %) |
| «Есть событие для афиши» — точность / полнота | 97,5 % / 94,3 % (ложных 3, пропущенных 7) |
| Уверенность при верном / ошибочном ответе | 0,87 / 0,70 |
| Событий извлечено из 101 анонса и 18 подборок | 206 |
| У события есть дата / площадка / ссылка регистрации / цена | 94 % / 84 % / 35 % / 69 % |
| Онлайн распознан | 4 из 4 |
| Другой город распознан | 2 из 2; Долгопрудный назван Москвой |
Где ошибается (25 расхождений): скидочные дни и брендовые акции приняты за анонсы (3) — нужны примеры; одно событие на несколько дат названо подборкой (3) — правило Т-12 в промпт; постоянный режим работы фонтана, музея, кино в парках назван расписанием (4) — уточнить определение; напоминания без ссылки на анонс (2) и отчёты (3) ушли в «прочее» — для продукта безвредно, ни то ни другое не карточка; две спорные пары анонс/расписание, где разметка тоже спорная.
Не проверено: правильность самих дат и площадок у 206 событий — смотрел выборочно 12 случаев, все верны. Это ручная работа для оценочного набора (Т-35), её надо сделать до порога приёмки.
Алгоритм без модели — по решению владельца «не модель, а алгоритм» (после замера подтверждено: только алгоритм + оператор)
Собран прототип на правилах и Natasha: регулярные выражения для дат («12 и 13 сентября», «с 25 по 27», «до 30 сентября» как конец идущего события, «сегодня / завтра / в субботу / на следующей неделе», дедлайны «регистрация до 16 сентября»), времени, площадки (📍, «ГДЕ:», адресные слова, извлекатель адресов), слов события, прошедшего времени, рекламы, регулярности и подборок. Около 200 строк, три итерации по ошибкам на 198 постах. Затем — контрольная выборка: 64 поста из пяти каналов, которых не было при подгонке (соседи района, Музей Москвы, Дворец пионеров, KudaGo, библиотеки Горячего Ключа), размечены вручную и прогнаны вслепую и алгоритмом, и моделью.
| Алгоритм (правила + Natasha) | Модель (Opus 5, промпт v0) | |
|---|---|---|
| 198 постов, на которых алгоритм подгонялся — вид поста совпал | 86 % | 87 % |
| … «есть событие для афиши» — точность / полнота | 99 % / 99 % (подгонка) | 97,5 % / 94 % |
| 64 новых поста, 5 незнакомых каналов — вид поста совпал | 81 % | 91 % |
| … «есть событие» — точность / полнота | 70 % / 100 % (6 ложных из 20) | 100 % / 71 % (4 пропуска) |
| Дата события — тот же день, что у модели (93 анонса) | 90 % | — |
| Площадка совпала с моделью (80 анонсов) | 55 % | — |
| Стоимость | 0 $ | 0 $ (панель) … ≈ 100 $/мес (API) |
Где ломается алгоритм на новых каналах: отчёты библиотек «12 марта провели час размышлений» (дата равна дню публикации, есть площадка и слова события) стали событиями — 4 из 6 ложных; «фестиваль уже стартовал» и «выставки работают последние выходные» — ещё 2; площадка пустая или неверная у половины анонсов («с. Пушкина» из «сказок А. С. Пушкина», «Садовом» вместо проспекта Сахарова). Каждый новый стиль канала — новые правила: три итерации ушли только на восемь каналов-афиш.
Где ошибается модель: четыре «пропуска» — курс шахмат «по вторникам с 15 сентября», курс истории «по пятницам с 9 октября» и две выставки без даты начала, которые она назвала расписанием; при правиле Т-12 в промпте это анонсы. Ложных событий — ноль; площадки и даты верны во всех девяти проверенных анонсах.
- Алгоритм + оператор — рабочий MVP при проверке каждой карточки: событий не пропускает, но на незнакомом канале каждое третье найденное «событие» — мусор, и площадку оператор правит у половины карточек. 0 $, поведение предсказуемо, правила видны и правятся руками.
- Модель — почти без мусора, площадки и даты вытаскивает сама; промахи — спорные случаи таксономии. 0 $ через панель или около 100 $ в месяц через API.
- Гибрид — алгоритм решает сам, где уверен (есть 📍 или «ГДЕ», одна будущая дата, нет прошедшего времени), модель — только для остальных ≈ 30 % постов и для площадки, когда алгоритм её не нашёл. Расход на модель втрое меньше, мусора почти нет.
Контрольная выборка маленькая (64 поста), проценты ± 10 п.п.; но направление разрыва — ложные события у алгоритма, пропуски у модели — устойчиво.
7Модель и деньги
Замер: около 250 входных токенов на пост плюс системный промпт около 1200 токенов (кэшируется) и около 280 выходных на пост (с пояснением «почему» и событиями; без пояснения и с компактной схемой — примерно вдвое меньше). Ориентир — 1000 постов в день: 200 каналов по 5 постов; в выборке 8 каналов дали 198 постов за 5 дней.
| Модель (цены API, список от 24.06.2026) | За 1000 постов | В месяц | Пакетный режим |
|---|---|---|---|
| Claude Opus 5 — 5 $ / 25 $ за 1 млн токенов | ≈ 8,5 $ | ≈ 255 $ | ≈ 130 $ |
| Claude Sonnet 5 — 2 $ / 10 $ | ≈ 3,4 $ | ≈ 100 $ | ≈ 50 $ |
| Claude Haiku 4.5 — 1 $ / 5 $ | ≈ 1,7 $ | ≈ 50 $ | ≈ 25 $ |
| Панель salam0nn (подписка Claude Code, Opus 5) | 0 $ | 0 $ | нет |
Точность замерена на Opus 5; Sonnet 5 и Haiku 4.5 на этом наборе не гонялись (ключа API на сервере нет) — при выборе модели прогнать тот же набор и сравнить с 87,4 %. Через панель: 8 постов за ~15 с при двух параллельных процессах, то есть 1000 постов ≈ 30 мин; канал общий с генерацией статей SEO, рестарт панели рвёт прогон, строгой JSON-схемы нет — ответ разбирается как текст (в замере все 25 пачек разобрались). Через API: строгая схема ответа, пакетный режим, кэш промпта; ключ живёт в секретах сервиса сборщиков.
8Как встраивается в наш конвейер
- Сборщик
telegramпо общему контракту: обходит реестр каналов, отдаёт карточки с ключом «канал:id», ссылкой на пост, фото поста как обложкой, текстом как сырьём и пометками модели (версия промпта, уверенность, «переслано», «реклама», «условно»). Категории — из словаря каталога по подсказке модели, иначе карточка никогда не попадёт в ленту. - Реестр каналов — данные, не код: таблица в базе сборщиков (имя, название, город, включён, кто и когда добавил, последний пост, последняя проверка, статус, заметка) и ручки добавить/удалить/список в консоли сборщиков.
- Поле «вставить ссылку» в админке. Страница «Сборщики событий» основной консоли ходит в сервис сборщиков через Django. Поле там — это ещё и правка Django-бэкенда и JS консоли: на стенд dusha и ноутбук выкатить можно, на прод cloud.ru — нет (но сборщики там и не живут). Быстрее и без Django — поле в собственной консоли сервиса сборщиков, а в основную вынести вторым шагом.
- Расписание. Проход по реестру каждые 2–6 часов (один запрос на канал); ночью — полный проход с пакетной классификацией; новый канал — 5 страниц истории при добавлении.
- Политика источника на стенде: в каталог — да, в ленту — да, публиковать сразу — нет: каждую карточку смотрит оператор, пока оценочный набор не докажет качество (§15 п. 7).
- Дедуп — тот же механизм каталога; ожидаемая доля склеек с Мосбилетом, Timepad и Russpass — около четверти уникальных анонсов.
9Что решить владельцу
Ответы владельца 17.09 (вечер): 1 — «как будет правильнее?»; 2 — «придумать обход»; 3 — «это должна быть не модель, а алгоритм»; 4 — «в основной админке, страница „Сборщики“».
1. Правильнее — веб-версия: закрывает MVP целиком, не нужен аккаунт, номер и сессия, нечему баниться, условия про API её не касаются. Аккаунт — отдельный шаг под районные чаты. 2. Обход — прокси на salam0nn.ru, схема в разделе 2, включается после «делай». 3. Алгоритм собран и замерен (раздел 6). 4. Принято: страница «Сборщики событий» основной админки, правка Django на стенде.
Второй круг ответов после цифр: путь — «только алгоритм + проверка оператором» (окончательно, модель в конвейер не идёт); «на salam0nn ничего не запускать, сервер очень слабый; всё на макмини или на стенде dusha; продумать обход блокировки». Итог: сборщик на VDS dusha в общем стеке, чтение Telegram и обложки — через реле на Cloudflare Workers (раздел 2), правила Т-1…Т-39, каждую карточку смотрит оператор. Открыто: чей аккаунт Cloudflare для реле.
1. Способ чтения
только сервис сборщиков
Веб-версия: только открытые каналы, без чатов и комментариев, без аккаунта. Аккаунт Telethon: плюс чаты и комментарии, нужен номер телефона и хранение сессии, прямой запрет условий API на использование данных для ИИ. Рекомендую начать с веб-версии, аккаунт — отдельным решением под чаты.
2. Откуда читать
только сервис сборщиков
Прокси на salam0nn.ru (США, один блок в nginx) — или отдельный зарубежный VPS. Продуктовый сервер не трогается.
3. Модель и деньги
только сервис сборщиков
Панель salam0nn (0 $, Opus 5, общий канал с SEO) — или ключ API: Sonnet 5 около 100 $ в месяц при 1000 постов в день (вдвое меньше пакетным режимом) или Opus 5 около 255 $. Ключ живёт в сервисе сборщиков.
4. Что считать событием в MVP
только сервис сборщиков
Подборки — брать построчно (рекомендую); расписания «каждый вторник» — пропускать или заводить ближайшую дату; акции-зонтики — одна карточка на акцию; реклама с конкретным событием — брать с пометкой.
5. Ссылка в карточке
правка стенда
Для пользователя в РФ ссылка на пост t.me может не открыться: показывать первой ссылку регистрации, если она есть.
6. Кто ведёт реестр и где поле
консоль сборщиков — без Django основная админка — правка Django на стенде
Реестр пополняет оператор. Поле сначала в консоли сборщиков или сразу в основной админке.
Уже решено раньше и не спрашивается: публикация только после проверки оператором до порога приёмки; юридическую чистоту не оценивать (24.07); реестр каналов — данные, не код.
10Что сделано 17.09 после «Да, делай»
- Сборщик «Telegram-каналы» написан и выкачен на стенд dusha: читает открытые каналы через веб-версию, определяет вид поста правилами (без модели), кладёт карточки в каталог с ссылкой на пост и фото поста. В cron-волне стоит последним. 42 теста зелёные.
- Реестр каналов — таблица в базе сборщиков; пополняется с страницы «Сборщики событий» основной админки: панель «Telegram-каналы», поле «вставить ссылку», кнопка «Добавить канал» показывает последние пять постов и их вид; закрытые ссылки и чаты отклоняются с понятным текстом.
- Обход блокировки — «прокси»: tinyproxy, который уже работал на salam0nn, теперь пропускает t.me и картинки Telegram (в списке разрешённых только они); стенд ходит к нему по ssh-туннелю с ключом, которому разрешён только этот порт. Проверено из контейнеров стенда.
- Обложки стенд забирает через сервис сборщиков и хранит у себя: прямые ссылки на CDN Telegram у пользователей в России не открылись бы.
- Проба: каналы «Бесплатная Москва» и «Йога в парках Москвы» добавлены через новую панель (проверка через прокси прошла, названия подтянулись). 32 поста → 17 карточек в каталоге (отсев: 2 прошедших, 1 онлайн, 2 другой город) → 12 событий на стенде (пять уже прошли к моменту переноса), все неопубликованные, 7 обложек перехощены на стенд.
- Качество, как и ожидалось по замеру: у постов сообществ заголовок и площадку оператор будет править часто; после первого прогона правила уточнены и посты перепрогнаны.
Как проверить: консоль стенда → «По душе» → «Сборщики событий» → панель «Telegram-каналы» → вставить ссылку → «Добавить канал» → «Собрать» у строки «Telegram-каналы» → «Перенести» → каталог событий, источник telegram.
Что не закоммичено и почему: код лежит в рабочей копии рядом с незакоммиченными правками другой сессии (сборщик логов приложений); коммит — после разделения. На стенде правки Django лежат в работающих контейнерах до их пересоздания (резервные копии сохранены).
ИсточникиЧто читал и проверял
- Telegram API Terms of Service — core.telegram.org/api/terms (п. 1.5 про ИИ, п. 3.3 про рекламные сообщения в каналах).
- Terms of Service for Content Licensing and AI Scraping — telegram.org/tos/content-licensing.
- Bot FAQ: бот получает «все сообщения из каналов, где он участник» — core.telegram.org/bots/faq.
- RSSHub, маршрут /telegram/channel/ (парсинг t.me/s/) — исходник маршрута.
- Telethon: iter_messages, flood_sleep_threshold, ошибки FloodWait — docs.telethon.dev.
- «Telegram Scraper: What Works and What Gets You Banned» — clura.ai (чтение каналов без прецедентов банов; пауза 1–2 с).
- «Парсинг Телеграм каналов, групп и чатов с обработкой в LLM» — Хабр, блог Amvera.
- Блокировка Telegram в России (2026) — Википедия; OONI 10.04.2026.
- Natasha / Yargy (DatesExtractor, AddrExtractor) — natasha.github.io; dateparser — dateparser.readthedocs.io.
- LLM-классификация: Nyckel, best practices and benchmarks; Chae & Davidson 2026; Turing Institute, Closed-Domain Event Extraction Literature Review (2025).
- Извлечение событий из соцсетей: UNITE (фильтр → атрибуты → кластеризация дублей); Text is All You Need, ACL 2025.
- TGStat API channels/posts — api.tgstat.ru.
- Цены моделей — таблица навыка claude-api от 24.06.2026; сверить с anthropic.com/pricing перед выбором.