# 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`.