Near-real-time радар вирусности — from «подбирателя исторических фактов» к детектору взлёта. On-demand, $0, без фонового поллинга.
Один python -m idea_radar.radar --field both → топ-15 за прогон. Новость с GDELT-рядом набрала 97.2 против ~30 у flat-новостей. Velocity-движок работает как задумано.
«Популярно» ≠ «растёт». Движок считает производную: velocity + acceleration + overperform. Это то, за что берут enterprise-деньги у NewsWhip. Написано самостоятельно поверх бесплатных источников.
On-demand, НЕ фон. Движок запускается по команде → проводит работу в моменте → выдаёт дайджест → останавливается. Никакого крона, никакой фоновой нагрузки, лимиты подписок не трогаем без явного запуска. Каждый прогон ограничен и предсказуем по числу вызовов.
Будущее (отдельное решение, не сейчас): тот же движок оборачивается в планировщик. Архитектура делает этот переход тривиальным — фон = обёртка-cron вокруг той же функции run(). Сегодня фон не строим.
Раз фона нет — свою базовую линию мы не копим заранее. Берём источники, отдающие производную в одном вызове:
/rising — уже velocity-сортировка от Reddit (что быстро набирает относительно нормы саба)Каждый прогон пишет снимки в SQLite → при повторных ручных запусках база линий накапливается как бонус, тогда включается полноценный z-score vs история. Калибровка порогов (ориентир от NewsWhip): z>2.5–3 = breakout; точность прогноза пика ±21% при 1ч наблюдения, ±12% при 3ч.
Все компоненты ниже — в pipeline/idea_radar/, прогнаны 2026-06-18:
score.py — velocity/acceleration (точечные + робастные trend-окна), classify_state, normalize, momentum.
24 unit-теста (TDD)
rank.py — групповая нормализация по источнику + свёртка momentum + сортировка.
5 unit-тестов
29/29 зелёных итого
googlenews.py (RSS ru+en)
работает · 60 новостей/прогон
gdelt.py (timelinevol-ряд) — velocity и acceleration считаются прямо из ряда внутри ответа, без своего фона
работает
reddit_rising.py — готов
⚠️ VPS-IP в бане — нужен Mac-релей/OAuth
store.py (SQLite: runs + items), оркестратор radar.py + CLI, выдача в консоль + data/latest.json
готово
python -m idea_radar.radar --field both # → топ-15, ускоряющаяся новость: momentum 97.2 / exploding → #1 # → flat-новости: momentum ~30 # → $0, on-demand, без фона
🔴 Reddit отключён VPS-IP в бане у Reddit (403 на любом UA, www и old; camoufox без резидентного прокси — та же сеть). До решения источник отключён, прогон не падает.
🟡 GDELT hit-rate GDELT отдал velocity-ряды 1/12 за прогон — keyword-extractor грубый + rate-limit. Улучшить: proper nouns, retry, enrich по всем новостям. Velocity сейчас живёт только у обогащённых новостей.
«Популярно» ≠ «растёт».« Топ-чарты (Trending tab, Hot) показывают уже взлетевшее — там ты опоздал. Нужна производная:
Все платные сервисы (NewsWhip ~enterprise, Exploding Topics, BuzzSumo) делают ровно это. Это не покупается — это пишется. Самописный velocity-слой поверх бесплатных источников = 80% ценности движка. Платные «серые API» нужны только чтобы пробить анти-бот TikTok/Instagram — и только когда движок докажет, что находит идеи.
Состояние — в SQLite. Тяжёлое (embeddings/кластеризация/LLM) — батчами, не на каждый item (правило слабого VPS).
| Слой | Что делает | Фаза | Статус |
|---|---|---|---|
0. Оркестратор run() |
On-demand: одна команда → все ingestion-адаптеры один раз, последовательно с nice. Без крона/фона. Тот же run() позже = планировщик. |
1 | ✅ Готов |
| 1. Ingestion | Тянет сырьё → {source, entity, text, engagement_snapshot, ts, lang, media_urls}. RSS — фундамент, scrape — точечно. |
1 | ✅ Частично |
| 2. Нормализация | UTC, единая шкала engagement, извлечение сущностей (regex/NER), lang-tag (RU/EN). | 1 | ✅ Готов |
| 3. Scoring (momentum) | velocity + acceleration + overperform(z-score vs rolling baseline, MAD) + diversity. Итог — momentum_score 0–100. Сердце движка. |
1 | ✅ Доказан |
| 4. Clustering / dedup | MinHash LSH → embeddings(CPU, батч) или TF-IDF → HDBSCAN. Склейка кросс-источников по entity+времени: один кластер = одно событие. | 2 | ⏳ Фаза 2 |
| 5. Ranking (жанр-фит) | Фильтр Rising/Exploding → LLM-классификатор «годится в ДИЧЬ?» (абсурд/факап да, драма нет; бан: не Премия Дарвина). Скор = momentum × жанр-фит × материал. | 2 | ⏳ Фаза 2 |
| 6. Выдача + HITL | Ранжированная лента: тема, momentum, статус, источники, ссылки на сырьё, прогноз пика, бриф реакции. Surface — cockpit-дашборд + TG-дайджест, оба с Фазы 1. | 1 (выдача) 2 (фидбек) |
🟡 В работе |
| Поле | Источник | Метод | Цена | Статус |
|---|---|---|---|---|
| EN+RU новости | GDELT 2.0 | DOC API + timelinevol, 15-мин окна, 100+ языков | $0 | ✅ Работает |
| EN+RU новости | Google News RSS | RSS (hl=ru / hl=en) | $0 | ✅ 60 нов/прогон |
| EN соц | Reddit .json | /r/all/rising + /new сабы; fallback stealth-browser | $0 | ⚠️ VPS-IP в бане |
| RU ядро | Telegram t.me/s | статичный HTML + Telethon (сессия есть) | $0 | ⏳ Фаза 1.6 |
| Спрос | Google Trends RSS | trendspyg, 125 стран, 4h/24h | $0 | ⏳ Фаза 1.6 |
| Каркас-реф | trend-pulse (MIT) | 20 zero-auth источников + velocity + SQLite | $0 | ⏳ Референс |
| RU соц | VK newsfeed.search | офиц. токен, публичные посты | $0 | ⏳ Фаза 1.6 |
| Платформа | Сервис | Цена | Почему |
|---|---|---|---|
| HikerAPI | $0.0006/запрос | уже подключён (~/.claude/.accounts/hikerapi.env), баланс низкий | |
| TikTok+IG+YT+X | EnsembleData | free 50/день → $100+/мес | один API на 8 платформ, один биллинг |
| TikTok | ScrapeCreators | $10 / 5000 (кредиты не истекают) | pay-as-you-go, лучший для рваной нагрузки |
| Платформа | Метод | Цена | Статус |
|---|---|---|---|
| YouTube | youtube-comment-downloader (OSS, innertube, без квоты) | $0 | ⏳ Фаза 2.1 |
| дерево .json / PRAW (100 req/min) | $0 | ⚠️ VPS-IP в бане | |
| Telegram | Telethon (комменты дискуссий, реакции, views) | $0 | ⏳ Фаза 2.1 |
| VK | wall.getComments (100/запрос) | $0 | ⏳ Фаза 2.1 |
| HikerAPI media comments | $0.0006/зап | ⏳ Фаза 2.1 | |
| TikTok | ScrapeCreators / EnsembleData | платно | ⏳ Фаза 2 |
НЕ «вали всё в LLM». Пайплайн: ранжир top-N + очаги спора → дедуп (копипаста) → map-reduce суммаризация (чанки → map → reduce) → extraction-промпт «угол подачи».
Выход — JSON: доминирующие_лагеря / ось_спора / контроверсия / эмоциональные_крючки / мемы / сентимент / рекомендованный_угол_видео. Цитаты дословные (анти-галлюцинация). LLM — Gemini через integrations/gemini.
idea_radar/ — SQLite-схема (items, snapshots, runs/digests), оркестратор run() + CLI. Изучен trend-pulse (MIT) как референс.oauth.reddit.com, другой эндпоинт, обычно пускает с app-ключомДо решения источник отключён, прогон не падает. Reddit = ключевой EN-социальный velocity-сигнал.
pipeline/idea_engine/reddit_source.py — .json + stealth-фолбэк + скоринг + медиа-экстракт. База для Reddit-ingestion и комментов.pipeline/idea_engine/youtube_source.py — YouTube Data API (~/.claude/.accounts/oko.env).pipeline/idea_score.py — genre-гейт (hook+stakes+digit+fit). Расширить до LLM-классификатора слоя 5.integrations/stealth-browser/cli.py — camoufox для bot-walled источников.integrations/gemini/client.py — LLM для дистилляции + жанр-фильтр.nice, не параллелить тяжёлое; IPv6 outbound сломан (IPv4-only); Reddit/Pexels режут VPS-IP → stealth/Mac.Движок находит ускоряющиеся новости раньше чем они попадают в публичные «тренды». Velocity из GDELT-ряда за один вызов — без фона, без подписок, $0 на прогон.
run() — один и тот же код станет фоновым cron'ом добавлением одной обёртки. Переход тривиален по замыслу.Размер проверки: один smoke-прогон, 1 событие с GDELT-рядом против N flat-новостей. Статистики по качеству ранжирования в целом нет — это первое доказательство принципа, не финальный бенчмарк точности.
Reddit отключён: EN-социальный сигнал отсутствует. Это ключевой источник velocity-сигналов. Без него движок работает только на новостях + GDELT, покрытие соцсетей — ноль.
GDELT hit-rate 1/12: velocity-ряд получает только 1 из 12 новостей за прогон — keyword-extractor грубый. Остальные скорятся только snapshot-прокси (views/возраст). Реальная точность momentum ограничена до улучшения экстрактора.
Без кластеризации (Фаза 2): одно событие с Reddit + GDELT + News отображается как 3 отдельных элемента в ленте. Дедуп кросс-источниковый — не до Фазы 2.