HTTP-сервис для автоматической публикации новостей в VK, Telegram и WordPress с поддержкой Google Alerts.
- 📥 POST /ingest — приём новостей от Make.com
- 🔗 Развёртывание Google Alerts URL (редиректы)
- 🖼️ Автоматическое извлечение og:image
- 📝 Генерация буллетов без LLM (эвристика)
- 🏷️ Автоматические хэштеги из заголовка
- 📊 SQLite дедупликация по final_url
- 🚀 Публикация в WordPress, Telegram, VK
# Создаём директории
sudo mkdir -p /opt/news-agent
sudo mkdir -p /var/lib/news-agent/media
# Права (www-data для nginx/uvicorn)
sudo chown -R www-data:www-data /opt/news-agent
sudo chown -R www-data:www-data /var/lib/news-agent# Копируем проект
sudo cp -r /path/to/news-agent/* /opt/news-agent/
# Права
sudo chown -R www-data:www-data /opt/news-agent# Python 3.11
sudo apt update
sudo apt install -y python3.11 python3.11-venv python3-pip
# Virtual environment
cd /opt/news-agent
sudo -u www-data python3.11 -m venv venv
# Зависимости
sudo -u www-data /opt/news-agent/venv/bin/pip install -r requirements.txt# Копируем пример
sudo cp /opt/news-agent/.env.example /opt/news-agent/.env
# Редактируем
sudo nano /opt/news-agent/.envЗаполните переменные:
| Переменная | Описание |
|---|---|
WP_BASE_URL |
URL WordPress (https://04travel.ru) |
WP_USER |
Логин WordPress |
WP_APP_PASSWORD |
Application Password из WordPress |
TG_BOT_TOKEN |
Токен Telegram бота |
TG_CHAT_ID |
ID чата/канала Telegram |
VK_ACCESS_TOKEN |
Токен VK с правами wall, photos |
VK_OWNER_ID |
ID группы VK (отрицательное число) |
# Положите default.jpg в /opt/news-agent/
sudo cp /path/to/default.jpg /opt/news-agent/default.jpg
sudo chown www-data:www-data /opt/news-agent/default.jpg# Копируем unit
sudo cp /opt/news-agent/systemd/news-agent.service /etc/systemd/system/
# Перезагружаем systemd
sudo systemctl daemon-reload
# Включаем и запускаем
sudo systemctl enable news-agent
sudo systemctl start news-agent
# Проверяем статус
sudo systemctl status news-agentДобавьте в конфигурацию nginx:
location /news-agent/ {
proxy_pass http://127.0.0.1:8099/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}curl http://127.0.0.1:8099/health
# {"ok":true}curl -X POST http://127.0.0.1:8099/ingest \
-H "Content-Type: application/json" \
-d '{
"title": "На Алтае открылся новый туристический маршрут",
"url": "https://www.google.com/url?rct=j&sa=t&url=https://example.com/altai-news-123",
"source": "google_alerts",
"text": "На Алтае открылся новый туристический маршрут длиной 50 км. Маршрут проходит через живописные места Чемальского района. Туристы смогут увидеть горные озёра и водопады. Сезон открыт с мая по сентябрь.",
"html": "<html><head><meta property=\"og:image\" content=\"https://example.com/image.jpg\"></head><body><p>Текст статьи...</p></body></html>"
}'{
"status": "ok",
"reason": null,
"final_url": "https://example.com/altai-news-123",
"image_url": "https://example.com/image.jpg",
"wp_post_id": 12345,
"vk_post_id": "123456",
"tg_message_id": 789
}Входящие данные от Make.com:
{
"title": "Заголовок новости",
"url": "https://google.com/url?...",
"source": "google_alerts",
"published_at": "2024-01-15T10:00:00Z",
"text": "Текст статьи",
"html": "<html>...</html>"
}Ответ:
| Поле | Тип | Описание |
|---|---|---|
status |
string | ok, skipped, error |
reason |
string | Причина ошибки/пропуска |
final_url |
string | Развёрнутый URL |
image_url |
string | URL картинки |
wp_post_id |
int | ID поста в WordPress |
vk_post_id |
string | ID поста в VK |
tg_message_id |
int | ID сообщения в Telegram |
{"ok": true}- Развёртывание URL — если
google.com/url?..., делаем redirect - Дедупликация — проверяем
final_urlв SQLite - Извлечение контента — парсим HTML, ищем og:image
- Генерация буллетов — эвристика: цифры, ключевые слова, гео-слова Алтая
- Хэштеги — базовые + 2-4 из заголовка
- Публикация — WordPress → Telegram → VK
⚠️ Публикация в MAX пока не реализована. Подключим после уточнения способа отправки.
Включить можно через MAX_ENABLED=true в .env.
# Просмотр логов
sudo journalctl -u news-agent -f
# Последние 100 строк
sudo journalctl -u news-agent -n 100/opt/news-agent/
├── app/
│ ├── main.py # FastAPI приложение
│ ├── config.py # Конфигурация
│ ├── db.py # SQLite
│ ├── extract.py # Извлечение контента
│ ├── image.py # Работа с изображениями
│ ├── wp.py # WordPress
│ ├── tg.py # Telegram
│ ├── vk.py # VK
│ └── max.py # MAX (заглушка)
├── systemd/
│ └── news-agent.service
├── requirements.txt
├── .env
├── .env.example
├── default.jpg
└── README.md
MIT