Воскресенье, 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 комментарии

  • Комментировать Aleksej Четверг, 27 августа 2020 22:31 написал Aleksej

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

  • Комментировать Alexis Вторник, 25 августа 2020 20:39 написал Alexis

    умер проект или заставили?
    Давайте подымем там, где не тронут?

  • Комментировать Artem Среда, 24 апреля 2019 11:14 написал Artem

    Coder

    Если пробовали в конце месяца, то скорее всего да, не работал сервис - на последние 2-3 дня месяца не хватает бесплатных ресурсов и сервис выключают :(

  • Комментировать Coder Суббота, 30 марта 2019 12:16 написал Coder

    Ну и где "рабочее приложение" на pushresume.github.io? Failed to fetch.

  • Комментировать serge Воскресенье, 25 ноября 2018 01:17 написал serge

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

  • Комментировать Artem Четверг, 22 ноября 2018 12:47 написал Artem

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

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

  • Комментировать Aleksej Четверг, 22 ноября 2018 01:44 написал Aleksej

    Ну а какая, по большому счету, разница. "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 Среда, 21 ноября 2018 21:14 написал Artem

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

  • Комментировать Aleksej Среда, 21 ноября 2018 19:46 написал Aleksej

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

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

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

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

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

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

Web Development Masterpro

Read more