Авторизация на ВКонтакте php скриптом

Пытаюсь авторизоваться на ВКонтакте скриптом на 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);
  • Вопрос задан
  • 13680 просмотров
Решения вопроса 1
@lubezniy
А почему не используете urlencode() для формирования URL ?
Ответ написан
Пригласить эксперта
Ответы на вопрос 10
90% логинящихся таким способом не знают об апи. Вы в какую часть входите?
Ответ написан
fsdsdfsfdsfsdfsdfsdfsdfsd
@fsdsdfsfdsfsdfsdfsdfsdfsd
Unknown
Закодил актуальную версию авторизации ВК — pastebin.com/5YecKuUs
Ответ написан
Folour
@Folour
$cookieFile = 'cookie.txt'; //файл для печенек
$account = ['email' => 'номер_телефона', 'pass' => 'пароль', 'submit' => 'Войти'];
$startUrl = 'https://m.vk.com';
$ua = 'Opera/9.80 (Android; Opera Mini/7.5.33361/31.1350; U; en) Presto/2.8.119 Version/11.11';

$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_COOKIEJAR => $cookieFile,
    CURLOPT_COOKIEFILE => $cookieFile,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERAGENT => $ua,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_URL => $startUrl
]);

preg_match('~post" action="(.*?)"~s', curl_exec($curl), $urlStepTwo);
curl_setopt_array($curl, [
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => $account,
    CURLOPT_URL => $urlStepTwo[1]
]); //Отправляем POST с данными аккаунта

//Авторизовались, получаем главную страницу  для проверки
curl_setopt_array($curl, [
    CURLOPT_URL => $startUrl
]); 
echo curl_exec($curl); //Ваша страница ВК
curl_close($curl);


Без FOLLOWLOCATION = Bad Request, так и не нашел почему. С ним - все ок, сразу после POST - можно выполнять авторизированные запросы.
Одно НО, с сервера Вы не авторизуетесь скорее всего, будет запрос на ввод номера.
---
Летом писал автоматическое получение токена к апи, по логину и паролю. Так работала авторизация и без FOLLOWLOCATION, жаль кода того не осталось.
Ответ написан
Комментировать
jakulov
@jakulov
Попробуйте для второго запроса новый curl_init сделать.
Я думаю, "400 Bad Request" возможно из-за того, что вы посылаете второй запрос на url с __q_hash методом POST.
Ответ написан
@srg_surgut
Подскажите, пожалуйста, куда именно нужно воткнуть этот urlencode() в какой урл?
Ответ написан
Комментировать
@Andrew_Lays Автор вопроса
Последние опции
$options = [
			CURLOPT_USERAGENT	=> $browser
			,CURLOPT_URL		=> $url
			,CURLOPT_RETURNTRANSFER	=> 1
			,CURLOPT_HEADER		=> 1
			,CURLOPT_TIMEOUT	=> 30
                ];
Ответ написан
Комментировать
@srg_surgut
Спасибо. Теперь почему-то все время 403 Access Denied
Ответ написан
Комментировать
@srg_surgut
Нашел проблему - в скрипте в том виде, как он тут в конце пробел, нужно его убрать и работает если поставить не urlencode() а trim()
Ответ написан
Комментировать
@srg_surgut
А вообще спасибо, это все то, что я очень искал и как раз свежее, рабочее
Ответ написан
Комментировать
@kalugga
srg_surgut, можешь дать ссылку на рабочий код?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы