🤖🔍 Ваш ИИ помощник в поиске работы на сайте hh.ru. Ищите и откликайтесь только на интересные вам вакансии в полностью автоматическом режиме и найдите работу своей мечты быстрее.
Этот проект является форком проекта AIHawk.
ВАЖНО: Работа через официальное API hh.ru больше не поддерживается, так как hh.ru закрыл доступ к API для физических лиц (соискателей). Теперь приложение работает полностью через эмуляцию браузера (Playwright), используя ваши логин и пароль от сайта.
По всем вопросам рекомендую обращаться в тематический телеграм чат 👇
- 📖 Введение
- ✨ Особенности
- ⚙️ Установка
- 🔧 Настройка
- 🚀 Использование
- 📨 Инструкция по настройке чата Telegram
- ❗ Проблемы
- 👥 Участники
- 📄 Лицензия
⚠️ Предупреждение
XX_Auto_Jobs_Applier — передовой автоматизированный инструмент, предназначенный для автоматизации поиска и подачи заявок на работу на сайте hh.ru. Используя мощь искусственного интеллекта, XX_Auto_Jobs_Applier дает возможность пользователям в автоматическом режиме подавать заявки на огромное количество интересующих их вакансий, увеличивая свои шансы получить работу мечты.
Вам больше не нужно тратить бесчисленное количество времени на вычитывание и прокликивание всех интересующих вас вакансий. XX_Auto_Jobs_Applier сам найдет интересующие вас предложения, учитывая при этом как текст вакансии, так и текст вашего резюме и дополнительную информацию о вас и ваших интересах. Далее XX_Auto_Jobs_Applier сам откликнется на данное предложение, а также ответит на все сопутствующие вопросы работодателя и приложит сопроводительное письмо, написанное с учетом требований вакансии и содержимого вашего резюме.
Отличием XX_Auto_Jobs_Applier от базовой версии является также возможность написания резюме с учетом информации о пользователе и особенностей вакансии
-
Автоматизация поиска
- Возможность настройки поиска под интересующие вас вакансии
- Настройка фильтров для исключения неподходящих вакансий и работодателей
-
Быстрая и эффективная подача резюме
- Запуск приложения одной командой
- Автоматический сбор всей необходимой информации о резюме пользователя из его анкеты на сайте
- Автозаполнение всех необходимых работодателю форм и вопросов
- Написание сопроводительных писем в автоматическом режиме
- Есть возможность использовать одно готовое сопроводительное письмо для всех вакансий
- Автоматический подъем резюме в поисковой выдаче hh.ru
-
AI персонализация
- Автоматическое определение степени соответствия вакансии резюме пользователя и принятие решения об отклике
- Автоматическое написание резюме с учетом информации о пользователе и требований вакансии
- Приложение само отвечает на все интересующие работодателя вопросы
- Сопроводительное письмо пишется с учетом требований вакансии и содержания резюме пользователя
- Если в описании вакансии работодатель просит ответить на вопросы или указать ключевые слова, приложение это учтет
-
Мониторинг работы приложения
- Все действия и ошибки логируются
- Сообщения об ошибках отправляются в раздел
Errorsчата Telegram - Все обращения к AI также логируются + записывается стоимость каждого обращения
- Все вакансии и должности, на которые производился отклик, и результат каждого отклика также записываются в соответствующие файлы
- Тексты всех сопроводительных писем сохраняются в отдельный файл
- Результаты работы (количество вакансий, на которые удалось откликнуться и список вакансий, на которые откликнуться не удалось) в конце работы бота отправляются через Telegram
- Приложение осуществляет мониторинг появления капчи, сообщает о ее появлении в раздел
Captchaчата Telegram и после того, как пользователь ответит на его сообщение своим сообщением с решением капчи, использует это решение для ответа на капчу на сайте
-
Безопасная обработка данных
- Все данные (за исключением информации о городе и дате рождения) анонимизируются перед отправкой в LLM
- Все приватные данные хранятся локально в YAML файлах
Работа приложения проверялась на следующих конфигурациях:
- ОС:
- Windows 10
- Ubuntu 22
- Версии Python:
- 3.12.0(64b)
- 3.12.7(64b)
- LLM (AI):
- Google Gemini-2.0-flash
-
Скачайте и установите Python:
Убедитесь, что у вас установлена последняя версия Python. Если нет, загрузите и установите ее с официального сайта Python. Подробные инструкции см. в руководствах (на инглише):
-
Скачайте:
- Приложения заточено под работу с Google Chrome, поэтому скачайте и установите последнюю версию с официального сайта.
-
Клонируйте репозиторий:
git clone https://github.com/beatwad/XX_Auto_Jobs_Applier.git cd XX_Auto_Jobs_Applier
В случае Windows перед выполнением этой команды возможно потребуется установить Git. Найти его можно по этой ссылке
-
Установите uv (менеджер пакетов и окружений):
Проект использует uv. Установите его по официальной инструкции:
# Linux / macOS curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell) powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
-
Создайте окружение и установите все необходимые пакеты:
uv sync
Эта команда сама скачает нужную версию Python (3.12), создаст виртуальное окружение в папке
.venvи установит все зависимости изpyproject.toml(включая инструменты для тестов).Установите браузеры для Playwright (если используете не системный Chrome):
uv run playwright install chromium
-
Дополнительно (но не обязательно):
- Зарегистрируйте Telegram бот и добавьте его API ключ в файл
secrets.yaml, полеtg_token - Купите прокси и добавьте его в файл
secrets.yaml, полеllm_proxy - Получите Telegram API ID и Telegram API hash и добавьте их в файл
secrets.yaml, в поляtg_api_idиtg_api_hashсоответственно
Основные файлы для настройки лежат в папке data_folder.
В папке data_folder_example лежат примеры файлов для настройки
Этот файл содержит важную информацию. Никогда не делитесь им ни с кем и не делайте этот файл отслеживаемым системой контроля версий.
Совет: можно сделать данный файл неотслеживаемым для Git при помощи команды git update-index --assume-unchanged data_folder/secrets.yaml или же удалить его из списка остлеживаемых при помощи команды git rm --cached data_folder/secrets.yaml
-
hh_login: Логин пользователя на сайте hh.ru (почта или телефон). -
hh_password: Пароль пользователя от сайта hh.ru. -
llm_api_key: [Ваш API ключ OpenAI или Ollama или Gemini]- Для получения API ключа у OpenAI прочитайте эту статью или загуглите аналоги на русском: https://medium.com/@lorenzozar/how-to-get-your-own-openai-api-key-f4d44e60c327
- Важно: Чтобы использовать API, нужно пополнить баланс счета. Для этого нужно зайти в OpenAI billing dashboard.
- Согласно сообществу OpenAI, сразу после настройки учетной записи OpenAI и покупки необходимых кредитов, пользователи по-прежнему имеют тип учетной записи
Free. Это не позволяет им иметь неограниченный доступ к моделям OpenAI и позволяет делать только 200 запросов в день. Это может привести к ошибкам во время выполнения, таким как:Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. ...}}или{'error': {'message': 'Rate limit reached for gpt-4o-mini in organization <org> on requests per day (RPD): Limit 200, Used 200, Requested 1.}}OpenAI автоматически обновит вашу учетную запись, но это может занять некоторое время, от пары часов до нескольких дней. Подробнее об ограничениях вашей организации можно узнать на официальной странице. - Также пользователи из России скорее всего (обязательно) встретятся с этой ошибкой:
Error code: 403 - {'error': {'code': 'unsupported_country_region_territory', 'message': 'Country, region, or territory not supported'...}}Что тут можно сказать, включите VPN, выберите любую европейскую страну или США/Канаду, и будет вам счастье. - Для получения ключа API Gemini посетите Google AI for Devs
-
llm_proxy: [Список прокси для работы с LLM (AI) API, задается в формате логин:пароль@IP:порт] -
tg_token: [Токен Telegram для работы бота, отправляющего сообщения об ошибках и проделанной работе] -
tg_api_id: [API ID для работы Telegram бота, читающего сообщения в чате]- используется только для обхода капчи -
tg_api_hash: [API hash для работы Telegram бота, читающего сообщения в чате]- используется только для обхода капчи
Этот файл содержит в себе настройки поиска вакансий. За исключением полей job_title, login и job_blacklist настройки этого файла повторяют настройки поиска на hh.ru, поэтому углубляться мы в них не будем (к тому же там все закомментировано). Рассмотрим только:
-
job_title:- Должность, на которую вы претендуете, самое важное поле. Нужно, чтобы на hh.ru было резюме, которое называлось ровно также, как эта переменная
-
job_blacklist:- Список компаний, на вакансии которых не откликаемся
-
cover_letter:- Если это поле не пустое, то бот будет использовать его содержимое в качестве сопроводительного письма при отклике на вакансии, в противном случае бот будет создавать отдельное сопроводительное письмо под каждую вакансию
-
apply_once_at_company:- если не хотите подаваться в одну компанию на две и более вакансии - установитеapply_once_at_company: true
Все поля, которые обязательно должны быть в файле, помечаются в файле в комментариях как обязательное поле.
Все поля, которые могут принимать только одно значение true, помечаются в файле в комментариях как может принимать только одно значение true.
Этот файл содержит в себе настройки для работы приложения.
-
MONKEY_MODE- если предпочитаете работать в режиме "текст не читай, отклик прожимай", этот режим для вас, просто установитеMONKEY_MODE: true. В этом режиме приложение будет откликаться на все вакансии подряд, независимо от того, подходят ли они вам по интересам или навыкам или нет. -
SEARCH_MODE- если пока не хотите откликаться на вакансии, а просто хотите посмотреть, какое сопроводительное письмо для каждой из вакансий напишет приложение и соответственно проверить их на наличие несостыковок или просто кринжа - установитеSEARCH_MODE: true. Для того, чтобы вытащить сопроводительные письма из логов LLM API, можно воспользоваться файломsrc/llm/parse_llm_api_calls.py -
JOB_IS_INTERESTING_THRESH- в нормальном режиме работы LLM оценивает степень 'интересности' каждой вакансии по шкале от 1 до 100, где 1 - вакансия абсолютно не подходит для кандидата, а 100 - вакансия подходит идеально. Данная переменная задает порог, ниже которого вакансия считается неинтересной для отклика. -
RAISE_RESUME- если эта переменная установлена в True, приложение каждый раз при запуске будет пытаться поднять резюме в поисковой выдаче. Резюме можно поднять не чаще чем 1 раз в 4 часа. -
MINIMUM_WAIT_TIME_SEC- минимальное время, затрачиваемое на один отклик на вакансию. Если приложение откликнется быстрее, оно будет ждать, пока не истечет минимальное время -
MINIMUM_LOG_LEVEL- минимальный уровень важности сообщений, которые будут записаны в лог, от самого низкого (DEBUG), до самого высокого (CRITICAL). Я предпочитаю записывать в лог всё и вам рекомендую, поэтому по умолчаниюMINIMUM_LOG_LEVEL: "DEBUG" -
LLM_MODEL_TYPE- LLM от какой компании предпочитаете (OpenAI, Claude, HuggingFace и т.д.) -
LLM_MODEL- какую модель LLM предпочитаете -
TEMPERATURE- температура модели (от 0 до ~1.5), чем она выше, тем креативнее модель, но могут случаться галлюцинации; чем она ниже, тем строже модель следует промпту, но и креативность становится ниже
Этот файл содержит в себе неизменяемые глобальные переменные, используемые приложением
-
DUMMY_PERSONAL_INFO_MALE- Персональные данные-пустышки для пользователя мужского пола, используются для анонимизации персональных данных пользователя перед их отправкой в LLM -
DUMMY_PERSONAL_INFO_FEMALE- Персональные данные-пустышки для пользователя женского пола, используются для анонимизации персональных данных пользователя перед их отправкой в LLM -
TG_CHAT_ID- Адрес чата в Telegram, в который будут отправляться сообщения об ошибках и капче (задается вdata_folder/secrets/secrets.yamlкакtg_chat_id) -
TG_ERR_TOPIC_ID- Адрес топика в Telegram чате, в который будут отправляться сообщения об ошибках (задается вdata_folder/secrets/secrets.yamlкакtg_err_topic_id) -
TG_CAPTCHA_TOPIC_ID- Адрес топика в Telegram чате, в который будут отправляться сообщения о капче (задается вdata_folder/secrets/secrets.yamlкакtg_captcha_topic_id) -
SECRET_FILE- Адрес файлаsecrets.yaml -
APP_CONFIG_FILE- Адрес файлаapp_config.yaml -
SEARCH_CONFIG_FILE- Адрес файлаsearch_config.yaml -
PRICE_DICT- словарь для подсчета стоимости работы той или иной модели LLM за один входящий/исходящий токен, позволяет оценить итоговые расходы на работу с LLM при рассылке откликов. На данный момент заполен только для GPT-4o и GPT-4o-mini, но вы можете дополнить информацией о стоимости предпочитаемых вами моделей.
В этом файле хранятся промпты для работы с LLM, в частности промпты для ответов на вопросы определенного типа/тематики, а также резюмирования текста вакансии или (пардон за каламбур) резюме.
Большинство из этих промптов я взял из проекта AIHawk в нетронутом виде. Поменял лишь промпт на написание сопроводительного письма (так как с оригинальным промптом получался уж совсем лютый кринж), ну и добавил промпт для определения интересности вакансии для соискателя.
Если захотите что-то поменять:
-
промпт для определения интересности вакансии находится в переменной
job_is_interesting -
промпт для написания сопроводительного письма находится в переменной
coverletter_template -
текст фиксированного сопроводительного письма для всех вакансий находится в переменной
fixed_cover_letter
Папка data_folder_example содержит примеры того, как должны быть структурированы и заполнены файлы, необходимые для работы приложения. Эта папка служит практическим справочником, который поможет вам правильно настроить приложение.
Внутри этой папки вы найдете примеры настроечных файлов:
search_config.yamlsecrets.yaml
Эти файлы уже заполнены вымышленными, но реалистичными данными. Они показывают вам правильный формат и тип информации для ввода в каждый файл.
Использование этой папки в качестве руководства может быть полезным для:
- Понимания правильной структуры каждого конфигурационного файла
- Просмотра примеров допустимых данных для каждого поля
- Опорной точки в заполнении ваших личных файлов
-
data_folder: Убедитесь, что данная папка содержит в себе следующие файлы, и они корректно заполнены:
secrets/secrets.yamlsearch_config/search_config.yaml
-
data_folder/output: Содержит файлы, в которые записаны результаты работы приложения.
answers.yamlсписок предыдущих вопросов и ответов, которые давала на них LLM в предыдущие разы, позволяет избежать повторного запуска LLMfailed.yamlсписок вакансий, отклики на которые не были отправлены по причине программной ошибкиskipped.yamlсписок вакансий, отклики на которые не были отправлены по иной причине (причина указана)success.yamlсписок вакансий, отклики на которые были отправлены успешноresume.yamlинформация о резюме пользователя, которую удалось собрать (может быть использована для отладки приложения)job_descriptions.txtсписок сопроводительных писем, которые написало приложение за время работы (может быть использован для отладки приложения)
-
Запуск:
Просто зайдите в папку с проектом и введите в терминале:
uv run python main.py
При откликах на вакансии с вопросами приложение запускает браузер, а для этого использует логин и пароль для авторизации на сайте. Возможно потребуется ввод капчи. При последующих запусках этого не потребуется, так как все данные для входа сохраняются в папке
chrome_profile. Если логин и пароль от сайта не указаны в файлеsecrets.yaml- приложение будет пропускать вакансии с вопросами.Для остановки приложения введите комбинацию клавиш Ctrl + C в терминале.
-
Создайте Telegram бота и получите токен, следуя этой инструкции. Установите переменную
tg_tokenс полученным токеном в файлеdata_folder/secrets/secrets.yaml. -
Создайте группу с темами, следуя этой инструкции.
-
Сделайте группу публичной (Нажмите на название группы -> Редактировать -> Тип группы -> Публичная)
-
Установите постоянную ссылку на группу, например t.me/xx_bot_feedback.
-
Установите
tg_chat_idвdata_folder/secrets/secrets.yamlс этой ссылкой, напримерtg_chat_id: "@xx_bot_feedback" -
Создайте две темы: одну для ошибок и другую для отчетов
-
Отправьте сообщение в каждую тему в чате. Затем нажмите на это сообщение и выберите Копировать ссылку на сообщение. Вы получите ссылку вида: https://t.me/c/194xxxx987/11/13, где в данному случае ID темы группы равен 11. Установите
tg_err_topic_idвdata_folder/secrets/secrets.yamlс ID темы ошибок иtg_report_topic_id- с ID темы отчетов. -
Если хотите, чтобы приложение также находило капчу и само скидывало ее к вам в чат для решения нужно:
- создать еще одну тему в чате (и прописать ее ID в
data_folder/secrets/secrets.yamlкакtg_captcha_topic_id) - зарегистрируйте приложение Telegram и получите tg_api_id и tg_api_hash, сохраните их в файл
data_folder/secrets/secrets.yamlЗамечу, что обход капчи требуется только для вакансий с ответами на вопросы, в остальных случаях бот работает через API, и там обход капчи не нужен.
В частности на этапе выполнения команды uv sync.
Убедитесь, что uv установлен корректно (uv --version). uv сам подберет нужную версию Python (3.12) согласно requires-python в pyproject.toml.
Если проблема сохраняется, попробуйте пересоздать окружение: удалите папку .venv и выполните uv sync заново.
Сообщение об ошибке:
openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}
Решение:
- Проверьте настройки биллинга API OpenAI на странице https://platform.openai.com/account/billing
- Убедитесь, что баланс положительный
- Если нет возможности пополнить баланс со своей карточки, воспользуйтесь услугами оплаты зарубежных сервисов
- Обратите внимание, что подписка ChatGPT Plus отличается от доступа к API
- Если вы недавно добавили средства или обновились, подождите 12–24 часа, чтобы изменения вступили в силу
Сообщение об ошибке:
Unexpected error occurred: Error code: 403 - {'error': {'code': 'unsupported_country_region_territory', 'message': 'Country, region, or territory not supported', 'param': None, 'type': 'request_forbidden'}}
Решение:
Включите VPN, выберите любую европейскую страну или США/Канаду, должно помочь.
Проблема: Бот предоставляет неточные данные об опыте, навыках, зарплатных ожиданиях и т.д.
Решение:
- Обновите промпты для сопроводительного письма или ответов на вопросы соответствующей тематики
- Проверьте содерижимое файла
answers.yaml, исправьте или удалите его по необходимости - данный файл используется для кэширования ответов LLM, поэтому может содержать ошибочные ответы от предыдущих вызовов LLm
Сообщение об ошибке:
Ошибка конфигурации: Отсутствует или неверный тип ключа ...
или
Ошибка конфигурации: Поле '...' не может быть пустым в конфигурационном файле ...
Решение:
- Скопируйте
search_config.yamlиз папки data_folder_example и меняйте в нем данные на свои постепенно - Убедитесь, что все отступы и пробелы в файле YAML выставлены верно
- Используйте приложение для проверки правильности YAML файла
- Избегайте необязательных спецсимволов и кавычек
Сообщение об ошибке:
selenium.common.exceptions.ElementNotInteractableException...
Решение
Возможно посторонние элементы на странице закрывают доступ к элементам, с которыми приложение осуществляет взаимодействие на странице сайта.
Попробуйте изменить размер окна браузера, например развернуть его на весь экран.
Сообщение об ошибке (Windows):
from Levenshtein.levenshtein_cpp import ( ImportError: DLL load failed while importing levenshtein_cpp: Не найден указанный модуль.
Решение
Установите Visual C++ Redistributable
Проблема: Приложение запустилось, но не начало искать вакансии или вылетело с ошибкой
Решение:
- Проверьте не появилась ли CAPTCHA на сайте
- Убедитесь, что файл
search_config.yamlнастроен корректно, и что с такими параметрами находятся хотя бы какие-нибудь вакансии - Посмотрите в логе или окне терминала, выводило ли приложение сообщения об ошибках и если да, то какие
- Используйте последнюю версию приложения
- Убедитесь, что все зависимости установлены и обновлены
- Проверьте стабильность интернет-соединения
- Закройте все открытые во время предыдущих запусков программы окна Chrome
- Удалите папку chrome_profile, если проблемы сохраняются
Для получения дополнительной помощи создайте запрос в репозитории GitHub с подробной информацией о вашей проблеме, включая сообщения об ошибках и вашу конфигурацию (не забудьте удалить или заменить конфиденциальную информацию).
code2prompt . --include="*.py,*.yaml" --exclude="tests/*,src/resume_builder/*,src/utils/json_to_readable.py"- beatwad - автор проекта
XX_Auto_Jobs_Applier на данный момент находится в стадии бета-тестирования, и я был бы благодарен за ваши отзывы и предложения. Не стесняйтесь сообщать о проблемах, предлагать улучшения или отправлять pull requests, чтобы помочь улучшить проект.
Этот проект распространяется по лицензии MIT - см. файл LICENSE
XX_Auto_Jobs_Applier предоставляется AS IS ("как есть") и предназначен только для образовательных целей. Автор не несет ответственности за любые последствия, возникшие в результате его использования. Пользователям рекомендуется соблюдать правила соответствующих платформ и придерживаться всех законов, правил и этических принципов. Использование автоматизированных инструментов для подачи заявлений на работу может нести риски, включая ограничение или блокировку учетной записи пользователя. Действуйте с осторожностью и по своему усмотрению.