Initial import: vesti.nixg.ru — новостной апрув-проект (web, crawler, classifier, publisher, openspec)

This commit is contained in:
kpa39l
2026-09-13 15:58:32 +00:00
commit c3f59f7b7a
113 changed files with 7065 additions and 0 deletions
@@ -0,0 +1,50 @@
## Why
Пользователь опубликовал несколько постов через веб-approve в канал @dedinit_vesti
и увидел, что в канале пост выглядит «как простой агрегатор»:
- только ссылка на чужой канал (заголовок-сниппет из первых 120 символов текста),
- служебная информация по направлениям (📁 направление/язык, 📰 источник, 👁 просмотры),
- в конце Telegram добавляет предпросмотр ссылки (link preview).
Такой репост никому не интересен: не видно ни медиа из оригинального поста, ни
полного текста, ни комментария модератора — только «голая» ссылка и служебка.
## What Changes
Формат публикуемого поста (карточка) меняется на «богатый репост»:
1. **Медиа из оригинального поста** — если у поста есть media_path (фото/видео),
оно отправляется **первым сообщением** (sendPhoto/sendVideo), а текст — следующим.
Сейчас sendPhoto есть, но caption обрезается до 1024 и текст дублируется вторым
сообщением; видео (content_type=video) вообще не отправляется как медиа (фильтр в card.py).
2. **Полный текст поста** — вместо сниппета из первых 120 символов (make_card) или
summary отправляется полный текст исходного поста (обрезанный до Telegram-лимита 4096).
3. **Комментарий модератора** — в веб-форме approve добавляется поле «Комментарий
(по желанию)»; комментарий публикуется первым (или в начале текста), чтобы в канале
было видно мнение/контекст редактора, а не только пересказ.
4. **Ссылка на оригинал БЕЗ предпросмотра** — ссылка на исходный пост остаётся в тексте,
но Telegram-предпросмотр ссылки отключается (sendMessage параметр
`link_preview_options={"is_disabled": True}`), чтобы канал не выглядел как агрегатор
ссылок с превью.
5. **Служебная информация** — частично убирается/переформатируется: направление/язык,
источник, просмотры больше НЕ обязательны в теле поста (внешняя ссылка на оригинал
уже даёт контекст). Остаётся атрибуция для своего контента («Дед в АйТи»).
## Impact
- `publisher/card.py` — построение текста карточки (полный текст + комментарий + ссылка
+ атрибуция, служебка по минимуму).
- `services/publisher/app/telegram.py` — поддержка видео (sendVideo), параметр
`link_preview_options` для sendMessage; send_photo с полным caption без обрезания
(или без дублирования текста).
- `services/publisher/app/main.py` — Card модель: +`comment`; передача link_preview_options.
- `web/app.py` (approve) — чтение комментария из формы, проброс в card.
- `web/templates/candidates.html` — поле ввода комментария в форме approve.
- `publisher/card.py` — фильтр медиа: разрешить video (mp4), не только картинки.
- Rollback: вернуть прежний make_card и вызовы; карточки станут как раньше.
- Безопасность: комментарий — пользовательский ввод → HTML-экранирование как текст поста.