Skip to content

Mldorlfuse/AutoHHSearch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🤖 AutoHHSearch: Smart Job Application Bot

AutoHHSearch — это продвинутый бот для автоматизации поиска работы на платформе HeadHunter. Основная цель проекта — избавить соискателя от рутины, автоматически откликаясь на подходящие вакансии, отправлять сопроводительное письмо отталкиваясь от текста вакансии и заполнять формы. А также автоматически подтверждать навыки.

Лично я пользовался этим ботом в течении месяца и блокировку не получил. У меня было примерно 100 откликов в день

⚠️ Дисклеймер (Disclaimer)

ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК. Данный инструмент разработан для автоматизации рутинных действий, но его использование может быть расценено платформой HH.ru как нарушение правил.

Риск блокировки: Чрезмерная активность бота может привести к временному или пожизненному бану аккаунта.

Ответственность: Автор не несет ответственности за ваши отношения с работодателями и сохранность вашего аккаунта.

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

🌟 Основной функционал

🎯 Автоматический отклик: Поиск и подача заявок на вакансии по заданным фильтрам.

✍️ AI-сопроводительные письма: Генерация персонализированных сопроводительных писем под каждую вакансию (через AI).

🧠 Авто-решение тестов: Если после отклика HH предлагает пройти тест на навыки, бот делает это за вас.

🧪 Авто-подтверждение навыков: Есть возможнсть автоматически пройти все тесты для подтверждения навыков (теория и практика)

🔄 Умная фильтрация: Пропуск дублей вакансий.

📖 Более подробно как он работает и что для него нужно

1 - Бот работает только с 1 резюме. Он его поднимает автоматически при каждом запуске, но в вакансиях менять их не умеет. Поэтому необходимо оставить только 1 резме, остальные удалить

2 - Бот откликается только по автоматическим поискам на hh. На данный момент это его основной функционал. Необходимо создвать автопоиски (можно несколько, в боте нет ограничений, он пройдет по всем), далее по ним будут приходить новые вакансии. Бот будет переходить по каждой из этих ссылок и откликаться на список вакансий игнорируя дубли

3 - Вся настройка бота производится в файле config (его разбор будет дальше)

4 - Для работы бота нужна api любой ai системы (я использовал Gemma - бесплатная ai от gemini, в целом +- адекватно пишет сопроводительные, но для тестов выше базовых лучше не использовать, хотя и на базовых может очень сильно ошибаться)

5 - Он не может нормально обрабатывать, если после отклика сразу открывается чат и в диалог вступает бот. В коде есть обработка подобного, но после того как я ее сделал мне не попалась ни одна вакансия с ботом, поэтому проверить не получилось.

6 - Весь код способен работать в фоне, кроме выполнения практических задач. Для них используется системная клавиатура и мышь. Поэтому нужно чтобы окно всегда было видно и оно было в фокусе. Трогать мышь или клавиатуру нельзя

Видео демонстрации работы

Тут будет видео, когда закончится монтаж

📜 Настройка файла config


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
    }
]

🤖 Пример получнеия api ключа для gemini

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 (Копирование будет доступно в любое время). После чего закрыть модальное окно.

Готовый пример для gemini (Gemma)

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": "Текст письма"
            }}
            """

Как все установить

Шаг 1: Установка базы (Python)

Windows по умолчанию не знает, что такое Python.

Зайди на python.org.

Скачай последнюю версию (3.10 или 3.11 — оптимально).

ВАЖНО: При запуске установщика обязательно поставь галочку "Add Python to PATH". Если этого не сделать, команды pip и python не будут работать в терминале.

Шаг 2: Подготовка редактора

Если выбрал PyCharm (Рекомендуется для новичков):

Открой PyCharm и выбери Open. Выбери папку с проектом.

PyCharm сам увидит файл requirements.txt и предложит: "Install requirements or Create Virtual Environment?".

Жми Create Virtual Environment. Он сам всё настроит.

Если выбрал VS Code:

Открой папку с проектом.

Открой терминал (клавиши Ctrl + ~ или Terminal -> New Terminal).

Создай виртуальное окружение вручную:

python -m venv .venv

Активируй его:

.venv\Scripts\activate (на этом шаге может ругаться. когда я тестил - он не понадобился)

Шаг 3: Установка зависимостей проекта

В терминале (убедись, что слева в строке появилось (.venv)) введи:

1 - Устанавливаем библиотеки из списка

pip install -r requirements.txt

2 - Устанавливаем сами браузеры для Playwright

playwright install chromium

3 - Отдельно устанавливаем дополнительные зависимости

pip install pynput

и

pip install numpy

Шаг 4: Первый запуск (Логин)

Поскольку ты на новой системе, кук нет. Нужно залогиниться, чтобы бот запомнил тебя:

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 - На сколько я понял - система обнаруживает читерство только если копировать и вставлять данные (а также покидать вкладку, открывать девтулс и т.д.). Поэтому делаем скриншот, отправляем его в чат ИИ, он выдает ответ - мы нажимаем на нужный или пишем код

Под конец топ фейлов

fail fail fail fail

По любым вопросам пишите в Telegram: https://t.me/Mldorlfuse . Постараюсь на все ответить

About

AutoHHSearch — это продвинутый бот для автоматизации поиска работы на платформе HeadHunter. Основная цель проекта — избавить соискателя от рутины, автоматически откликаясь на подходящие вакансии, отправлять сопроводительное письмо отталкиваясь от текста вакансии и заполнение форм. А ткаже автоматически подтверждать навыки.

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages