Skip to content

Repository files navigation

XX Auto Jobs Applier

License: MIT contributions welcome

🤖🔍 Ваш ИИ помощник в поиске работы на сайте hh.ru. Ищите и откликайтесь только на интересные вам вакансии в полностью автоматическом режиме и найдите работу своей мечты быстрее.

Внимание

Этот проект является форком проекта AIHawk.

ВАЖНО: Работа через официальное API hh.ru больше не поддерживается, так как hh.ru закрыл доступ к API для физических лиц (соискателей). Теперь приложение работает полностью через эмуляцию браузера (Playwright), используя ваши логин и пароль от сайта.

По всем вопросам рекомендую обращаться в тематический телеграм чат 👇

XX Auto Jobs Applier Chat 👇

Telegram

Содержание

  1. 📖 Введение
  2. ✨ Особенности
  3. ⚙️ Установка
  4. 🔧 Настройка
  5. 🚀 Использование
  6. 📨 Инструкция по настройке чата Telegram
  7. ❗ Проблемы
  8. 👥 Участники
  9. 📄 Лицензия
  10. ⚠️ Предупреждение

📖 Введение

XX_Auto_Jobs_Applier — передовой автоматизированный инструмент, предназначенный для автоматизации поиска и подачи заявок на работу на сайте hh.ru. Используя мощь искусственного интеллекта, XX_Auto_Jobs_Applier дает возможность пользователям в автоматическом режиме подавать заявки на огромное количество интересующих их вакансий, увеличивая свои шансы получить работу мечты.

Иными словами

Вам больше не нужно тратить бесчисленное количество времени на вычитывание и прокликивание всех интересующих вас вакансий. XX_Auto_Jobs_Applier сам найдет интересующие вас предложения, учитывая при этом как текст вакансии, так и текст вашего резюме и дополнительную информацию о вас и ваших интересах. Далее XX_Auto_Jobs_Applier сам откликнется на данное предложение, а также ответит на все сопутствующие вопросы работодателя и приложит сопроводительное письмо, написанное с учетом требований вакансии и содержимого вашего резюме.

Отличием XX_Auto_Jobs_Applier от базовой версии является также возможность написания резюме с учетом информации о пользователе и особенностей вакансии

✨ Особенности

  1. Автоматизация поиска

    • Возможность настройки поиска под интересующие вас вакансии
    • Настройка фильтров для исключения неподходящих вакансий и работодателей
  2. Быстрая и эффективная подача резюме

    • Запуск приложения одной командой
    • Автоматический сбор всей необходимой информации о резюме пользователя из его анкеты на сайте
    • Автозаполнение всех необходимых работодателю форм и вопросов
    • Написание сопроводительных писем в автоматическом режиме
    • Есть возможность использовать одно готовое сопроводительное письмо для всех вакансий
    • Автоматический подъем резюме в поисковой выдаче hh.ru
  3. AI персонализация

    • Автоматическое определение степени соответствия вакансии резюме пользователя и принятие решения об отклике
    • Автоматическое написание резюме с учетом информации о пользователе и требований вакансии
    • Приложение само отвечает на все интересующие работодателя вопросы
    • Сопроводительное письмо пишется с учетом требований вакансии и содержания резюме пользователя
    • Если в описании вакансии работодатель просит ответить на вопросы или указать ключевые слова, приложение это учтет
  4. Мониторинг работы приложения

    • Все действия и ошибки логируются
    • Сообщения об ошибках отправляются в раздел Errors чата Telegram
    • Все обращения к AI также логируются + записывается стоимость каждого обращения
    • Все вакансии и должности, на которые производился отклик, и результат каждого отклика также записываются в соответствующие файлы
    • Тексты всех сопроводительных писем сохраняются в отдельный файл
    • Результаты работы (количество вакансий, на которые удалось откликнуться и список вакансий, на которые откликнуться не удалось) в конце работы бота отправляются через Telegram
    • Приложение осуществляет мониторинг появления капчи, сообщает о ее появлении в раздел Captcha чата Telegram и после того, как пользователь ответит на его сообщение своим сообщением с решением капчи, использует это решение для ответа на капчу на сайте
  5. Безопасная обработка данных

    • Все данные (за исключением информации о городе и дате рождения) анонимизируются перед отправкой в LLM
    • Все приватные данные хранятся локально в YAML файлах

⚙️ Установка

Работа приложения проверялась на следующих конфигурациях:

  • ОС:
    • Windows 10
    • Ubuntu 22
  • Версии Python:
    • 3.12.0(64b)
    • 3.12.7(64b)
  • LLM (AI):
    • Google Gemini-2.0-flash
  1. Скачайте и установите Python:

    Убедитесь, что у вас установлена ​​последняя версия Python. Если нет, загрузите и установите ее с официального сайта Python. Подробные инструкции см. в руководствах (на инглише):

  2. Скачайте:

    • Приложения заточено под работу с Google Chrome, поэтому скачайте и установите последнюю версию с официального сайта.
  3. Клонируйте репозиторий:

    git clone https://github.com/beatwad/XX_Auto_Jobs_Applier.git
    
    cd XX_Auto_Jobs_Applier

В случае Windows перед выполнением этой команды возможно потребуется установить Git. Найти его можно по этой ссылке

  1. Установите 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"
  2. Создайте окружение и установите все необходимые пакеты:

    uv sync

    Эта команда сама скачает нужную версию Python (3.12), создаст виртуальное окружение в папке .venv и установит все зависимости из pyproject.toml (включая инструменты для тестов).

    Установите браузеры для Playwright (если используете не системный Chrome):

    uv run playwright install chromium
  3. Дополнительно (но не обязательно):

🔧 Настройка

Основные файлы для настройки лежат в папке data_folder.

В папке data_folder_example лежат примеры файлов для настройки

1. data_folder/secrets/secrets.yaml

Этот файл содержит важную информацию. Никогда не делитесь им ни с кем и не делайте этот файл отслеживаемым системой контроля версий.

Совет: можно сделать данный файл неотслеживаемым для 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 бота, читающего сообщения в чате] - используется только для обхода капчи

2. data_folder/search_config/search_config.yaml

Этот файл содержит в себе настройки поиска вакансий. За исключением полей 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.

3. data_folder/app_config/app_config.yaml

Этот файл содержит в себе настройки для работы приложения.

  • 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), чем она выше, тем креативнее модель, но могут случаться галлюцинации; чем она ниже, тем строже модель следует промпту, но и креативность становится ниже

4. src/llm/constants.py

Этот файл содержит в себе неизменяемые глобальные переменные, используемые приложением

  • 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, но вы можете дополнить информацией о стоимости предпочитаемых вами моделей.

5. src/llm/prompts.py

В этом файле хранятся промпты для работы с LLM, в частности промпты для ответов на вопросы определенного типа/тематики, а также резюмирования текста вакансии или (пардон за каламбур) резюме.

Большинство из этих промптов я взял из проекта AIHawk в нетронутом виде. Поменял лишь промпт на написание сопроводительного письма (так как с оригинальным промптом получался уж совсем лютый кринж), ну и добавил промпт для определения интересности вакансии для соискателя.

Если захотите что-то поменять:

  • промпт для определения интересности вакансии находится в переменной job_is_interesting

  • промпт для написания сопроводительного письма находится в переменной coverletter_template

  • текст фиксированного сопроводительного письма для всех вакансий находится в переменной fixed_cover_letter

6. data_folder_example

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

Содержимое

Внутри этой папки вы найдете примеры настроечных файлов:

  • search_config.yaml
  • secrets.yaml

Эти файлы уже заполнены вымышленными, но реалистичными данными. Они показывают вам правильный формат и тип информации для ввода в каждый файл.

Использование data_folder_example

Использование этой папки в качестве руководства может быть полезным для:

  1. Понимания правильной структуры каждого конфигурационного файла
  2. Просмотра примеров допустимых данных для каждого поля
  3. Опорной точки в заполнении ваших личных файлов

🚀 Использование

  1. data_folder: Убедитесь, что данная папка содержит в себе следующие файлы, и они корректно заполнены:

    • secrets/secrets.yaml
    • search_config/search_config.yaml
  2. data_folder/output: Содержит файлы, в которые записаны результаты работы приложения.

    • answers.yaml список предыдущих вопросов и ответов, которые давала на них LLM в предыдущие разы, позволяет избежать повторного запуска LLM
    • failed.yaml список вакансий, отклики на которые не были отправлены по причине программной ошибки
    • skipped.yaml список вакансий, отклики на которые не были отправлены по иной причине (причина указана)
    • success.yaml список вакансий, отклики на которые были отправлены успешно
    • resume.yaml информация о резюме пользователя, которую удалось собрать (может быть использована для отладки приложения)
    • job_descriptions.txt список сопроводительных писем, которые написало приложение за время работы (может быть использован для отладки приложения)
  3. Запуск:

    Просто зайдите в папку с проектом и введите в терминале:

    uv run python main.py

    При откликах на вакансии с вопросами приложение запускает браузер, а для этого использует логин и пароль для авторизации на сайте. Возможно потребуется ввод капчи. При последующих запусках этого не потребуется, так как все данные для входа сохраняются в папке chrome_profile. Если логин и пароль от сайта не указаны в файле secrets.yaml - приложение будет пропускать вакансии с вопросами.

    Для остановки приложения введите комбинацию клавиш Ctrl + C в терминале.

📨 Инструкция по настройке чата Telegram

  1. Создайте Telegram бота и получите токен, следуя этой инструкции. Установите переменную tg_token с полученным токеном в файле data_folder/secrets/secrets.yaml.

  2. Создайте группу с темами, следуя этой инструкции.

  3. Сделайте группу публичной (Нажмите на название группы -> Редактировать -> Тип группы -> Публичная)

  4. Установите постоянную ссылку на группу, например t.me/xx_bot_feedback.

  5. Установите tg_chat_id в data_folder/secrets/secrets.yaml с этой ссылкой, например tg_chat_id: "@xx_bot_feedback"

  6. Создайте две темы: одну для ошибок и другую для отчетов

  7. Отправьте сообщение в каждую тему в чате. Затем нажмите на это сообщение и выберите Копировать ссылку на сообщение. Вы получите ссылку вида: https://t.me/c/194xxxx987/11/13, где в данному случае ID темы группы равен 11. Установите tg_err_topic_id в data_folder/secrets/secrets.yaml с ID темы ошибок и tg_report_topic_id - с ID темы отчетов.

  8. Если хотите, чтобы приложение также находило капчу и само скидывало ее к вам в чат для решения нужно:

  • создать еще одну тему в чате (и прописать ее ID в data_folder/secrets/secrets.yaml как tg_captcha_topic_id)
  • зарегистрируйте приложение Telegram и получите tg_api_id и tg_api_hash, сохраните их в файл data_folder/secrets/secrets.yaml Замечу, что обход капчи требуется только для вакансий с ответами на вопросы, в остальных случаях бот работает через API, и там обход капчи не нужен.

❗ Проблемы

0. Ошибки во время установки.

В частности на этапе выполнения команды uv sync.

Убедитесь, что uv установлен корректно (uv --version). uv сам подберет нужную версию Python (3.12) согласно requires-python в pyproject.toml.

Если проблема сохраняется, попробуйте пересоздать окружение: удалите папку .venv и выполните uv sync заново.

1. Ошибки OpenAI API

Сообщение об ошибке:

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, выберите любую европейскую страну или США/Канаду, должно помочь.

2. Неверная информация в сопроводительном письме к вакансии или ответах на вопросы

Проблема: Бот предоставляет неточные данные об опыте, навыках, зарплатных ожиданиях и т.д.

Решение:

  • Обновите промпты для сопроводительного письма или ответов на вопросы соответствующей тематики
  • Проверьте содерижимое файла answers.yaml, исправьте или удалите его по необходимости - данный файл используется для кэширования ответов LLM, поэтому может содержать ошибочные ответы от предыдущих вызовов LLm

3. Ошибка конфигурации

Сообщение об ошибке:

Ошибка конфигурации: Отсутствует или неверный тип ключа ...

или

Ошибка конфигурации: Поле '...' не может быть пустым в конфигурационном файле ...

Решение:

  • Скопируйте search_config.yaml из папки data_folder_example и меняйте в нем данные на свои постепенно
  • Убедитесь, что все отступы и пробелы в файле YAML выставлены верно
  • Используйте приложение для проверки правильности YAML файла
  • Избегайте необязательных спецсимволов и кавычек

4. Ошибки Selenium

Сообщение об ошибке:

selenium.common.exceptions.ElementNotInteractableException...

Решение

Возможно посторонние элементы на странице закрывают доступ к элементам, с которыми приложение осуществляет взаимодействие на странице сайта.

Попробуйте изменить размер окна браузера, например развернуть его на весь экран.

5. Иные ошибки

Сообщение об ошибке (Windows):

from Levenshtein.levenshtein_cpp import ( ImportError: DLL load failed while importing levenshtein_cpp: Не найден указанный модуль.

Решение

Установите Visual C++ Redistributable

6. Приложение запустилось, но не работает

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

Решение:

  • Проверьте не появилась ли CAPTCHA на сайте
  • Убедитесь, что файл search_config.yaml настроен корректно, и что с такими параметрами находятся хотя бы какие-нибудь вакансии
  • Посмотрите в логе или окне терминала, выводило ли приложение сообщения об ошибках и если да, то какие

Общие советы по устранению неполадок

  • Используйте последнюю версию приложения
  • Убедитесь, что все зависимости установлены и обновлены
  • Проверьте стабильность интернет-соединения
  • Закройте все открытые во время предыдущих запусков программы окна Chrome
  • Удалите папку chrome_profile, если проблемы сохраняются

Для получения дополнительной помощи создайте запрос в репозитории GitHub с подробной информацией о вашей проблеме, включая сообщения об ошибках и вашу конфигурацию (не забудьте удалить или заменить конфиденциальную информацию).

7. Работа с code2prompt

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 ("как есть") и предназначен только для образовательных целей. Автор не несет ответственности за любые последствия, возникшие в результате его использования. Пользователям рекомендуется соблюдать правила соответствующих платформ и придерживаться всех законов, правил и этических принципов. Использование автоматизированных инструментов для подачи заявлений на работу может нести риски, включая ограничение или блокировку учетной записи пользователя. Действуйте с осторожностью и по своему усмотрению.

Наверх 🚀

About

XX_Auto_Jobs_Applier это приложение для автоматизации поиска работы на сайте hh.ru. Используя искусственный интеллект, оно позволяет пользователю откликаться на множество вакансий, отвечать на вопросы и писать сопроводительные письма в автоматическом режиме, учитывая при этом интересы и резюме пользователя, а также особенности вакансии

Topics

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages