AutoHHSearch — это продвинутый бот для автоматизации поиска работы на платформе HeadHunter. Основная цель проекта — избавить соискателя от рутины, автоматически откликаясь на подходящие вакансии, отправлять сопроводительное письмо отталкиваясь от текста вакансии и заполнять формы. А также автоматически подтверждать навыки.
Лично я пользовался этим ботом в течении месяца и блокировку не получил. У меня было примерно 100 откликов в день
ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК. Данный инструмент разработан для автоматизации рутинных действий, но его использование может быть расценено платформой HH.ru как нарушение правил.
Риск блокировки: Чрезмерная активность бота может привести к временному или пожизненному бану аккаунта.
Ответственность: Автор не несет ответственности за ваши отношения с работодателями и сохранность вашего аккаунта.
Качество откликов: Всегда проверяйте, на что именно откликается бот, чтобы не испортить свою репутацию на рынке труда.
🎯 Автоматический отклик: Поиск и подача заявок на вакансии по заданным фильтрам.
✍️ AI-сопроводительные письма: Генерация персонализированных сопроводительных писем под каждую вакансию (через AI).
🧠 Авто-решение тестов: Если после отклика HH предлагает пройти тест на навыки, бот делает это за вас.
🧪 Авто-подтверждение навыков: Есть возможнсть автоматически пройти все тесты для подтверждения навыков (теория и практика)
🔄 Умная фильтрация: Пропуск дублей вакансий.
1 - Бот работает только с 1 резюме. Он его поднимает автоматически при каждом запуске, но в вакансиях менять их не умеет. Поэтому необходимо оставить только 1 резме, остальные удалить
2 - Бот откликается только по автоматическим поискам на hh. На данный момент это его основной функционал. Необходимо создвать автопоиски (можно несколько, в боте нет ограничений, он пройдет по всем), далее по ним будут приходить новые вакансии. Бот будет переходить по каждой из этих ссылок и откликаться на список вакансий игнорируя дубли
3 - Вся настройка бота производится в файле config (его разбор будет дальше)
4 - Для работы бота нужна api любой ai системы (я использовал Gemma - бесплатная ai от gemini, в целом +- адекватно пишет сопроводительные, но для тестов выше базовых лучше не использовать, хотя и на базовых может очень сильно ошибаться)
5 - Он не может нормально обрабатывать, если после отклика сразу открывается чат и в диалог вступает бот. В коде есть обработка подобного, но после того как я ее сделал мне не попалась ни одна вакансия с ботом, поэтому проверить не получилось.
6 - Весь код способен работать в фоне, кроме выполнения практических задач. Для них используется системная клавиатура и мышь. Поэтому нужно чтобы окно всегда было видно и оно было в фокусе. Трогать мышь или клавиатуру нельзя
Тут будет видео, когда закончится монтаж
USER_DATA_DIR - Трогать не нужно, используется для создания папки с кешем браузера, чтобы не нужно было авторизоваться каждый раз
OS - Тут нужно написать вашу операционную систему, варианты - Win для Windows/Linux , Mac для Mac OS. Используется только для практических тестов, в заполнении не обязательна
HEADLESS - Появление окна браузера. False - Чтобы окно браузера появилось, True - Чтобы выполнение было в фоне (В первых запусках используйте False, чтобы следить за работой бота и закрывать модальные окна, принимать куки и т.д.)
WINDOW_WIDTH - Ширина окна. Я использую перевернутый монитор, поэтому там стоит 1080, для обычного монитора нужно поставить 1920. Или любое другое на свой выбор
WINDOW_HEIGHT - Высота окна. Тоже самое, что и выше, только нужно поставить 1080. Или любое другое на свой выбор
SLOW_MO - Задержка, в целом можно тоже не трогать
SEARCH_MODE - То, как будет происходить поиск вакансий. По новым или по 1-й в списке, но с возможностью выбрать промежуток. Если коротко - для основного функицонала нужно использовать "new" и поиск будет идти по новым. Если вы создали автопоиск и ходите откликнуться по нему на все вакансии за определенный промежуток - нужно использовать "total". При использовании total поиск будет идти только по первому в списке автопоиску т.к. другие не настроены (мб потом доделаю) и такой поиск не остановится автоматически, его нужно будет стопать принудительно
SEARCH_PERIOD - Ипользуется для выбора промежутка при использовании total из __SEARCH_MODE__ 1 - сегодня, 3 - 3 дня, 7 - неделя, 30 - месяц, 0 - все время. Если используете new - можно не указывать
AI_STANDARD_SETTINGS - Запрос к ИИ для сопроводительного письма
AI_FORM_SETTINGS - Запрос к ИИ для сопроводительного письма и формы обратной связи
AI_THEORY_SETTINGS - Запрос к ИИ для ответа на теоритические вопросы в теоритичесикх навыках
AI_PRACTICE_SETTINGS - Запрос к ИИ для написания кода в практичесих навыках
В каждой из 4-х выше есть дополнительные настройки, некоторые из них заполнены по дефолту, но вы можете их изменить
AI_STANDARD_SETTINGS = {
"api_key": "AIzaSyCgBbwarZGeDgr3g6xaQP0asctmXwug_EA", - Тут нужно вставить api ключ для ии
"url": "https://generativelanguage.googleapis.com/v1beta/models/gemma-3-27b-it:generateContent?key=AIzaSyCgBbwarZGeDgr3g6xaQP0asctmXwug_EA", - Тут нужно вставить url запроса к ии
"temperature": 0.7, - Этот параметр отвечает за степень случайности ответов.
"top_p": 0.95, - Альтернативный метод контроля случайности, который часто используют вместе с температурой.
"max_retries": 10 - Количество повторных попыток отправить запрос
}
SYSTEM_PROMPT - Основной промпт для ии, для сопроводительного письма (У меня была такая структура - Общее описание что нужно сдалеть, потом весь текст моего резюме)
FORM_INSTRUCTIONS - Дополнительные инстркции для заполнения формы
TASKS_TO_RUN = [ - Тут нужно заполнить какие тесты нужно пройти, примерно в таком виде, как ниже (Моджно больше, просто добавте еще 1 объект через запятую). Все доступные варианты есть в конфиге выше, их не нужно менять, просто копируйте названия переменных
{
"name": Skill.JAVA, - Название навыка
"mode": Mode.THEORY, - Мод (теория, практика, тренировка)
"level": Level.BASIC - Уровень навыка
}, - так можнно добавить еще несколько (количество не ограничено)
{
"name": Skill.SQL,
"mode": Mode.TRAINING,
"level": Level.BASIC
}
]
1 - Перейти на сайт документации gemini - https://ai.google.dev/gemini-api/docs?hl=ru
2 - Авторизоваться, если еще не сделали этого
3 - В правом верху сайта нажать кнопку "Как получить ключ API"
4 - Вас перекинет на сайт google ai studio. В левом меню нужно выбрать api keys
5 - Нажать create api key в правом верхнем углу
6 - Написать название api ключа (произвольно) и выбрать проект (любой)
7 - Дождаться завершения создания и скопировать API Key (Копирование будет доступно в любое время). После чего закрыть модальное окно.
AI_STANDARD_SETTINGS = {
"api_key": "AIzaSyCgBbwarZGeDgr3g6xaQP0asctmXwug_EA",
"url": "https://generativelanguage.googleapis.com/v1beta/models/gemma-3-27b-it:generateContent?key=AIzaSyCgBbwarZGeDgr3g6xaQP0asctmXwug_EA",
"temperature": 0.7,
"top_p": 0.95,
"max_retries": 10
}
Но для использования конкретно этой ИИ нужно также переделать Запрос из файла services/ai/ai_service.py
conf = config.AI_STANDARD_SETTINGS
headers = {
"Content-Type": "application/json"
}
full_prompt = f"{config.SYSTEM_PROMPT}\n\nВАКАНСИЯ:\n{vacancy_text}"
payload = {
"contents": [{"parts": [{"text": full_prompt}]}],
"generationConfig": {"temperature": conf["temperature"], "topP": conf["top_p"]}
}
Т.е. из хедера мы убираем авторизацию по ключу и она будет в url.
В целом, если вы используете какую-то другую модель, можете смело скормить ей конфиг и файл services/ai/ai_service.py, после чего попросить переделать (я так делал)
Только сопроводительное -
full_prompt = f"
{config.SYSTEM_PROMPT}\n - Тут промпт из конфига
\nВАКАНСИЯ:\n{vacancy_text}" - Тут весь текст из тела вакансии
Сопроводительное + форма -
prompt = f"""
ВАКАНСИЯ: {vacancy_context} - Тут весь текст из тела вакансии
Промпт для сопроводительного письма: {config.SYSTEM_PROMPT} - Тут промпт из конфига
Дополнительные инструкции: {config.FORM_INSTRUCTIONS} - Тут дополнительные инструкици из конфига
АНКЕТА: {json.dumps(form_structure, ensure_ascii=False)} - Тут текст анкеты с вариантами ответа или полем для ввода
ЗАДАЧА:
1. Дай ответы на вопросы анкеты (answers).
ВАЖНО: Если вопрос типа "multi-choice", выбери все подходящие варианты и перечисли их через символ пайп "|".
Например: "SQL|Python/Bash"
2. Напиши сопроводительное письмо (cover_letter).
ВЕРНИ СТРОГО JSON:
{{
"answers": {{"ID_вопроса": "Текст или варианты через |"}},
"cover_letter": "Текст письма"
}}
"""
Windows по умолчанию не знает, что такое Python.
Зайди на python.org.
Скачай последнюю версию (3.10 или 3.11 — оптимально).
ВАЖНО: При запуске установщика обязательно поставь галочку "Add Python to PATH". Если этого не сделать, команды pip и python не будут работать в терминале.
Открой PyCharm и выбери Open. Выбери папку с проектом.
PyCharm сам увидит файл requirements.txt и предложит: "Install requirements or Create Virtual Environment?".
Жми Create Virtual Environment. Он сам всё настроит.
Открой папку с проектом.
Открой терминал (клавиши Ctrl + ~ или Terminal -> New Terminal).
Создай виртуальное окружение вручную:
python -m venv .venv
Активируй его:
.venv\Scripts\activate (на этом шаге может ругаться. когда я тестил - он не понадобился)
В терминале (убедись, что слева в строке появилось (.venv)) введи:
1 - Устанавливаем библиотеки из списка
pip install -r requirements.txt
2 - Устанавливаем сами браузеры для Playwright
playwright install chromium
3 - Отдельно устанавливаем дополнительные зависимости
pip install pynput
и
pip install numpy
Поскольку ты на новой системе, кук нет. Нужно залогиниться, чтобы бот запомнил тебя:
pytest tests/test_hh.py::test_login
Поле ввода команды через некоторое время откроется новое окно браузера. Нужно будет залогиниться, как при обычном входе в систему. После успешного логина окно можно закрыть
Для проверки корректности настройки лучше выбрать total и 1 (сегодня) в конфиге, чтобы не заруинить все остальные новые подборки
Многие модели (включая gemini) не работают в РФ. Учитывайте это при использовании и лучше заранее проверить их работу в postman(к примеру) или его аналогах
Также почти у всех моделей (которые я видел) есть лимиты по использовании api. Поэтому нужно искать модели с большим количеством запросов т.к. 1 запрос = 1 сопроводительное или 1 форма и сопроводительно. А в тестах - 1 запрос - 1 ответ на теорию или 1 вариант кода
pytest tests/test_hh.py::test_update_resume_and_search_vacancy
pytest tests/test_hh.py::test_passing_tests
Если вы используете слабую модель, то есть шанс, что она заруинит прохождение теста. Поэтому можно сделать хитрее:
1 - Поменять масштаб окна до уровня 1080 на 1080 (можно любое другое, главное - чтобы была возможность передвинуть на половину экрана)
2 - Запустить процесс авторизации - pytest tests/test_hh.py::test_login
3 - Т.к. мы уже залогинены, то нас отправит на главную, далее переходим в раздел тестов и запускам любой тест
4 - На сколько я понял - система обнаруживает читерство только если копировать и вставлять данные (а также покидать вкладку, открывать девтулс и т.д.). Поэтому делаем скриншот, отправляем его в чат ИИ, он выдает ответ - мы нажимаем на нужный или пишем код



