Этот документ предназначен для разработчиков, которые:
- форкают проект под себя
- добавляют свою бизнес-логику
- интегрируют новые источники / экспорты
- хотят внести свои изменения через pull request
Проект построен вокруг конфигурационного подхода:
- поведение определяется конфигом
- добавление нового типа уведомления не требует изменения ядра
- добавление нового типа сохранения не требует изменения ядра
- добавление нового типа обхода блокировок не требует изменения ядра
- Получили cookies и прокси
- Сделали запрос
- Если ок - отправили уведомление и сохранили (отправляем уведомления по одному, сохраняем пачками)
- Если не ок - сменили\разблокировали cookies, сменили ip
- Повторили запрос
- Все настройки содержатся в config.toml
- Графический интерфейс основан на Flet (AvitoParser.py)
- Код самого парсера в parser_cls.py и может запускаться независимо от gui
- Есть docker и make команды для удобного запуска
- Уведомления и сохранения вынесены в абстракцию, т.е. самому парсеру неизвестно куда он шлет уведомления и как сохраняет результаты (с версии 3.2.0)
- БД sqlite (database.db) не вынесена в абстракцию, т.к. используется только для памяти уже просмотренных объявлений. SQLite используется намеренно и только как локальное хранилище просмотренных объявлений (не является частью расширяемой логики)
- Клиент для запросов парсера и уведомлений используется намеренно разный (httpx и requests соответственно)
- Для обхода блокировок используются разные варианты, основанные на изменении ip и\или использовании готовых cookies
Папка: integrations/notifications/
Что нужно реализовать (к примеру добавляем WA):
- класс WANotifier(Notifier) в отдельном файле:
- обрати внимание, что класс обязательно наследуется от Notifier
- в классе должен быть обязательно реализован метод notify(ad, message), где:
- ad - Само объявление, модель смотри в dto.py
- message - простая строка, для отправки уведомление типа "Это тестовое сообщение"
- подключить новый тип в integrations/notifications/factory.py Всё на этом, в код парсера вмешиваться не стоит. Если изменения будут вливаться в данный репозиторий, то нужно добавить этого провайдера в графический интерфейс (AvitoParser.py), по образце других уведомлений. Если изменения только для себя - дело Ваше.
Папка: parser/export/
Что нужно реализовать:
- создать файл с классом MyNewExport(ResultStorage), опять обрати внимание на родителя ResultStorage
- обязательно реализовать метод save(ads: list) - где ads - список! объявлений, модель смотреть здесь dto.py
- подключить новый тип сохранения в parser/export/factory.py
- в настройках есть опция "сохранять каждую ссылку в свой файл" - поэтому нужно реализовать еще функцию получения пути, смотри пример _build_excel_path
- если делаешь для PR, внеси новые изменения и в графический интерфейс AvitoParser.py
Папка: parser/cookies/
Что нужно реализовать:
- создать файл с классом MyNewCookiesProvider(CookiesProvider)
- реализовать метод get - получение cookies
- реализовать метод handle_block - что делать при блокировке cookies
- добавить опцию выбора в gui
❌ Добавлять бизнес-логику в GUI
❌ Делать сетевые запросы в save()
❌ Использовать глобальное состояние в Notifier
❌ Менять сигнатуры базовых абстракций
PR приветствуются, но пару моментов для делающих PR. Если хочется внести какие-то большие изменения, которые:
- переделывают половину кода (затрагивают core-логику)
- меняют алгоритм парсинга
- изменяют список зависимостей или их версии
- влияют на стабильность
То лучше создайте issue для обсуждения этого момента перед написанием кода - иначе есть риск пустой траты времени