Эта статья по сути является продолжением моей прошлогодней статьи, в которой я автоматизировал отклики на hh.ru. Кстати, если кому это интересн, тот проект до сих пор живой, недавно проверял :-)

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

Итак, недавно у меня появилась желание поискать работу на зарубежном рынке, ведь перспектива валютной удаленки выглядит весьма заманчивой (хоть и достаточно смутной в свете последних сокращений в зарубежном IT). В качестве первого ресурса для поиска работы был выбран сайт LinkedIn, а в качестве приложения для автоматизации этого поиска - проект AiHawk, который и вдохновил меня в прошлом году на создание аналогичного приложения для hh.ru. Но вот незадача - проект уже почти год как неактивен а последняя найденная версия не работоспособна. Поэтому было решено переписать данный проект, чтобы он снова мог работать.

Итак, что оно умеет?

  • искать вакансии на LinkedIn в соответствии с заданными настройками поиска, и определять, какие из них могут заинтересовать пользователя исходя из его резюме и настроек поиска, все найденные интересные вакансии сохраняются в файл, в котором они отсортированы по степени убывания их «интересности»

  • выделять из текста вакансии навыки, наличие которых подразумевается у кандидата на эту вакансию; все навыки также сохраняются в файл статистики, в котором они сортируются по убыванию частоты их появления в вакансиях

  • собственно откликаться на вакансии, отвечать на вопросы, формировать резюме и сопроводительные письма, заточенные под определенную вакансию

  • при этом в настройках есть режим, который позволяет делать все вышеперечисленное в фоне, а также режим автозапуска, который позволяет запускать процесс поиска вакансий раз в сутки

    Поэтому это приложение подойдет вам, если вы:

  • пока не готовы искать работу, но хотите знать, какие навыки наиболее востребованы по интересующей вас специальности

  • ищете работу в пассивном режиме, т.е. готовы рассматривать вакансии и откликаться на интересные, но при этом никуда не торопитесь и не хотите тратить на этот процесс ни минуты своего времени

  • ищете работу в пассивном режиме, готовы доверить поиск работы нейронке, но откликаться хотите самостоятельно

  • отчаянный ковбой, которому нужно срочно найти работу на LinkedIn, любой ценой, но бесплатно

Предупреждение

LinkedIn не одобряет использование ботов, по крайней мере в тексте его соглашения об использовании есть такой пункт:

You agree that you will not:

...

Use bots or other unauthorized automated methods to access the Services, add or download contacts, send or redirect messages, create, comment on, like, share, or re-share posts, or otherwise drive inauthentic engagement;

Но есть и смягчающие обстоятельства:

  • данный бот не занимается всякой жестью вроде мультиаккаунтных рассылок, лайков и прочего спама

  • данный бот не предназначен для коммерческого использования

  • в бот встроена имитация человеческого поведения вроде случайных задержек, скроллов и прочего

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

Еще раз об этической стороне вопроса

С рисками разобрались, теперь поговорим об этической стороне вопроса. Как и в случае с приложением для hh.ru, данное приложение для LinkedIn я считаю абсолютно этичным, так как:

  • компании сами используют LLM для поиска и отбора кандидатов, поэтому значительная часть откликов даже не доходит до HR, будучи отсеянными автоматическими фильтрами

  • найти работу в IT со временем легче не становится, помощники, упрощающие эту задачу, тут не повредят

  • есть режим поиска работы без автооткликов

  • спамить откликами в любом случае не выйдет, так как LinkedIn ограничивает количество быстрых откликов цифрой 50 в день

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

Основные отличия LinkedIn от HH

А они есть, и главное из них - на hh ты сначала заполняешь резюме на сайте, а потом уже откликаешься этим готовым резюме на каждую вакансию, прикладывая сопроводительное письмо и изредка отвечая на те или иные вопросы. На LinkedIn же под каждую вакансию желательно писать отдельное резюме, заточенное под эту вакансию, поскольку рассылка одного и того же резюме всем работодателям снижает вероятность ответа на ваш отклик. Плюс отклик на каждую вакансию требует ответа на множество вопросов, что на hh случается редко. А вот сопроводительные письма, в отличие от hh, просят не так часто. Эти отличия пришлось учитывать в архитектуре приложения, а теперь поговорим собственно о ней.

Архитектура приложения

Основной язык Python, использованы фреймворки Playwright, LangChain и Python-Telegram-Bot, Browser Use.

Приложение состоит из следующих блоков:

  • Main Block - основной блок, который запускает приложение и все его компоненты

  • Job Manager - блок, отвечающий за взаимодействие с сайтом LinkedIn, поиск вакансий, отклик на них, а также сохранение результатов работы приложения

  • Resume Builder - блок, отвечающий за создание резюме под каждую из вакансий

  • LLM Service - блок, отвечающий за взаимодействие с LLM

  • Telegram Manager - блок, отвечающий за отправку пользователю сообщений об ошибке, а также отчетов о проделанной за день работе через Telegram

Алгоритм работы

Поскольку LLM это штука довольно ненадежная, идея приложения заключается в том, чтобы доверить ей только ту работу, которую может выполнить только она, а все остальное пусть выполняют обычный софт. То есть все нажатия кнопочек в браузере и поиск нужных полей для заполнения осуществляет программа, а LLM используется только для ответов на вопросы, написания резюме и прочих NLP-шных штук. У этого подхода есть недостаток, связанный с тем, что LinkeIn периодически меняет свой сайт, и поэтому некоторые функции взаимодействия с его элементами приходится переписывать. Зато в целом приложение работает надежнее, чем типичное агентское приложение, в котором все функции выполняет LLM, да к тому же кушает на порядок меньше токенов.

В целом алгоритм работы выглядит так:

  1. Загружаем настройки программы и информацию о резюме из соответствующих файлов.

  2. Заходим на сайт и авторизуемся, если до этого не заходили. В противном случае просто загружаем предыдущую сессию.

  3. Анализируем, насколько полно представлена информация в резюме. Если есть неточности - просим пользователя их указать, в противном случае продолжаем работу.

  4. Если в конфиге есть какие-то дополнительные настройки поиска - задаем их на сайте.

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

  6. Просим LLM оценить, насколько подходит по ее мнению данная вакансия по шкале от 1 до 100. Если оценка выше границы, предварительно заданной в настройках приложения - переходим к п.7, иначе переходим к п.5.

  7. Собираем информацию о навыках, требуемых для данной вакансии, сохраняем ее в отдельный файл со статистикой по навыкам.

  8. Если в настройках приложения стоит разрешение на отклик - жмем кнопку отклика. В противном случае сохраняем информацию о данной вакансии в отдельный файл и переходим к п.5.

  9. Формируем с помощью LLM файл резюме и текст сопроводительного письма (при необходимости), прикладываем их к отклику.

  10. Отвечаем на дополнительные вопросы работодателя: какую зп хочешь, готов ли приезжать в офис, есть ли гражданство и т.д. Если до этого вопрос уже встречался, загружаем готовый ответ из файла, в противном случае просим LLM ответить и сохраняем ответ.

  11. В случае, если для ответа недостаточно информации, во избежание галлюцинаций в промпте указано возвращать вместо ответа фразу "No info". Следовательно, если получаем такой ответ - пропускаем вакансию и заносим ее в специальный файл для пропущенных вакансий, чтобы пользователь потом сам посмотрел его и откликнулся самостоятельно.

Дополнительные заметки

Отклик на другие вакансии

У LinkedIn, помимо вакансий с возможностью быстрого отклика (Easy Apply), есть также вакансии с переходом на сайт работодателя. Такие вакансии может обработать только агентское приложение, в котором все функции выполняет LLM через соответствующие инструменты. Для подобных вакансий я добавил в приложение агентскую библиотеку Browser Use, но результаты, если честно, не самые впечатляющие - агент способен справится только с одной вакансией из 5-10, при этом расход токенов минимум раз в 10 больше.

Стоимость работы приложения

Кстати о расходе токенов. По умолчанию в качестве LLM используется Gemini, у которой, есть бесплатный тариф API (до 15 вызовов в минуту), так что откликаться можно практически бесплатно! Правда периодически могут возникать ошибки, связанные со слишком частыми запросами, но в приложении есть настройка, которая позволяет минимизировать вероятность подобных ошибок, ограничивая RPM теми самыми 15 запросами в минуту. Но даже если использовать платный тариф, по моим подсчетам быстрый отклик на одну вакансию с использованием Gemin-2.0-Flash стоит $0.0005 - $0.0035, не очень большие деньги.

Анонимизация персональных данных

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

Playwright вместо Selenium

В AiHawk для взаимодействия с браузером использовался Selenium, я перевел проект на Playwright, потому что могу он более производительный, стильный, модный, молодежный, и к тому же из коробки поддерживает режим Headless, позволяющий запускать программу в фоновом режиме.

Все остальные свистелки перечислять не буду, о них можно почитать в README проекта.

Результат

На видео ниже пример работы. На нем программа запускается, находит через поиск вакансии, откликается на них, прикладывает резюме, а также отвечает на сопутствующие вопросы.

Видео

Проект есть на гитхабе, найти можно по этой ссылке.

Комментарии (6)


  1. VitaminND
    22.10.2025 11:39

    Супер! В Закладки однозначно!


  1. octoMax
    22.10.2025 11:39

    Круто! Очень полезная тулза. Нечто подобное запилил одно время для себя - но Ваше продвинутее +1000:-)
    (Вот из-за таких .... мы и видим 100500 откликов на вакансию размещенную 1 минуту назад)


  1. Paczuk
    22.10.2025 11:39

    Как на это смотрит сам LinkedIn? Проблем с баном аккаунтов ещё не было?


    1. beatwad Автор
      22.10.2025 11:39

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

      Спасибо за вопрос, добавил предупреждение об этом в статью.


      1. octoMax
        22.10.2025 11:39

         а работу найти удалось?


        1. beatwad Автор
          22.10.2025 11:39

          Не, пока в процессе)