Воскресенье, 26 февраля 2017 21:06

API HeadHunter: скрипт для обновления резюме

Оцените материал
(98 голосов)

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

Сравните с теми же Суперджобом, Job.ru или Rabota.ru, где все значительно проще... не, как хотите, а неудобно. Явно заказчик сэкономил на бюджете, а прогеры оперативно просекли ситуацию и недопилили; что же, дело знакомое. Причем явно недопил это не единственный: я почему-то был уверен, что, коль скоро страничка резюме на hh.ru содержит переключатель - с русского на английский - то и механизм создания двуязычного резюме явно обязан здесь присутствовать... ан нет, опять облом. Ох уж эти мне программисты, что за люди, а? - дикий народ. Дети гор.

 

Dev banner 3

 

"Ну, рисовать картины не сподобил меня создатель...", т.е. разработку многоязычного резюме HeadHunter придется оставить, видимо, для будущих поколений, когда нас с вами, уважаемый читатель, никакая работа явно уже волновать не будет: будем день-денькой греть спинку на солнышке, наслаждаясь заслуженным отдыхом и роскошной пенсией (какой к тому времени по счету будет президентский срок у ВВ, даже гадать не хочу); - ну, а пока суть да дело, обновлять ваши многочисленные резюме одним-двумя кликами мышки я вас научу. Не забывайте, на дворе 21 век, и у нас с вами есть относительно новый HeadHunter API, использующий для авторизации протокол OAuth2; вот с ними и поработаем. Черт с ней, с пенсией, где там наша не пропадала.

 

Update 04.04.2022. Все, кто хотел бы, используя описанную логику кода или любую иную, поэкспериментировать с API HeadHunter, примите добрый совет: не пробуйте этого делать на праздниках и уикендах, в такие дни API HeadHunter, случается, или лежит, или возвращает голимую херню вместо обусловленного докой JSON. На прошедших выходных имел случай в *дцатый раз убедиться в справедливости данного тезиса; подробно не анализировал, ибо не вижу в данном случае ни малейшего смысла терять свое время. А внешняя фабула такова: ранним утречком в понедельник, часиков эдак в 11 или 12, появляются, видимо, на работе гениальные российские прогеры/девопсы HeadHunter и поднимают свой API, т.е. плюс-минус к полудню все начинает, как ни в чем ни бывало, работать. Обращаться в саппорт с этим бесполезно, последует обычное русское #ихтамнет и #авотнедокажете, посему просто примите к сведению сказанное: ну вот так люди здесь живут и работают, иначе не умеют, въелось у них в плоть и кровь... подробно развивать данный тезис в контексте происходящих невеселых событий в данный момент не стану, по вполне понятным причинам, но вы меня поняли.

 

Итак, поехали. Все описанные далее действия визуально исчерпаны всего лишь одним-единственным кликом по ссылке.. но для начала неплохо бы открыть личный кабинет на HeadHunter и создать приложение, содержащее Client ID и Client Secret, а также Redirect URI, являющийся url-адресом скрипта, который прямо сейчас можно запросто скопипастить со странички форума: если вы психологически устойчивый, с нормальной и здоровой психикой человек и вас особо не тянет на программирование - уверен, вы так и сделаете. Это было бы вполне адекватно: закидываем скрипт куда-нибудь с глаз долой подальше на web-сервер, вбиваем свои данные API, открываем в браузере и начисто забываем про чьи-то там умные разглагольствования. Для всех же остальных, гм... продолжим.

Прежде всего, проверяем ассоциативный массив параметров url, если скрипт только начинает работать - показываем линк на HeadHunter "Обновить резюме", содержащий Client ID. После того, как вы кликнете по нему и API hh.ru перенаправит вас обратно (т.е. в этот же самый скрипт; еще не забыли, что указали redirect URI, регистрируя приложение?) - url уже содержит code (не верите - взгляните на адресную строку браузера), и скрипт продолжит работу:

 

<?
if (empty($_GET['code'])) {
echo '<p><a href="https://hh.ru/oauth/authorize?response_type=code&client_id=' . $client_id . '">Обновить резюме</a></p>';
} else {

 

На этом этапе, если вы не залогинены на hh.ru в вашем браузере, вы увидите окошко авторизации. Отлично, теперь следующий шаг: вытаскиваем из url код и передаем его вместе с Client ID и Client Secret обратно к API hh.ru, сделав POST-запрос посредством curl. В качестве ответа приходит уже JSON, содержащий токен доступа (поле access_token), вот его-то нам и надо. Не поленитесь, взгляните, что там такое содержит дамп var_dump($out) ? Помещаем токен в массив $headers, который и будем теперь использовать в ходе дальнейших запросов к API hh.ru:

 

if ($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, 'https://hh.ru/oauth/token');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, "grant_type=authorization_code&client_id=" . $client_id . "&client_secret=" . $client_secret . "&code=" . $_GET['code']);
$out = curl_exec($curl);
curl_close($curl);
}
$token_json = json_decode($out);
$headers = array(
'Authorization: Bearer ' . $token_json->access_token,
'User-Agent: Masterpro'
);

 

Комментируемый в статье код является лишь примером, хотя и полностью рабочим; используя полученный токен (заголовок Authorization: Bearer your_access_token) - вы получаете доступ к любым, предусмотренным разработчиками API, запросам, сделанным под учетной записью соискателя или работодателя; подробности см. в документации API HeadHunter.

 

Снова curl, но теперь уже GET-запрос к API, причем заголовок запроса на этот раз содержит полученный token. Взглянув на этом шаге дамп вернувшегося $out - обнаружим длинный-предлинный JSON, содержащий, пожалуй, всю информацию наших с вами резюме. И все, что нам теперь осталось сделать - это обработать полученные данные циклом foreach, выудив из вороха инфы идентификаторы резюме, а затем отправить через curl последний POST, результатом которого окажется републикация (обновление) всех резюме учетной записи:

 

if ($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, 'https://api.hh.ru/resumes/mine');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$out = curl_exec($curl);
curl_close($curl);
}
$resumes = json_decode($out);
foreach ($resumes->{'items'} as $item) {
if ($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, 'https://api.hh.ru/resumes/' . $item->id . '/publish');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$out = curl_exec($curl);
echo $out;
curl_close($curl);
}
}

 

Порт php-скрипта на ruby on rails: HeadHunter resume updater on Ruby on Rails.

 

Если в ответ придет "description":"Can't publish resume: too often" - уверен, вы и без моих комментариев поймете, в чем тут дело. Все получилось, не правда ли?

Последнее изменениеПонедельник, 04 апреля 2022 18:08

17 комментарии

  • Комментировать serge Понедельник, 19 ноября 2018 15:17 написал serge

    Может, даже потестим, интересно. :) Артем, а в чем вообще профит создания бесплатного сервиса, скажите? Пусть даже на бесплатном Heroku, все равно ведь нуждается в обслуживании и рефакторинге.

  • Комментировать Artem Воскресенье, 18 ноября 2018 14:17 написал Artem

    Сервис, про который я писал ранее (hhupdate.ру) - умер, а я потерял исходники :D
    В итоге пришлось переизобрести велосипед еще раз)) В этот раз открыл исходники и опубликовал на гитхабе, сделал интеграцию сразу с hh и superjob, коллега помог разделить frontend и backend, в качестве хостинга тоже выбрал бесплатный heroku + github pages. Ссылки публиковать наверно нельзя, но я рискну :) github.com/pushresume - исходники, pushresume.github.io - рабочее приложение, вдруг кому интересно. Вклад в проект приветствуется, бигофикс тоже :D

  • Комментировать Artem Суббота, 23 декабря 2017 15:47 написал Artem

    Замечательная статья, спасибо! Я тоже запили свой велосипед на Python - hhupdate.ру, где любой желающий может включить автоматическое обновление своих резюме абсолютно бесплатно)

  • Комментировать Aleksej Суббота, 19 августа 2017 21:56 написал Aleksej

    Сделал для разнообразия на ruby аналогичный скрипт под API SuperJob, кому надо: https://masterpro.ws/superjob-resume-updater-on-ruby-on-rails

  • Комментировать Aleksej Четверг, 03 августа 2017 08:45 написал Aleksej

    Сложно или нет - все относительно, как известно; но линк на нерабочий скрипт здесь точно не нужен, удаляю. Что касается суперджоба - обращайтесь ежели что, напишу.

  • Комментировать Данила Среда, 02 августа 2017 18:03 написал Данила

    Здравствуйте!

    Подскажите пожалуйста, сложно ли написать подобный скрипт для superjob.ru?

    В интернете нашел только один такой скрипт на powershell и тот не рабочий. Тут

  • Комментировать HR Четверг, 20 июля 2017 07:36 написал HR

    Стоит опубликовать телефон на hh.ru, тут же начинают названивать спамеры с телефона +78126037632, задолбали. Мой совет этот номер сразу в блэклист все, кто ищет работу на headhunter.

Оставить комментарий

Добавьте ваш комментарий

Web Development Masterpro

Read more