Описание
hh-ru-apply — скилл для автоматизации поиска работы на hh.ru: регулярный сбор вакансий по заданным фильтрам, оценка релевантности каждой вакансии резюме через LLM — только подходящие отклики, генерация персональных сопроводительных писем под конкретную вакансию, отправка откликов и ведение статистики. Для соискателей, которые хотят масштабировать поиск, не жертвуя качеством обращений.
Что умеет:
— собирать вакансии по фильтрам;
— оценивать совпадение с резюме;
— писать сопроводительные письма;
— отправлять отклики и вести учёт.
Полная документация ниже — автоматически из репозитория steev193/hh-ru-apply (ветка main). Оригинальные материалы проекта распространяются на условиях его лицензии.
hh-ru-apply
Автоматизация работы с hh.ru на Node.js + Playwright: сбор вакансий, оценка с помощью LLM, генерация сопроводительных писем и отклики через браузер с сохранением сессии.
Важно: Автоматизация откликов и массовые действия могут противоречить правилам сервиса и привести к ограничению аккаунта. Используйте на свой страх и риск.
Возможности
| Команда | Описание |
|---|---|
npm run login |
Вход на hh.ru с сохранением браузерного профиля (повторный логин не требуется) |
npm run vacancies |
Поиск вакансий по ключевым словам с hh.ru |
npm run harvest |
Сбор и оценка вакансий через LLM (OpenRouter) — три скора: релевантность, совпадение с CV, общий |
npm run dashboard |
Веб-дашборд для просмотра очереди, генерации и редактирования сопроводительных |
npm run scan-tg |
Сканирование вакансий из Telegram-каналов через бота |
npm run hh-fill-letter |
Вставка сопроводительного письма в форму отклика на странице вакансии (без авто-отправки) |
npm run hh-apply-chat |
Отклик с письмом в чате с работодателем |
npm run codegen-hh |
Генерация/обновление селекторов Playwright через Codegen |
Требования
- Node.js 18+
- Chromium (устанавливается через Playwright)
Быстрый старт
Вариант А: Локальный запуск
git clone https://github.com/Steev193/hh-ru-apply.git
cd hh-ru-apply
npm install
npx playwright install chromium
cp .env.example .env
Вариант Б: Docker
git clone https://github.com/Steev193/hh-ru-apply.git
cd hh-ru-apply
cp .env.example .env
# первый вход (сохранение сессии)
docker compose run --rm dashboard npm run login
# запуск дашборда
docker compose up -d
Дашборд будет доступен на http://127.0.0.1:3849. Данные сохраняются в локальной папке data/ через volume.
Для запуска других скриптов в контейнере:
docker compose run --rm dashboard npm run harvest
docker compose run --rm dashboard npm run hh-fill-letter -- --id=...
Настройка
1. Браузерная сессия
npm run login
Откроется окно Chromium. Войдите на hh.ru, затем нажмите Enter в терминале. Профиль сохраняется в data/session/chromium-profile и переиспользуется при последующих запусках.
Проверить сессию:
npm run apply
2. Ключевые слова для поиска
Отредактируйте config/search-keywords.txt — по одному запросу на строку. Пример:
python backend
python developer
senior python developer москва удалённо
3. CV / Резюме
Положите свои резюме в папку CV/. Поддерживаются форматы .md, .txt, .pdf. Они используются при оценке вакансий LLM.
4. Шаблон сопроводительного письма
Создайте config/cover-letter.txt по образцу config/cover-letter.example.txt. Файл добавлен в .gitignore и не попадёт в репозиторий.
Для сохранения вашего стиля в письмах положите примеры в config/cover-letter-style-examples.txt (несколько писем, разделённых ---). Шаблон — config/cover-letter-style-examples.example.txt.
5. OpenRouter для оценки вакансий (опционально)
- Зарегистрируйтесь на openrouter.ai, создайте API key.
- Добавьте ключ в
config/secrets.local.env:OpenRouter_API_KEY=sk-or-v1-...
По умолчанию используется бесплатная модель. Для платных моделей задайте OPENROUTER_ALLOW_PAID=1. Подробности — в config/OPENROUTER.md.
6. Telegram-бот (опционально)
Для npm run scan-tg задайте в .env:
TELEGRAM_BOT_TOKEN=123456:ABC...
TELEGRAM_CHAT_ID=your_chat_id
Использование
Сбор вакансий
npm run vacancies
Поиск по ключам из config/search-keywords.txt. Настройки лимитов, пауз и джиттера — в .env (переменные HH_*)
Оценка через LLM
npm run harvest
Результат сохраняется в очередь data/vacancies-queue.json. Каждая вакансия получает три оценки:
- scoreVacancy (0–100) — насколько объявление релевантно
- scoreCvMatch (0–100) — насколько ваше CV покрывает требования
- scoreOverall (0–100) — стоит ли откликаться
Веса скоров настраиваются в config/preferences.json (llmScoreWeights.vacancy и llmScoreWeights.cvMatch).
Дашборд
npm run dashboard
Открывается на http://127.0.0.1:3849. Здесь можно:
- Просматривать очередь вакансий с оценками
- Генерировать сопроводительные письма
- Утверждать / редактировать письма
- Запускать отклик в браузере прямо из интерфейса
Отклик через форму на странице вакансии
npm run hh-fill-letter -- --id=<uuid-записи>
Открывает страницу, нажимает «Откликнуться», вставляет письмо и ждёт вашей ручной проверки. Можно и по URL
npm run hh-fill-letter -- --url=https://hh.ru/vacancy/123 --text-file=./letter.txt
Отклик через чат
npm run hh-apply-chat -- --id=<uuid-записи>
Флаги:
--stay-open— не закрывать браузер--dry-run— открыть чат, но не вставлять письмо--no-submit— открыть форму отклика без отправки
Обновление селекторов
Если hh.ru изменил вёрстку и скрипты перестали находить элементы:
npm run codegen-hh
Или вручную через npx playwright codegen https://hh.ru, актуальные селекторы в lib/hh-response-selectors.mjs и lib/hh-chat-selectors.mjs.
Структура проекта
├── scripts/
│ ├── login.mjs # Сохранение браузерной сессии
│ ├── apply.mjs # Проверка сессии
│ ├── open-vacancies.mjs # Поиск вакансий
│ ├── harvest.mjs # Сбор + оценка через LLM
│ ├── scan-telegram.mjs # Сканирование Telegram-каналов
│ ├── dashboard-server.mjs # Сервер дашборда
│ ├── hh-fill-response-letter.mjs # Письмо в форме отклика
│ ├── hh-apply-chat-letter.mjs # Письмо через чат
│ └── codegen-hh.mjs # Генерация селекторов
├── lib/ # Общие модули
├── config/ # Конфигурация, шаблоны, секреты
├── CV/ # Ваши резюме
├── data/ # Сессия, очередь, логи (игнорируется)
├── dashboard/ # Фронтенд дашборда
├── .env.example # Шаблон переменных окружения
└── package.json
Переменные окружения
| Переменная | Описание |
|---|---|
HH_SESSION_DIR |
Путь к папке профиля Chromium |
HH_HEADLESS=1 |
Безголовый режим |
HH_KEYWORDS |
Ключевые слова (через запятую) |
HH_KEYWORDS_FILE |
Путь к файлу ключей |
HH_MAX_TOTAL / HH_SESSION_LIMIT |
Лимит вакансий за запуск |
HH_OPEN_DELAY_MIN_MS |
Пауза между открытиями, мс |
OpenRouter_API_KEY |
Ключ OpenRouter |
OPENROUTER_MODEL |
Модель (по умолчанию qwen/qwen3.6-plus-preview:free) |
TELEGRAM_BOT_TOKEN |
Токен Telegram-бота |
TELEGRAM_CHAT_ID |
ID чата/канала |
Полный список и значения по умолчанию — в .env.example.
Лицензия
MIT