Files
vesti/openspec/changes/rich-repost-card/proposal.md
T

4.3 KiB
Raw Blame History

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-экранирование как текст поста.