131 lines
8.5 KiB
Markdown
131 lines
8.5 KiB
Markdown
# Автоотклик на hh.ru (полуавтоматический)
|
||
|
||
Скрипт ищет вакансии на hh.ru по ключевым словам, генерирует персонализированный
|
||
текст отклика через ИИ (на основе вашего резюме и описания вакансии), открывает
|
||
страницу в браузере, подставляет текст и резюме. Отправка — в один клик
|
||
(«Отправить отклик»), либо с проверкой текста перед отправкой.
|
||
|
||
## Установка
|
||
|
||
```bash
|
||
python3 -m venv .venv
|
||
.venv/bin/pip install -r requirements.txt
|
||
.venv/bin/playwright install chromium
|
||
```
|
||
|
||
Если скачивание браузера падает с 403 (регион), используйте зеркало:
|
||
|
||
```bash
|
||
PLAYWRIGHT_DOWNLOAD_HOST=https://cdn.npmmirror.com/binaries/playwright .venv/bin/playwright install chromium
|
||
```
|
||
|
||
## Запуск веб-интерфейса (рекомендуется)
|
||
|
||
```bash
|
||
.venv/bin/python webui.py
|
||
```
|
||
|
||
Откройте **http://localhost:18091** (порт меняется через `PORT`) — там можно:
|
||
|
||
- регистрироваться и входить (открытая регистрация, отключается `ALLOW_REGISTRATION=0`)
|
||
- создавать аккаунты (имя, регион, поисковые запросы, стиль)
|
||
- загружать резюме файлом (**txt, md, docx, pdf**)
|
||
- сохранять **ключ сессии hh.ru** (cookies из браузера) — нужен для поиска и списка резюме
|
||
- выбирать **резюме на hh.ru** — оно автоматически подставляется в модалке отклика
|
||
- искать вакансии и видеть их списком (название, компания, зарплата, опыт)
|
||
- генерировать тексты откликов через ИИ (редактируются перед отправкой)
|
||
- отправлять отклик в один клик: кнопка «Отправить отклик» в колонке действий —
|
||
браузер открывает вакансию, вставляет текст, жмёт «Отправить» и закрывается
|
||
(скриншот результата показывается в модалке)
|
||
- открывать вакансию в браузере с уже вставленным текстом и выбранным резюме
|
||
для ручной проверки перед отправкой
|
||
- отмечать отправленные — они больше не предлагаются
|
||
|
||
### Регистрация
|
||
|
||
При первом запуске откройте `/register` и создайте логин с паролем (минимум
|
||
6 символов) — вы сразу войдёте. Каждый пользователь работает со своими
|
||
аккаунтами и лимитом генераций. Открытая регистрация отключается
|
||
`ALLOW_REGISTRATION=0` (пользователей тогда создаёт администратор через
|
||
`manage_users.py`).
|
||
|
||
### Ключ сессии hh.ru
|
||
|
||
Чтобы скрипт мог искать вакансии и видеть ваши резюме, нужны cookies из браузера:
|
||
|
||
1. Войдите на hh.ru в браузере
|
||
2. Откройте DevTools (F12) → вкладка **Application/Хранилище** → **Cookies** → `https://hh.ru`
|
||
3. Скопируйте **все** cookies (главные: `hhtoken`, `hhuid`, `hhrole`, `_xsrf` — старых `hh_sess`/`_hh_` больше нет)
|
||
4. Вставьте в поле «Ключ сессии hh.ru» в настройках аккаунта и нажмите «Сохранить ключ»
|
||
|
||
После этого нажмите «Обновить список» рядом с «Резюме на hh.ru» и выберите резюме,
|
||
которое должно подставляться при отклике. Ключ хранится в `accounts/<имя>/session.txt`
|
||
(в git не попадает).
|
||
|
||
## Запуск из терминала (CLI)
|
||
|
||
```bash
|
||
.venv/bin/python hh_respond.py --login my_account # войти в аккаунт (один раз)
|
||
.venv/bin/python hh_respond.py --account my_account # обработать аккаунт
|
||
.venv/bin/python hh_respond.py --limit 5 # максимум 5 откликов
|
||
.venv/bin/python hh_respond.py --dry-run # без браузера, только текст
|
||
```
|
||
|
||
## Настройка аккаунта
|
||
|
||
Каждая папка в `accounts/` — отдельный аккаунт со своей сессией:
|
||
|
||
```
|
||
accounts/
|
||
└── my_account/
|
||
├── config.json # запросы, регион, стиль, выбранное резюме
|
||
├── resume.txt # текст вашего резюме (для ИИ)
|
||
├── session.txt # ключ сессии hh.ru (cookies, не коммитить)
|
||
├── profile/ # сессия браузера (создаётся автоматически)
|
||
└── progress.json # уже отправленные отклики (автоматически)
|
||
```
|
||
|
||
В веб-интерфейсе всё это создаётся и редактируется без ручной работы с файлами.
|
||
|
||
## Поисковые запросы
|
||
|
||
Поддерживаются операторы hh.ru:
|
||
|
||
| Запрос | Что найдёт |
|
||
|---|---|
|
||
| `Python разработчик` | Всё, где упоминается запрос |
|
||
| `NAME:Python разработчик` | Только по названию вакансии |
|
||
| `NAME:Python AND NOT NAME:senior` | По названию, исключая сеньоров |
|
||
|
||
## Как это работает
|
||
|
||
1. Скрипт парсит страницу поиска hh.ru по вашим запросам
|
||
2. Для каждой новой вакансии получает описание
|
||
3. ИИ генерирует текст отклика (вакансия + ваше резюме + стиль)
|
||
4. **Один клик**: кнопка «Отправить отклик» — браузер открывает вакансию,
|
||
жмёт «Откликнуться», вставляет текст, выбирает резюме, жмёт «Отправить»
|
||
и автоматически закрывается (скриншот результата — в модалке)
|
||
5. **С проверкой**: «Открыть в браузере» — вы проверяете текст и отправляете
|
||
сами, либо жмёте «Отправить отклик» в модалке скриншота
|
||
6. Отправленные вакансии отмечаются и больше не предлагаются
|
||
|
||
## Переменные окружения (.env)
|
||
|
||
| Переменная | По умолчанию | Описание |
|
||
|---|---|---|
|
||
| `LLM_API_KEY` | — | Ключ API для генерации текстов откликов |
|
||
| `SESSION_SECRET` | `dev-secret-change-me` | Секрет сессий Flask (обязательно сменить) |
|
||
| `PORT` | `18091` | Порт веб-интерфейса |
|
||
| `HOST` | `127.0.0.1` | Адрес прослушивания |
|
||
| `ALLOW_REGISTRATION` | `1` | Открытая регистрация (`0` — выключить) |
|
||
| `REGISTER_LLM_LIMIT` | `50` | Лимит генераций для новых пользователей |
|
||
| `HH_HEADLESS` | `0` | `1` — браузер без окна (для сервера без дисплея) |
|
||
| `PROXY_URL` | — | Прокси для браузера: `http://LOGIN:PASS@HOST:PORT` |
|
||
|
||
## Важно
|
||
|
||
- Отправка в один клик автоматически жмёт «Отправить» — используйте с осторожностью
|
||
и не чаще, чем позволяет hh.ru (паузы между страницами уже стоят)
|
||
- Не запускайте поиск слишком часто — между страницами есть паузы
|
||
- Если hh.ru покажет капчу — скрипт остановится, решите капчу вручную и запустите снова
|
||
- `.env` содержит API-ключ — не коммитьте его в git (уже добавлен в `.gitignore`) |