Доброго времени суток!
В наличии php 5.4, apache 2.4, мой личный аккаунт на hh.ru.
Задача: получить доступ к страницам hh.ru из-под авторизованного пользователя. Никакого взлома или чужих аккаунтов не нужны – авторизация под своим собственным аккаунтом.
Пробовал решить так:
Смотреть код
<?php
// ============================== Config sсript ================================
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('track_errors', true);
ini_set('error_reporting', E_ALL);
ini_set('display_startup_errors', true);
ini_set('report_memleaks', true);
ini_set('html_errors', true);
restore_error_handler();
define('DIR_ROOT', dirname(__FILE__) . DIRECTORY_SEPARATOR);
$config = [
'host' => 'spb.hh.ru/',
'сoоkiе' => DIR_ROOT . 'сoоkiе.txt',
'username' => '[email protected]',
'password' => 'blowfish',
];
// ============================== Global cURL config ===========================
$ch = curl_init();
// Global prefs
$curlOptGlobal = [
CURLOPT_AUTOREFERER => 1,
CURLOPT_COOKIEFILE => $config['сoоkiе'],
CURLOPT_COOKIEJAR => $config['сoоkiе'],
CURLOPT_COOKIESESSION => true,
CURLOPT_FAILONERROR => 1,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => false,
CURLOPT_HTTPHEADER => ['Expect:'],
CURLOPT_REFERER => 'hh.ru/logon.do',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_TIMEOUT => 999,
CURLOPT_UNRESTRICTED_AUTH => true,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36',
];
curl_setopt_array($ch, $curlOptGlobal);
// ============================== Do auth ======================================
// Verify
$curlOptVerify = [
CURLOPT_URL => 'hhid.ru/validate/;http;hh.ru;80;/',
];
curl_setopt_array($ch, $curlOptVerify);
curl_exec($ch);
$resultVerify = (curl_errno($ch)) ? curl_error($ch) : curl_exec($ch);
// Go to page
$curlOptPage = [
CURLOPT_URL => 'hh.ru/',
];
curl_setopt_array($ch, $curlOptPage);
curl_exec($ch);
$resultPage = (curl_errno($ch)) ? curl_error($ch) : curl_exec($ch);
// Do auth
$curlOptAuth = [
CURLOPT_URL => 'hh.ru/logon.do',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'username' => $config['username'],
'password' => $config['password'],
'remember' => 'on',
'action' => 'Войти в личный кабинет',
],
];
curl_setopt_array($ch, $curlOptAuth);
curl_exec($ch);
$resultAuth = (curl_errno($ch)) ? curl_error($ch) : curl_exec($ch);
// Go to page again
$curlOptPageAgain = [
CURLOPT_URL => 'hh.ru/',
CURLOPT_POST => false,
];
curl_setopt_array($ch, $curlOptPageAgain);
curl_exec($ch);
$resultPageAgain = (curl_errno($ch)) ? curl_error($ch) : curl_exec($ch);
curl_close($ch);
// ============================== Output results ===============================
// echo $resultPage;
// echo '
';
echo $resultAuth;
// echo '
';
// echo $resultPageAgain;
Однако, вижу страницу для авторизации.
Доступ к кукам есть:
$ sudo chmod 1777 cookie.txt
В них есть несколько токенов и строка с "hhrole anonymous", что не ест гут.
В какую сторону копать? Почему cURL не может авторизоваться и как это исправить?
Спасибо.
Или нужно именно авторизацию делать?
Я через файлик когда-то давно пытался куки сохранять - но почему-то счел это неудобным.
Вообщем, если до вечера проблема не решится - гляну что можно сделать )
Так как какие-то хэши в куках меняются, то нужно делать авторизацию. Плюс, доступ нужен к странице, доступа к которой гостю нет.
Я рассмотрел hh.ru из инкогнито-вкладки хрома и примерно представил алгоритм:
1. При любом посещении сайта ставится печенька с hhtoken и hhuid (в дальнейшем используются везде, и, вроде бы, в течении сессии не меняются)
2. Теперь можно авторизоваться. Шлю на /login.do пост с нужными данными
3. Происходит непонятный редирект
4. Около 3-5 перекидываний разными хэшами клиента с сервером
По шагам 3 и 4 курл, вроде, ходит, но, видимо, не так как нужно или шлёт невалидные данные – и авторизации не происходит. Этот момент я сам не понимаю поэтому и спросил сообщество.
Можно, конечно, делать 100500 редиректов руками: формировать и слать заголовки вручную, руками их парсить и т.п. Такой пошаговый реверсинжениринг. Но хотелось бы обойтись малой кровью и благами автоматизации (:
у них есть отдельный домен для кроссдоменной авторизации (наверное, иначе зачем он им) - hhid.ru
На нем ставятся id и token, как-то валидируюся, перебрасывают на hh.ru, проставляются там, потом меня почему-то опять кинуло на hhid.ru, а потом назад на форму авторизации без пометок об ошибке.
Видимо мы что-то упустили..
action, кстати, там не "Войти в личный кабинет", а просто "Войти". У меня, по крайней мере.
В скрипте поменял на "Войти", а затем вообще убрал этот параметр – результаты не изменились ):
Пробовал обрабатывать заголовки вручную – запоролся на втором обмене данными (после hh.ru/login.do) ибо не понимаю откуда берётся дико длинный хэш "memo".
Вы решили проблему авторизации на hh? Если да, то подскажите пожалуйста куда смотреть?