Как запустить автопостинг отраслевых новостей за 7 дней

Кратко и по делу

Это инструкция для команды «Контент-Агент», которая хочет за 7 дней запустить стабильный автопостинг отраслевых новостей. Без общей теории — конкретные шаги, инструменты, примеры кода и конфигурации. Обязательные компоненты: источник (RSS/JSON), процесс обработки (парсер), хранилище и точка выхода — REST API для публикации на сайт или в CMS.

Что потребуется заранее

  • Домен и сервер/контейнер (Docker) с доступом по SSH;
  • Список релевантных RSS-лент и API-поставщиков отраслевых новостей;
  • Доступ к CMS с REST API для публикации или возможность принимать POST-запросы;
  • DevOps: контейнеризация, cron / systemd timer, логирование и мониторинг (Prometheus/Graylog по желанию).

Ключевые технологии (быстрая сводка)

Слой Рекомендованные инструменты Примечание
Сбор RSS ленты, JSON API RSS‑парсинг предпочтителен для отраслевых агрегаторов
Парсинг Python + feedparser / Node.js + rss-parser Легко тестировать локально
Очистка Bleach (Python), DOMPurify (JS) Удалять скрипты, inline-styles
Публикация REST API для публикации Требует аутентификации и идемпотентности

7-дневный план: пошагово

День 1 — Сбор требований и источников

  • Определите 10 первичных источников: 6 RSS и 4 API. Пример: b2b.example.com/rss, industrynews.api.com/v1/posts.
  • Проведите тест выборки: вручную скачайте 5-10 записей из каждого источника и оцените поля (title, link, pubDate, content, author, categories).
  • Сформируйте требования к содержимому: сводка 70–120 слов, категория, метки, изображение.

День 2 — Архитектура и idempotency

Схема: сборщик -> парсер -> очередь (Redis/RabbitMQ) -> публишер. Ключевая задача — обеспечить идемпотентность: каждое событие должно иметь уникальный ключ (GUID или хэш от source+guid+pubDate).

Правило: если запись уже опубликована, пропускаем. Храним в Redis SET последних 10k ключей.

День 3 — Быстрый прототип парсера (пример на Python)

Используем feedparser и requests. Код запускается в Docker контейнере и читает конфиг sources.json.

import feedparser
import requests
import hashlib

def uid(entry, source):
    key = source + entry.get('id', entry.get('link', ''))
    return hashlib.sha1(key.encode()).hexdigest()

feed = feedparser.parse('https://b2b.example.com/rss')
for e in feed.entries:
    print(uid(e, 'b2b'))

Дополнительно: нормализуйте pubDate в ISO 8601 и вытаскивайте content или summary.

День 4 — Очистка и подготовка контента

  • Примените HTML-сантайзер: удаляйте <script>, iframe и внешние стили.
  • Генерация описания: если нет короткой сводки — создайте саммари 70–120 слов (простая обрезка + удаление ссылок).
  • Изображения: вытаскивайте media:content или используйте Open Graph; сохраняйте CDN-бэкап по URL.

День 5 — Подключение REST API для публикации

Разница: публикация через CMS REST API vs. прямой в базу. Рекомендую REST API для публикации — контролируем логику, статусы и ошибки.

Пример REST API запроса (POST) для публикации:

POST https://cms.example.com/api/posts
Headers: Authorization: Bearer TOKEN
Body (JSON): {
  "title": "Заголовок",
  "slug": "generated-slug",
  "content": "

Контент

", "published_at": "2026-02-18T10:00:00Z", "tags": ["отрасль","новости"] }

Реализуйте повторные попытки с экспоненциальной задержкой и логирование ответа: 200/201 — успех; 409 — конфликт, игнорируем; 429/5xx — ставим задачу в очередь назад.

День 6 — Развертывание и планировщик

Разверните в Docker Compose: сервис парсера, очередь Redis, worker публишер. Настройте crontab или systemd timer для запуска парсера каждые 5–15 минут в зависимости от плотности новостей.

Минимальная docker-compose.yml: один контейнер с приложением, Redis и volume для логов.

День 7 — Тестирование, мониторинг и запуск в прод

  • Тесты: интеграционные тесты с моками RSS и мок-REST API. Проверяйте идемпотентность на 1000 записей.
  • Мониторинг: счётчики — входящих записей, успешных публикаций, ошибок. Настройте алерты на падение скорости публикаций.
  • Запуск: постепенно включайте источники — сначала 3, потом +2 каждые 12 часов.

Практические советы и кейсы

Кейс: быстрое восстановление после ошибки API

Проблема: REST API для публикации возвращает 502. Решение: переводим на режим backoff и переключаемся в «черновики» — сохраняем подготовленный JSON в S3 и ставим задачу на повтор. В результате 0 потерянных материалов и возможность ручного вливания.

Кейс: конфликт дублирования

Источник дублирует одну и ту же новость с разными guid. Решение: в uid используйте хэш от (source + normalized_title + date). Это закрывает большинство дубликатов.

Сравнение подходов: RSS‑парсинг vs прямой API

Параметр RSS‑парсинг Прямой API
Стабильность Высока, прост в работе Может требовать ключей и квот
Детализация данных Ограничена Больше полей, фильтры
Сложность реализации Низкая Средняя

Контроль качества и правила публикации

  • Все посты проходят автоматическую проверку на profanity и запрещённые темы.
  • Не публикуйте копипаст полностью — добавляйте краткую аннотацию и ссылку на источник.
  • Устанавливайте метаданные: категория, source_id, original_url — для обратной трассировки.

Итоги и чек-лист запуска

  1. Собрать 10 источников;
  2. Прототип парсера и уникальный ключ (uid);
  3. Зашитая логика очистки и генерации описания;
  4. Подключен REST API для публикации с retry и idempotency;
  5. Запущен в Docker, настроен мониторинг и алерты.

Следуя этому плану «Контент-Агент» сможет запустить стабильный автопостинг новостей за 7 дней, используя RSS‑парсинг и REST API для публикации. Конкретные команды и конфигурации адаптируйте под вашу CMS и требования безопасности.