Пытаюсь авторизоваться на ВКонтакте скриптом на php, до определённого момента всё идёт гладко, но потом появляется ошибка 400 Bad Request.
Суть в том, что на последнем шаге остается спарсить ссылку, что скрипт успешно делает, и перейти по ней. Тут-то и появляется ошибка 400, ведь если просто скопировать ссылку и перейти по ней - авторизация проходит.
<?
$curl = curl_init();
$browser = 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0';
$data = [
'email' => 'email@site.com'
,'pass' => 'password'
];
// подготовительные данные
$options = [
CURLOPT_USERAGENT => $browser
,CURLOPT_URL => 'http://m.vk.com'
,CURLOPT_RETURNTRANSFER => 1
,CURLOPT_TIMEOUT => 30
];
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
// запрос делаем на мобильную версию ВКонтакте
preg_match('/ip\_h\=(.*?)\&/is', $response, $match);
$ip_h = $match[1];
// парсим ip_h
$url = 'https://login.vk.com/?act=login&_origin=http://m.vk.com&ip_h='.$ip_h.'&role=pda&utf8=1';
// формируем url
$options = [
CURLOPT_USERAGENT => $browser
,CURLOPT_URL => $url
,CURLOPT_POSTFIELDS => http_build_query($data)
,CURLOPT_POST => 1
,CURLOPT_RETURNTRANSFER => 1
,CURLOPT_HEADER => 1
,CURLOPT_SSL_VERIFYPEER => 0
,CURLOPT_SSL_VERIFYHOST => 0
,CURLOPT_TIMEOUT => 30
];
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
// делаем запрос на сформированный url
preg_match('/Location: (.*?)\n/is', $response, $match);
$url = $match[1];
/*
парсим оттуда ссылку на которую нас должно перебросить
CURLOPT_FOLLOWLOCATION не включил, т.к так удобнее/
Что интересно, если эту ссылку вывести на данном этапе,
то перейдя по ней авторизация пройдёт до конца,
и пользователь оказывается в своей новостной ленте.
Ссылка вида
http://m.vk.com/login?role=fast&to=&s=1&__q_hash=4baa84d796ed6a2d826ace41508614eb
После запроса возвращается нужная кука и происходит переадресация на /
Пробовал с абсолютно чистого браузера(открывал режим инкогнито),
авторизация всё равно проходит до конца.
Для того что-бы исключить фактор IP адреса, пробовал развернуть
Open Server на своём ПК - результат такой же.
*/
$options = [
CURLOPT_USERAGENT => $browser
,CURLOPT_URL => $url
,CURLOPT_RETURNTRANSFER => 1
,CURLOPT_HEADER => 1
,CURLOPT_TIMEOUT => 30
];
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
// делаем запрос на нужный url
echo $response;
// результат - 400 Bad Request
curl_close($curl);