Files
kwork/README.md
2026-07-14 15:04:31 +07:00

73 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# my_parser
Парсер офферов с `kwork.ru` и `fl.ru` с отправкой в Telegram и возможностью добавлять новые источники.
## Что умеет
- запускается каждые `X` минут через `APScheduler`
- читает настройки из `.env`
- забирает проекты `kwork.ru` по списку категорий `fc`
- забирает проекты `fl.ru` из RSS-ленты
- фильтрует офферы по ключевым словам
- фильтрует офферы по минимальной сумме
- не отправляет уже отправленные офферы повторно
- отправляет релевантные офферы в Telegram-канал через `aiogram`
## Запуск
1. Создать и заполнить `.env` по примеру `.env.example`.
2. Установить зависимости:
```bash
pip install -r requirements.txt
```
3. Запустить:
```bash
python main.py
```
Дополнительно можно задать `MIN_PRICE_AMOUNT`, чтобы пропускать только офферы с бюджетом не ниже указанного значения в рублях.
RSS `fl.ru` настраивается через `FL_RSS_URL`. По умолчанию используется `https://www.fl.ru/rss/?category=5`.
Для Telegram можно указать `TELEGRAM_PROXY_URL`, например `socks5://user:pass@host:port` или `http://host:port`.
## Docker
Сборка образа:
```bash
docker build -t my-parser .
```
Запуск контейнера:
```bash
docker run --rm --env-file .env -v "$(pwd)/data:/app/data" my-parser
```
В образе используется multistage-сборка:
- на этапе `builder` ставятся зависимости в отдельный `venv`
- на этапе `runtime` копируются только готовое окружение и исходники
Это ускоряет пересборку, если меняется только код приложения, а `requirements.txt` остается прежним.
## Структура
- `app/config.py` - загрузка настроек
- `app/sources/base.py` - базовый интерфейс источника
- `app/sources/kwork.py` - реализация источника `kwork`
- `app/sources/fl.py` - реализация RSS-источника `fl.ru`
- `app/service.py` - получение, фильтрация и отправка офферов
- `app/telegram.py` - публикация сообщений в Telegram
- `app/state.py` - хранение уже отправленных офферов
## Как добавить новый сайт
1. Создать новый класс в `app/sources/`, унаследованный от `OfferSource`.
2. Реализовать в нем `fetch_offers()` с возвратом списка `Offer`.
3. Подключить источник в `main.py`.