I am trying to log in to VKontakte with a php script, until a certain point everything goes smoothly, but then an error 400 Bad Request appears.

The bottom line is that the last step is to parse the link that the script successfully does, and follow it. And then error 400 appears, because if you just copy the link and click on it, authorization passes.

<? $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); 
  • And if you look in the inspector, no additional parameters are transmitted? - Kudrin Sergey
  • It is possible through api, grant_type = password - ModaL

0