Перейти к содержанию
Публикация AiManual

Бот для автооткликов на hh.ru: как автор автоматизировал поиск работы на Python, Selenium и SQLite

Автор выложил в open-source бота на Python, Selenium и SQLite, который сам откликается на hh.ru, пишет письма через ИИ и разбирает отказы. Разбираем архитектуру

Коротко

Что будет в материале

  1. 01

    Что за бот и зачем он нужен: автоматизация откликов на hh.ru

  2. 02

    Архитектура и стек: Python, Selenium, SQLite и обход закрытого API

  3. 03

    Технические подводные камни: JS-клики, логические ошибки и фейковая статистика

  4. 04

    ИИ в боте: генерация сопроводительных писем и ответы на анкеты

Что за бот и зачем он нужен: автоматизация откликов на hh.ru

Разработчик опубликовал на Хабре разбор своего open-source бота для hh.ru. Бот ищет вакансии, отправляет отклики, генерирует сопроводительные письма через ИИ, отвечает на анкеты работодателей, разбирает отказы и поднимает резюме. Код написан на Python, браузером управляет Selenium, данные хранятся в SQLite. Полный разбор с примерами логов и фрагментами кода автор выложил в статье на Хабре: «Не зовут на собеседования? Написал бота, который увеличит твои шансы на это».

Ключевое архитектурное решение: бот работает через браузер с сессией самого пользователя, а не через официальный API hh.ru. Причина простая: отклики через API сторонним приложениям закрыты, поэтому отправить отклик легальным программным интерфейсом не получится. По подсчётам автора, один отклик через браузер занимает около 17 секунд, а дневной потолок в 200 откликов упирается в лимит hh.ru, а не в скорость бота.

Автор сразу обозначает границы. Автоотклики попадают в серую зону правил hh.ru, блокировка аккаунта ложится на пользователя, а бот не обходит дневные лимиты платформы. Это инструмент для механической рутины, а не способ обойти правила найма.

Похожие системы строят и другие разработчики: в разборе про AI-агента для поиска работы описана архитектура, которая за три недели собрала 10 687 вакансий от 2 204 компаний и довела 553 отклика до кнопки «отправить» с тремя собеседованиями на выходе. Кейс 553 откликов за три недели полезен как дополнение к этому разбору: там видно, где автоматизация останавливается на капче и нестандартных вопросах форм.

Архитектура и стек: Python, Selenium, SQLite и обход закрытого API

Стек минималистичный: Python как основной язык, Selenium для управления браузером, SQLite как локальная база. Связка не требует серверов и поднимается на обычной машине, зато завязана на живую сессию пользователя в браузере.

Почему API hh.ru не подходит для откликов

Официальный API hh.ru закрывает главное, что нужно боту. Эндпоинт POST /negotiations, отвечающий за отклик, отдаёт сторонним приложениям 403 Forbidden. Свои резюме через API тоже не получить.

Существуют утилиты, которые всё же откликаются через API: они берут ключи из Android-приложения hh.ru и притворяются им. Автор такой путь не использует. Аргумент прямой: ключи чужие, а забанят аккаунт пользователя.

Гибридный сбор вакансий: API + парсинг выдачи

Вакансии бот собирает гибридно. Там, где API пускает, он используется напрямую, но выдача через API неполная, поэтому параллельно идёт парсинг обычных страниц поиска. Первый же сбор по выдаче «вакансии для вашего резюме» принёс 833 вакансии, которых в кеше из API не было. Разница оказалась достаточной, чтобы не делать ставку только на API.

Состояние страницы поиска hh.ru лежит в шаблоне HH-Lux-InitialState, туда попадает даже флаг userTestP. Этот блок удобно разбирать: данные приходят в готовом виде, без обхода всей DOM-разметки.

Технические подводные камни: JS-клики, логические ошибки и фейковая статистика

Самая ценная часть разбора - список грабель. Большинство из них не про hh.ru как платформу, а про то, как легко автоматизация начинает врать сама себе.

Почему JS-клики не работают в React-интерфейсе hh

Интерфейс hh.ru построен на React. Клик, отправленный через JS-выполнение, в таком окружении молча не срабатывает: ошибки нет, лог чистый, а действия не произошло. Рабочий вариант, по опыту автора, только один: ActionChains из Selenium, который эмулирует полноценные действия пользователя через драйвер браузера.

Отдельная проблема - проверка результата. Автор ставил метку [OK] в лог сразу после клика, не убедившись, что страница изменилась, и нашёл такой код в четырёх местах. Примеры из статьи: бот сообщал о нажатии кнопки «Напомнить об отклике», хотя в диалоге с работодателем кнопка не нажата, и писал о добавленных навыках в резюме, которых там не было. Вывод простой: клик без проверки результата - это запись в логе, а не факт.

Ошибка с if a in b: как бот отправлял противоположные ответы

Логическая ошибка оказалась дороже технической. Из-за проверки вида if a in b бот отправлял работодателю «Не готов» вместо «Готов». Подстроковая проверка давала неверную ветку логики, и ответ уходил в противоположную сторону. Для анкет это критично: один неверный ответ на вопрос о готовности к условиям может закрыть вакансию.

Фейковая статистика отказов: 80% причин придуманы

Самый неприятный класс ошибок - данные, которых не было. По словам автора, 80% причин отказов в базе бот придумал сам: часть статистики генерировалась константами, а не на основе реальных сообщений работодателей. В статье приведены примеры: бот показывал «Резюме подходит вакансиям на 65,5%», хотя это просто зашитое в код число, и указывал причину отказа «опыт и грейд», хотя работодатель такого не писал.

Такая статистика опаснее её отсутствия: она выглядит как аналитика и подталкивает менять резюме там, где менять нечего. Ловушка с доверием к собственным данным хорошо видна в кейсе AI-бота на Java, который за вечер собрал 2000 пользователей, а затем потерял их из-за перевеса системных источников над пользовательскими отчётами: разбор ошибки в алгоритме.

ИИ в боте: генерация сопроводительных писем и ответы на анкеты

ИИ в боте отвечает за две задачи: сопроводительные письма и ответы на анкеты работодателей. Модель получает контекст вакансии и резюме, а результат уходит в форму отклика.

Бесплатные ИИ-провайдеры и лимиты запросов

Провайдеров автор подключает по принципу «что доступно бесплатно». База: Gemini и Groq. Если у пользователя есть ключи Claude или ChatGPT, их тоже можно задействовать. Когда лимиты заканчиваются, бот переключается на сопроводительные по шаблону.

Практический вывод из этой схемы: качество писем зависит от того, на каком провайдере бот остановился в конкретный момент. Шаблонный текст в отклике выглядит слабее сгенерированного, а лимиты бесплатных тарифов меняются, поэтому настройку стоит проверять перед запуском и не рассчитывать на бесконечную бесплатную генерацию.

Если упираться в лимиты облачных сервисов не хочется, есть альтернативная линия - локальные модели. Например, PersonalJarvis как self-hosted альтернатива GrokBot собирает сценарии с локальными моделями, браузером и MCP, хотя проект молодой и требует проверки документации.

Как бот отвечает на анкеты работодателей

Анкеты бот закрывает так: типовые вопросы обрабатывает ИИ, а чувствительные темы, к которым относятся оформление, полиграф и судимость, берутся только из настроек, без генерации. Логика понятна: цена ошибки в таких вопросах выше выгоды от автоматической формулировки.

Со стороны нанимающих автоматизация тоже растёт. В кейсе Telegram-бота для массового найма с LLM-оценкой и скорингом отдельно описано детектирование кандидатов, которые отвечают с помощью ИИ, и интеграция с HeadHunter: разбор автоматизации найма. То есть бот с ИИ-письмами работает в среде, где его ответы могут распознать.

Сравнение с hh PRO: что бот делает бесплатно, а что нет

Подписка hh PRO стоит 279 ₽ в неделю, 799 ₽ в месяц и 1 499 ₽ за три месяца, с автопродлением. В неё входят ИИ-сопроводительные (первое бесплатно, дальше без лимита по подписке) и автоподнятие резюме 5 раз в день. Отклики и анкеты работодателей подписка не автоматизирует: их по-прежнему нужно отправлять руками. Разбора отказов в hh PRO нет.

ФункцияБотhh PRO
ИИ-сопроводительныеБесплатно, с лимитами провайдеров и переходом на шаблонПервое бесплатно, дальше без лимита по подписке
Поднятие резюмеРаз в 4 часа, бот жмёт бесплатное поднятие по расписаниюАвтоматически 5 раз в день
Отправка откликовДо 200 в день через браузерРуками
Анкеты работодателейЧерез ИИ, оформление, полиграф и судимость только из настроекРуками
Разбор отказовЧитает отказы в мессенджере и архиве, пишет, что поправить в резюмеНет

Экономия по деньгам очевидна: бот не просит 799 ₽ в месяц. Плата другая - риск для аккаунта и необходимость самому следить за работой скрипта. В возможностях бот тоже неполный: у него нет подсветки резюме, статистики по конкурентам и функции «Хочу здесь работать».

Риски и ограничения: серая зона, блокировка аккаунта и лимиты hh

Автор предупреждает прямым текстом: автоотклики - серая зона правил hh.ru. Если платформа решит ограничить аккаунт, разбираться придётся пользователю, а не разработчику open-source бота.

Дневные лимиты бот не обходит. 200 откликов в день - ограничение самого hh.ru, а не настройка бота, и на этом рубеже автоматизация останавливается. Утилиты, которые откликаются через API с ключами из Android-приложения hh.ru, автор не использует: ключи чужие, а блокировка придёт на аккаунт пользователя.

Отдельный риск - качество данных. Пока бот показывает константы вместо реальной аналитики, решение принимается на основе выдуманных цифр. Проверять выводы бота стоит не меньше, чем им доверять.

Практические выводы: стоит ли использовать бота и как минимизировать риски

Бот рассчитан на технически подкованных пользователей, готовых запускать Python-скрипт, читать логи и принимать риск блокировки аккаунта. Для тех, кому это не подходит, остаются ручной поиск и официальные функции hh PRO: дороже по времени или деньгам, зато без серых зон.

Если решать в пользу бота, минимальный набор мер такой:

  • не выкручивать объём откликов на максимум, помнить про 200 в день и реакцию платформы;
  • проверять логи руками, потому что метка [OK] может стоять без реального действия на странице;
  • просматривать сгенерированные сопроводительные, особенно когда провайдер упёрся в лимит и бот перешёл на шаблон;
  • сверять статистику отказов с реальными сообщениями работодателей, а не доверять ей сразу;
  • не трогать схемы с чужими API-ключами из Android-приложения hh.ru.

Код открытый, поэтому бота можно доработать под себя: заменить провайдера ИИ, добавить проверки после кликов, убрать генерацию констант вместо статистики. В таком виде проект полезен именно как разбор грабель в браузерной автоматизации сайтов на React, а не как готовый сервис под ключ.

Подписаться на канал