Skip to content
Merged

Dev #13

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
82e51f1
parser
dmsnback Jan 27, 2026
373d6b4
parser
dmsnback Jan 27, 2026
1c12c7c
add sqlite3
dmsnback Jan 27, 2026
0dcba60
Delete satire_pulp.db
dmsnback Jan 27, 2026
6bbd316
add sqlite3
dmsnback Jan 27, 2026
c4d5fef
Delete satire_pulp.db
dmsnback Jan 27, 2026
70549f7
add db to gitignore
dmsnback Jan 27, 2026
cf41fd9
Merge pull request #2 from dmsnback/feature/parser
dmsnback Jan 27, 2026
664e339
bot
dmsnback Jan 29, 2026
54184da
Merge pull request #3 from dmsnback/feature/parser
dmsnback Jan 29, 2026
db0a1c7
бот автоматически отправляет новость, если новая появилась в базе
dmsnback Feb 5, 2026
a25fa7c
requirements.txt
dmsnback Feb 5, 2026
fdc827b
Merge pull request #4 from dmsnback/feature/send_new_news
dmsnback Feb 5, 2026
209f4aa
Delete last_id.txt
dmsnback Feb 5, 2026
ffa6495
Update .gitignore
dmsnback Feb 5, 2026
865dca4
scheduler
dmsnback Feb 7, 2026
f496e0b
scheduler
dmsnback Feb 7, 2026
b6425f6
scheduler
dmsnback Feb 7, 2026
ec3a926
Merge pull request #5 from dmsnback/feature/schedule
dmsnback Feb 7, 2026
d9c5749
Добавлена новая таблицв в базу, переделана автоотправка сообщений
dmsnback Feb 7, 2026
45abfc8
Merge pull request #6 from dmsnback/feature/new_table
dmsnback Feb 7, 2026
484c20d
База PostgreSQL
dmsnback Feb 11, 2026
0581c3f
База PostgreSQL, запуск в Docker
dmsnback Feb 11, 2026
c58ea84
База PostgreSQL, запуск в Docker
dmsnback Feb 11, 2026
c47d1a1
Merge pull request #7 from dmsnback/feature/postgres
dmsnback Feb 11, 2026
c7dc0ce
refactoring
dmsnback Feb 12, 2026
4ce99e8
Merge pull request #8 from dmsnback/refactoring
dmsnback Feb 12, 2026
8d75c08
pytest
dmsnback Feb 16, 2026
6ee7e1d
pytest
dmsnback Feb 16, 2026
c5292bd
Merge pull request #9 from dmsnback/feature/pytest
dmsnback Feb 16, 2026
73e3294
ci_pytest
dmsnback Feb 16, 2026
dbde348
Merge pull request #10 from dmsnback/ci_pytest
dmsnback Feb 16, 2026
be6957e
ci_push_to_dockerhub
dmsnback Feb 16, 2026
d24b123
Merge pull request #11 from dmsnback/ci_push_to_dockerhub
dmsnback Feb 16, 2026
8c55942
docker-compose
dmsnback Feb 16, 2026
dca4151
readme.md
dmsnback Feb 16, 2026
c11662b
readme.md
dmsnback Feb 16, 2026
286438f
Merge pull request #12 from dmsnback/feature/readme
dmsnback Feb 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
__pycache__
.env
.git
.venv
.idea
2 changes: 1 addition & 1 deletion .flake8
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[flake8]
max-line-length = 79
extend-ignore = E501, W503, E203, E402, E712
extend-ignore = E501, W503, E203, E402, E712, W605
exclude =
.git,
backend/alembic/versions/*,
Expand Down
82 changes: 81 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
name: Satire Pulp parser

on: [push]
on:
push:
branches:
- "**"
pull_request:

jobs:
lint:
Expand Down Expand Up @@ -30,3 +34,79 @@ jobs:

- name: Flake8 Check
run: flake8 .

tests:
name: Pytest
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: "3.11"

- name: Upgrade pip
run: python -m pip install --upgrade pip

- name: Install Dependencies
run: pip install -r requirements.txt

- name: Run Pytest
run: pytest -v

push_branch_dev_to_docker_hub:
name: Build and Push Docker(dev)
runs-on: ubuntu-latest
needs: lint

if: github.ref == 'refs/heads/dev'

steps:
- name: Check out the repo
uses: actions/checkout@v4

- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Docker
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Push to Docker Hub
uses: docker/build-push-action@v5
with:
push: true
tags: |
dmsn/satire_pulp_parser:dev

push_branch_main_to_docker_hub:
name: Build and Push Docker(prod)
runs-on: ubuntu-latest
needs: lint

if: github.ref == 'refs/heads/main'

steps:
- name: Check out the repo
uses: actions/checkout@v4

- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Docker
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Push to Docker Hub
uses: docker/build-push-action@v5
with:
push: true
tags: |
dmsn/satire_pulp_parser:prod
14 changes: 9 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ local_settings.py
db.sqlite3
db.sqlite3-journal


# Flask stuff:
instance/
.webassets-cache
Expand Down Expand Up @@ -169,11 +170,8 @@ dmypy.json
cython_debug/

# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

.idea/

# Abstra
# Abstra is an AI-powered process automation framework.
Expand Down Expand Up @@ -205,3 +203,9 @@ cython_debug/
marimo/_static/
marimo/_lsp/
__marimo__/


.DS_Store

*.db
last_id.txt
8 changes: 8 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
FROM python:3.11-slim
LABEL maintainer="Dmitry Titenkov <lt200711@yandex.ru>"
LABEL version="1.0"
LABEL description="Satire Pulp parser"
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r /app/requirements.txt --no-cache-dir
COPY . .
173 changes: 165 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,165 @@
# satire_pulp_parser
Парсер с сайта сатирических новостей [Панорама](https://panorama.pub/ "Перейти")

![Satire Pulp parser](https://github.com/dmsnback/satire_pulp_parser/actions/workflows/main.yml/badge.svg)
![Python](https://img.shields.io/badge/python-3.11-blue)
![Tests](https://img.shields.io/badge/tests-pytest-brightgreen)
![Black](https://img.shields.io/badge/code%20style-black-000000)
![License](https://img.shields.io/badge/license-MIT-green)
<a name="Начало"></a>

## Satire Pulp Parser

![Satire Pulp parser](https://github.com/dmsnback/satire_pulp_parser/actions/workflows/main.yml/badge.svg) ![Python](https://img.shields.io/badge/python-3.11-blue) ![Tests](https://img.shields.io/badge/tests-pytest-brightgreen) ![Black](https://img.shields.io/badge/code%20style-black-000000) ![License](https://img.shields.io/badge/license-MIT-green)


- [Описание](#Описание)
- [Технологии](#Технологии)
- [Тестирование](#Тестирование)
- [Шаблон заполнения .env-файла](#Шаблон)
- [Запуск проекта](#Запуск)
- [Автор](#Автор)

<a name="Описание"></a>

### Описание

Проект представляет собой парсер сатирических новостей с сайта [Панорама](https://panorama.pub/ "Перейти") и Telegram-бот для автоматической рассылки новых публикаций пользователям.

**Возможности:**

```md
- Парсинг новостей с сайта panorama.pub
- Сохранение новостей в PostgreSQL
- Автоматическая рассылка новых новостей через Telegram-бот
- Планировщик запуска парсера каждые 20 минут
- Асинхронная работа бота с данными
```

Парсер написан с использованием **Scrapy**, **SQLAlchemy**, **PostgreSQL** и **Python Telegram Bot**

В проекте настроен **CI pipeline** с использованием **GitHub Actions**:

```md
- Автоматическая проверка кода (black, isort, flake8)
- Запуск unit-тестов (`pytest`)
- Сборка Docker-образа
- Публикация образа в **Docker Hub** при пуше в соответствующие ветки
```

```md
Проект адаптирован для использования **PostgreSQL** и развёртывания в контейнерах **Docker**.
```

> [Вернуться в начало](#Начало)

<a name="Технологии"></a>

### Технологии

[![Python](https://img.shields.io/badge/Python-1000?style=for-the-badge&logo=python&logoColor=ffffff&labelColor=000000&color=000000)](https://www.python.org)
[![Scrapy](https://img.shields.io/badge/Scrapy-1000?style=for-the-badge&logo=scrapy&logoColor=ffffff&labelColor=000000&color=000000)](https://docs.scrapy.org/en/latest/index.html)
[![python_telegram_bot](https://img.shields.io/badge/python_telegram_bot-1000?style=for-the-badge&logo=telegram&logoColor=ffffff&labelColor=000000&color=000000)](https://docs.python-telegram-bot.org/en/stable/index.html)
[![Postgres](https://img.shields.io/badge/Postgres-1000?style=for-the-badge&logo=postgresql&logoColor=ffffff&labelColor=000000&color=000000)](https://www.postgresql.org)
[![SQLAlchemy](https://img.shields.io/badge/SQLAlchemy-1000?style=for-the-badge&logo=sqlalchemy&logoColor=ffffff&labelColor=000000&color=000000)](https://www.sqlalchemy.org)
[![Docker](https://img.shields.io/badge/Docker-1000?style=for-the-badge&logo=docker&logoColor=ffffff&labelColor=000000&color=000000)](https://www.docker.com)
[![Pytest](https://img.shields.io/badge/Pytest-1000?style=for-the-badge&logo=pytest&logoColor=ffffff&labelColor=000000&color=000000)](https://docs.pytest.org/en/stable/index.htmlc)
[![GitHub Actions](https://img.shields.io/badge/github%20actions-%232671E5.svg?style=for-the-badge&logo=githubactions&logoColor=ffffff&labelColor=000000&color=000000)](https://github.com/features/actions)

> [Вернуться в начало](#Начало)

<a name="Тестирование"></a>

### Тестирование

В проекте реализованы **unit-тесты** с использованием `pytest`.

Запуск тестов локально:

```python
pytest -v
```

> [Вернуться в начало](#Начало)

<a name="Шаблон"></a>

### Шаблон заполнения .env-файла

> `env.example` с дефолтными значениями расположен в корневой папке

```python
TELEGRAM_TOKEN=1234567890:Telegram-Token # Токен Telegram бота
DATABASE_URL_SYNC = postgresql+psycopg2://postgres:postgres@db:5432/satire_pulp_db # Указываем адрес БД (Синхронная версия)
DATABASE_URL_ASYNC=postgresql+asyncpg://postgres:postgres@db:5432/satire_pulp_db # Указываем адрес БД (Асинхронная версия)
POSTGRES_DB = satire_pulp_db # Имя базы дданных
POSTGRES_USER = postgres # Имя юзера PostgreSQL
POSTGRES_PASSWORD = yourpassword # Пароль юзера PostgreSQL
POSTGRES_HOST=db # Имя сервиса PostgreSQL в docker-compose
POSTGRES_PORT=5432 # Порт PostgreSQL внутри контейнера
```

> [Вернуться в начало](#Начало)

<a name="Запуск"></a>

### Запуск проекта

- Склонируйте репозиторий

```python
git clone git@github.com:dmsnback/satire_pulp_parser.git
```

- Установите и активируйте виртуальное окружение

```python
python3 -m venv venv
```

Для `Windows`

```python
source venv/Scripts/activate
```

Для `Mac/Linux`

```python
source venv/bin/activate
```

- Установите зависимости из файла
`requirements.txt`

```python
python3 -m pip install --upgrade pip
```

```python
pip install -r requirements.txt
```

- Запускаем Docker контейнеры (db, bot)

```python
docker-compose up -d db bot
```

- Создаём таблицы в БД

```python
docker-compose exec bot python -m db.init_db
```

- Перезапускаем Docker контейнеры

```python
docker-compose up -d
```

- После запуска запустите бота командой ```/start```

> Команда ```/show_news``` пришлёт последние 10 новостей из базы, если они ещё не были отправлены, далее бот будет присылать только новые новости, которые появятся на сайте.

> [Вернуться в начало](#Начало)

<a name="Автор"></a>

### Автор

- [Титенков Дмитрий](https://github.com/dmsnback)

> [Вернуться в начало](#Начало)
Empty file added bot/__init__.py
Empty file.
Loading