Sign in

Зарегистрируйтесь, чтобы стать полноправным участником сообщества Masterpro.ws.

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

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

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

 

 

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

Итак, поехали. Все описанные далее действия визуально исчерпаны всего лишь одним-единственным кликом по ссылке.. но для начала неплохо бы открыть личный кабинет на 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" - уверен, вы и без моих комментариев поймете, в чем тут дело. Все получилось, не правда ли?

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

  • serge

    написал serge

    Воскресенье, 25 ноября 2018 01:17

    Artem, никакие "пользователи" ваш проект "поддерживать" не будут. Вот и все мысли.

  • Artem

    написал Artem

    Четверг, 22 ноября 2018 12:47

    Aleksej, я сразу привязал к heroku пустую карточку и получил 1000 бесплатных часов суммарно. Как показала практика - хватает, приблизительно, на 27-28 дней использования. Потом да, сервис просто выключают :(

    Думал сделать какую-то систему дотната для оплаты хостинга, т.е. чтобы пользователи сами "поддерживали" проект, но пока нет понимания, как это сделать прозрачно (отображать реальный баланс, требуемую сумму на оплату хостинга за месяц, и т.д.). Если есть мысли по этому поводу - поделитесь, пожалуйста :)

  • Aleksej

    написал Aleksej

    Четверг, 22 ноября 2018 01:44

    Ну а какая, по большому счету, разница. "You have used 80% of your 550 Free Dyno hours for March 2018. If you verify your account with a credit card, you can receive 450 more Free Dyno hours a month" и так далее; аппетит приходит во время езды... думаю, востребованность разнообразных job-порталов в России-2019 увеличится.

  • Artem

    написал Artem

    Среда, 21 ноября 2018 21:14

    Aleksej, heroku же вроде по времени (dyno hours) тарифицирует, а не по трафику. Или я что-то не так понял, когда читал условия?)

  • Aleksej

    написал Aleksej

    Среда, 21 ноября 2018 19:46

    Походу без никаких проблем работает сервис, обновляются резюме и на hh и на суперджобе. Тем, кто в активном поиске работы, можно смело рекомендовать. Но автору необходимо учитывать тот момент, что, если количество пользователей резко возрастет, бесплатный Heroku может перестать быть бесплатным. :)

  • Artem

    написал Artem

    Понедельник, 19 ноября 2018 17:24

    Serge, профит в опыте. Я только познаю Python и программирование в целом + проникся идеей opensource :) К тому же я тоже когда-то воевал со скриптами с захардкоженным id и токеном, обновлял руками этот токен каждые две недели и мечтал о "однокнопочном" сервисе. А когда питонить немного научился, взял и написал такой. Еще я раньше не работал с github (именно github, не СКВ git), heroku и прочими популярными штуками (travis-ci, gh-pages, etc)

    Это что-то вроде pet-project, да и просто приятно облегчить кому-то жизнь, если для меня этого ничего не стоит ;)

  • serge

    написал serge

    Понедельник, 19 ноября 2018 15:17

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

  • Artem

    написал Artem

    Воскресенье, 18 ноября 2018 14:17

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

  • Artem

    написал Artem

    Суббота, 23 декабря 2017 15:47

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

  • Aleksej

    написал Aleksej

    Суббота, 19 августа 2017 21:56

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

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

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