Latest News - это API сервиса для парсинга новостных статей с интегрированным ботом Telegram.
API может быть использован для взаимодействия со сторонними ботами Telegram или иными сервисами - новостными агрегаторами.
Основной функционал API:
- Запуск парсеров для заполнения БД новостными статьями;
- Очистка БД от устаревших новостных статей;
- Управление пользователями: регистрация, аутентификация, авторизация, редактирование;
- Получение из БД записей с новостными статьями с возможностью фильтрации. Полученные пользователем статьи помечаются прочитанными и исключаются из ответа при следующих запросах;
- Формирование html-шаблона статьи для корректного отображения при помощи InstantView Telegram.
Реализован парсинг следующих новостных ресурсов:
- РБК;
- ИноСМИ.
Настроены:
- Автоматическое создание первого суперпользователя при запуске проекта;
- CI/CD (GitHub Actions + Docker-Compose).
- Склонируйте репозиторий:
git clone [email protected]:AbbadonAA/Latest_News_Bot.git
- Активируйте venv и установите зависимости:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
- Создайте в корневой директории файл .env со следующим наполнением:
# Переменные API
APP_TITLE=LATEST_NEWS_PARSER # (пример) название приложения
DEBUG=False # True для включения режима отладки
HOST=0.0.0.0 # хост
PORT=8080 # порт
DOMAIN=False # имеется ли DOMAIN_NAME
DOMAIN_NAME=https://example.com # пример при наличии (необходим сертификат SSL)
PARSER_FREQUENCY=5 # периодичность запуска парсеров (минуты)
STORAGE_DAYS=30 # срок хранения данных в БД
SECRET=539e2390-9cc3-4bc7-aec1-2e96471ba49f # (пример) uuid для хеширования
FIRST_SUPERUSER_EMAIL=[email protected] # (пример) email первого суперпользователя
FIRST_SUPERUSER_PASSWORD=AdmiN_123456789 # (пример) пароль суперпользователя
# Переменные бота
IP=127.0.0.1 # (пример) адрес вашего сервера
WEBHOOK=False # True для запуска бота в режиме webhook
BOT_TOKEN=5157247582:ATFpZanqlutiNMJfvO6tiNUDPnBkFAmiVi4 # (пример) токен бота Telegram
# Переменные базы данных
POSTGRES_DB=news_db # название БД
POSTGRES_USER=postgres # имя пользователя БД
POSTGRES_PASSWORD=postgres # пароль БД
DB_HOST=localhost # хост БД (для запуска через docker-compose заменить на имя сервиса с БД)
DB_PORT=6100 # порт БД (можно указать любой, но не забудьте внести изменения в файлы docker-compose)
Warning: Для локального запуска рекомендуется не указывать домен (DOMAIN=False) и запускать бота в режиме polling (WEBHOOK=False). В случае запуска бота в режиме webhook требуется наличие доменного имени с установленным сертификатом SSL. Иначе потребуется использовать Ngrok.
Использование Ngrok
Ngrok позволяет создавать временный общедоступный адрес (туннель) локального сервера.
Подробнее: https://ngrok.com/
-
Установите Ngrok, следуя официальным инструкциям:
-
Запустите Ngrok и введите команду:
ngrok http 8080
-
Задайте значение переменной окружения (.env):
DOMAIN_NAME=https://1234-56-78-9.eu.ngrok.io # Пример
- Запустите контейнер с базой данных PostgreSQL (должен быть установлен Docker):
cd infra/
docker-compose -f docker-compose.local.yml up -d news_db
- В корневой директории примените миграции для создания таблиц в БД:
alembic upgrade head
- Проект готов к запуску.
В корневой директории выполните команду:
python run.py
Сервис будет запущен и доступен по следующим адресам:
(при условии, что в файле .env: HOST=0.0.0.0, PORT=8080)
- http://127.0.0.1:8080 - API
- http://127.0.0.1:8080/docs - документация Swagger
- http://127.0.0.1:8080/redoc - документация ReDoc
Также будет запущен бот Telegram, токен которого указан в файле .env.
В БД будет автоматически создан первый суперпользователь (email, password указаны в файле .env).
Упрощенный вариант установки для запуска в контейнерах
- Создайте директорию для приложения:
mkdir LATEST_NEWS (пример)
- Разместите в созданной директории файл .env со следующим наполнением:
# Переменные API
APP_TITLE=LATEST_NEWS_PARSER # (пример) название приложения
DEBUG=False # True для включения режима отладки
HOST=0.0.0.0 # хост
PORT=8080 # порт
DOMAIN=False # имеется ли DOMAIN_NAME
DOMAIN_NAME=https://example.com # пример при наличии (необходим сертификат SSL)
PARSER_FREQUENCY=5 # периодичность запуска парсеров (минуты)
STORAGE_DAYS=30 # срок хранения данных в БД
SECRET=539e2390-9cc3-4bc7-aec1-2e96471ba49f # (пример) uuid для хеширования
FIRST_SUPERUSER_EMAIL=[email protected] # (пример) email первого суперпользователя
FIRST_SUPERUSER_PASSWORD=AdmiN_123456789 # (пример) пароль суперпользователя
# Переменные бота
IP=127.0.0.1 # (пример) адрес вашего сервера
WEBHOOK=False # True для запуска бота в режиме webhook
BOT_TOKEN=5157247582:ATFpZanqlutiNMJfvO6tiNUDPnBkFAmiVi4 # (пример) токен бота Telegram
# Переменные базы данных
POSTGRES_DB=news_db # название БД
POSTGRES_USER=postgres # имя пользователя БД
POSTGRES_PASSWORD=postgres # пароль БД
DB_HOST=news_db # хост БД
DB_PORT=6100 # порт БД (можно указать любой, но не забудьте внести изменения в файлы docker-compose)
- В директории приложения создайте директорию /infra:
mkdir infra
- Разместите в директории /infra файл docker-compose.local.yml
- В директории /infra запустите docker-compose:
docker-compose -f docker-compose.local.yml up -d
- Проект запущен в двух контейнерах:
- latest_news_bot
- latest_news_db
- Создайте на сервере директорию для приложения:
mkdir latest-news (пример)
- Разместите в созданной директории файл .env со следующим наполнением:
# Переменные API
APP_TITLE=LATEST_NEWS_PARSER # (пример) название приложения
DEBUG=False # True для включения режима отладки
HOST=0.0.0.0 # хост
PORT=8080 # порт
DOMAIN=True # имеется ли DOMAIN_NAME
DOMAIN_NAME=https://example.com # (пример)
PARSER_FREQUENCY=5 # периодичность запуска парсеров (минуты)
STORAGE_DAYS=30 # срок хранения данных в БД
SECRET=539e2390-9cc3-4bc7-aec1-2e96471ba49f # (пример) uuid для хеширования
FIRST_SUPERUSER_EMAIL=[email protected] # (пример) email первого суперпользователя
FIRST_SUPERUSER_PASSWORD=AdmiN_123456789 # (пример) пароль суперпользователя
# Переменные бота
IP=127.0.0.1 # (пример) адрес вашего сервера
WEBHOOK=True # Запуск бота в режиме webhook
BOT_TOKEN=5157247582:ATFpZanqlutiNMJfvO6tiNUDPnBkFAmiVi4 # (пример) токен бота Telegram
INSTANT_VIEW=True # Активация режима чтения статей через Instant View
RHASH=f4642197829222 # (пример) rhash вашего шаблона Instant View
# Переменные базы данных
POSTGRES_DB=news_db # название БД
POSTGRES_USER=postgres # имя пользователя БД
POSTGRES_PASSWORD=postgres # пароль БД
DB_HOST=news_db # хост БД
DB_PORT=6100 # порт БД (можно указать любой, но не забудьте внести изменения в файлы docker-compose)
Warning: Следует учитывать, что режим Instant View корректно работает только с мобильной версией Telegram. При попытке просмотра статей в Telegram через браузер или десктопное приложение могут возникать различные ошибки. Это связано с самой реализацией Instant View. Для стабильной и корректной работы приложения на всех устройствах, вероятно, следует пожертвовать Instant View, не добавляя соответствующие строки в файл .env. - В этом случае пользователь будет получать ссылку и открывать её в браузере.
- В случае запуска отображения статей в режиме Instant View - создайте свой шаблон IV и укажите его rhash в файле .env:
RHASH=f4642197829222 # (пример) rhash вашего шаблона IV
- Создайте директорию /infra:
mkdir infra
- Разместите в директории /infra файл docker-compose.prod.yml
- Уточните в файле docker-compose.prod.yml переменные окружения:
VIRTUAL_HOST=example.com (укажите Ваш домен)
LETSENCRYPT_HOST=example.com (укажите Ваш домен)
LETSENCRYPT_EMAIL=[email protected] (укажите Ваш email)
- Разместите в директории /infra (лучше создать отдельную директорию) файл docker-compose.nginx.yml
- Создайте сеть Docker:
docker network create nginx-proxy
- Запустите контейнеры:
docker-compose -f docker-compose.nginx.yml up -d
docker-compose -f docker-compose.prod.yml up -d
- Проект запущен в четырех контейнерах:
-
latest_news_bot
-
latest_news_db
-
nginx-proxy
-
letsencrypt
Получен сертификат SSL и настроено автоматическое обновление сертификатов.
Pushkarev Anton