Latest_News_Bot
所属分类:Docker
开发工具:Python
文件大小:0KB
下载次数:0
上传日期:2023-08-01 22:16:41
上 传 者:
sh-1993
说明: 用于解析新闻文章并在电报机器人中阅读它们的API,
(API for parsing news articles and reading them in a Telegram bot,)
文件列表:
Dockerfile (270, 2023-12-06)
LICENSE (1072, 2023-12-06)
alembic.ini (3264, 2023-12-06)
alembic/ (0, 2023-12-06)
alembic/env.py (2596, 2023-12-06)
alembic/script.py.mako (510, 2023-12-06)
alembic/versions/ (0, 2023-12-06)
alembic/versions/0112e416d455_users.py (1336, 2023-12-06)
alembic/versions/04d5a25a9a5f_usermodel_limit_added.py (687, 2023-12-06)
alembic/versions/277a7f3ade68_cascade_option.py (570, 2023-12-06)
alembic/versions/42ec8808acf7_autoincrement.py (569, 2023-12-06)
alembic/versions/44c042d1297b_video_link_added.py (680, 2023-12-06)
alembic/versions/4eab5418ff11_optional_chat_id.py (779, 2023-12-06)
alembic/versions/4eacd65ddb52_video_preview_added.py (699, 2023-12-06)
alembic/versions/6547cda9ef8b_first_migration.py (1834, 2023-12-06)
alembic/versions/7c60f284cfcf_ondelete.py (1240, 2023-12-06)
alembic/versions/da0f329dac4d_autoincrement.py (1026, 2023-12-06)
app/ (0, 2023-12-06)
app/__init__.py (0, 2023-12-06)
app/api/ (0, 2023-12-06)
app/api/__init__.py (0, 2023-12-06)
app/api/endpoints/ (0, 2023-12-06)
app/api/endpoints/__init__.py (222, 2023-12-06)
app/api/endpoints/articles.py (3629, 2023-12-06)
app/api/endpoints/base_interact.py (919, 2023-12-06)
app/api/endpoints/telegram_webhook.py (956, 2023-12-06)
app/api/endpoints/user.py (1221, 2023-12-06)
app/api/jobs.py (2836, 2023-12-06)
app/api/routers.py (628, 2023-12-06)
app/api/templates/ (0, 2023-12-06)
app/api/templates/404.html (854, 2023-12-06)
app/api/templates/__init__.py (0, 2023-12-06)
app/api/templates/article.html (2968, 2023-12-06)
app/api/templates/img_not_found.png (94965, 2023-12-06)
... ...
# Latest News
![latest_news_workflow](https://github.com/AbbadonAA/Latest_News_Bot/workflows/latest_news_workflow/badge.svg)
## Описание
**Latest News** - это API сервиса для парсинга новостных статей с интегрированным ботом Telegram.
API может быть использован для взаимодействия со сторонними ботами Telegram или иными сервисами - новостными агрегаторами.
**Основной функционал API:**
- Запуск парсеров для заполнения БД новостными статьями;
- Очистка БД от устаревших новостных статей;
- Управление пользователями: регистрация, аутентификация, авторизация, редактирование;
- Получение из БД записей с новостными статьями с возможностью фильтрации. Полученные пользователем статьи помечаются прочитанными и исключаются из ответа при следующих запросах;
- Формирование html-шаблона статьи для корректного отображения при помощи InstantView Telegram.
**Реализован парсинг следующих новостных ресурсов:**
- РБК;
- ИноСМИ.
**Настроены:**
- Автоматическое создание первого суперпользователя при запуске проекта;
- CI/CD (GitHub Actions + Docker-Compose).
## Ключевые технологии и библиотеки:
[![Python][Python-badge]][Python-url]
[![FastAPI][FastAPI-badge]][FastAPI-url]
[![Scrapy][Scrapy-badge]][Scrapy-url]
[![Python-telegram-bot][Python-telegram-bot-badge]][Python-telegram-bot-url]
[![Postgres][Postgres-badge]][Postgres-url]
[![SQLAlchemy][SQLAlchemy-badge]][SQLAlchemy-url]
[![Docker][Docker-badge]][Docker-url]
[![Nginx][Nginx-badge]][Nginx-url]
## Полная установка для локального запуска
1. Склонируйте репозиторий:
```shell
git clone git@github.com:AbbadonAA/Latest_News_Bot.git
```
2. Активируйте venv и установите зависимости:
```shell
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
3. Создайте в корневой директории файл .env со следующим наполнением:
```dotenv
# Переменные 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=admin@gmail.com # (пример) 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, следуя официальным инструкциям:
https://ngrok.com/download
- Запустите Ngrok и введите команду:
```shell
ngrok http 8080
```
- Задайте значение переменной окружения (.env):
```dotenv
DOMAIN_NAME=https://1234-56-78-9.eu.ngrok.io # Пример
```
----
4. Запустите контейнер с базой данных PostgreSQL (должен быть установлен Docker):
```shell
cd infra/
docker-compose -f docker-compose.local.yml up -d news_db
```
5. В корневой директории примените миграции для создания таблиц в БД:
```shell
alembic upgrade head
```
6. Проект готов к запуску.
## Управление при локальном запуске:
В корневой директории выполните команду:
```shell
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).
Упрощенный вариант установки для запуска в контейнерах
1. Создайте директорию для приложения:
```shell
mkdir LATEST_NEWS (пример)
```
2. Разместите в созданной директории файл .env со следующим наполнением:
```dotenv
# Переменные 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=admin@gmail.com # (пример) 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)
```
3. В директории приложения создайте директорию /infra:
```shell
mkdir infra
```
4. Разместите в директории /infra файл docker-compose.local.yml
5. В директории /infra запустите docker-compose:
```shell
docker-compose -f docker-compose.local.yml up -d
```
6. Проект запущен в двух контейнерах:
- latest_news_bot
- latest_news_db
## Установка на сервере и получение сертификата SSL
1. Создайте на сервере директорию для приложения:
```shell
mkdir latest-news (пример)
```
2. Разместите в созданной директории файл .env со следующим наполнением:
```dotenv
# Переменные 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=admin@gmail.com # (пример) 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. - В этом случае пользователь будет получать ссылку и открывать её в браузере.
3. В случае запуска отображения статей в режиме Instant View - создайте свой [шаблон IV](https://instantview.telegram.org/) и укажите его rhash в файле .env:
```dotenv
RHASH=f4642197829222 # (пример) rhash вашего шаблона IV
```
4. Создайте директорию /infra:
```shell
mkdir infra
```
5. Разместите в директории /infra файл docker-compose.prod.yml
6. Уточните в файле docker-compose.prod.yml переменные окружения:
```dotenv
VIRTUAL_HOST=example.com (укажите Ваш домен)
LETSENCRYPT_HOST=example.com (укажите Ваш домен)
LETSENCRYPT_EMAIL=your_email@example.com (укажите Ваш email)
```
7. Разместите в директории /infra (лучше создать отдельную директорию) файл docker-compose.nginx.yml
8. Создайте сеть Docker:
```shell
docker network create nginx-proxy
```
9. Запустите контейнеры:
```shell
docker-compose -f docker-compose.nginx.yml up -d
docker-compose -f docker-compose.prod.yml up -d
```
10. Проект запущен в четырех контейнерах:
- latest_news_bot
- latest_news_db
- nginx-proxy
- letsencrypt
Получен сертификат SSL и настроено автоматическое обновление сертификатов.
## Лицензия
- ### **MIT License**
### Автор
Pushkarev Anton
pushkarevantona@gmail.com
[Python-url]: https://www.python.org/
[Python-badge]: https://img.shields.io/badge/Python-14354C?style=for-the-badge&logo=python&logoColor=white
[FastAPI-url]: https://fastapi.tiangolo.com/
[FastAPI-badge]: https://img.shields.io/badge/FastAPI-005571?style=for-the-badge&logo=fastapi
[Scrapy-url]: https://pypi.org/project/Scrapy/
[Scrapy-badge]: https://img.shields.io/badge/-Scrapy-forestgreen?style=for-the-badge&
[Python-telegram-bot-url]: https://github.com/python-telegram-bot/python-telegram-bot
[Python-telegram-bot-badge]: https://img.shields.io/badge/python--telegram--bot-2CA5E0?style=for-the-badge
[Postgres-url]: https://www.postgresql.org/
[Postgres-badge]: https://img.shields.io/badge/postgres-%23316192.svg?style=for-the-badge&logo=postgresql&logoColor=white
[SQLAlchemy-url]: https://pypi.org/project/SQLAlchemy/
[SQLAlchemy-badge]: https://img.shields.io/badge/-SQLAlchemy-dimgrey?style=for-the-badge&
[Docker-url]: https://www.docker.com/
[Docker-badge]: https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge&logo=docker&logoColor=white
[Nginx-url]: https://nginx.org
[Nginx-badge]: https://img.shields.io/badge/nginx-%23009639.svg?style=for-the-badge&logo=nginx&logoColor=white~~
近期下载者:
相关文件:
收藏者: