Авторизация m.vk.com через php и curl для получения токена?

Серьезно пользуемся API, и все бы хорошо, но нужно получать токен для каждого пользователя приложения.

Задумались об автоматизации данной функции.

Для того что бы это сделать надо залогиниться через логин пароль, и подтвердить права.

Поизучав сутки в интернете понял, алгоритм, как это делается.

Алгоритм.
1. Вытаскиваем ip_h из страницы m.vk.com
2. Парсим страницу $url = 'https://login.vk.com/?act=login&_origin=http://m.v...'.$ip_h.'&role=pda&utf8=1'; с сохранением куки и получаем в заголовке /Location: m.vk.com/login?role=fast&to=&s=1&__q_hash=4baa84d7...
3. Загружаем данную ссылку с полученными на прошлом шаге куками.
По идее все должно работать. Но не работает.

$curl = curl_init();

	$browser = 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0';

	$data = array(
				'email' => 'login'
				,'pass' => 'pas'
			);
	// подготовительные данные

	$options = array(
					CURLOPT_USERAGENT		=> $browser
										,CURLOPT_COOKIEJAR => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
	                ,CURLOPT_COOKIEFILE => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
					,CURLOPT_URL		=> 'http://m.vk.com'
					,CURLOPT_FOLLOWLOCATION => true
					,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 = array(
					CURLOPT_USERAGENT		=> $browser
					,CURLOPT_URL		=> $url
					,CURLOPT_POSTFIELDS		=> http_build_query($data)
					,CURLOPT_COOKIEJAR => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
	                ,CURLOPT_COOKIEFILE => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
					,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 = trim($match[1]);
	echo $url;
	/*
		парсим оттуда ссылку на которую нас должно перебросить
		CURLOPT_FOLLOWLOCATION не включил, т.к так удобнее/
		Что интересно, если эту ссылку вывести на данном этапе,
		то перейдя по ней авторизация пройдёт до конца,
		и пользователь оказывается в своей новостной ленте.
		Ссылка вида
		http://m.vk.com/login?role=fast&to=&s=1&__q_hash=4baa84d796ed6a2d826ace41508614eb
		После запроса возвращается нужная кука и происходит переадресация на /
		Пробовал с абсолютно чистого браузера(открывал режим инкогнито),
		авторизация всё равно проходит до конца.
		Для того что-бы исключить фактор IP адреса, пробовал развернуть
		Open Server на своём ПК - результат такой же.
	*/

	$options = array (
					CURLOPT_USERAGENT		=> $browser
					 ,CURLOPT_COOKIEFILE => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
				,CURLOPT_COOKIEJAR => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
					,CURLOPT_URL		=> $url
					,CURLOPT_RETURNTRANSFER	=> 1
					,CURLOPT_HEADER		=> 1
					,CURLOPT_TIMEOUT		=> 30
                );

	curl_setopt_array($curl, $options);
	$response = curl_exec($curl);
	// делаем запрос на нужный url

	      $kat = "vk.txt";
    $fp = fopen($kat, 'w');
      $vkbot= $response." \n";
	  fwrite ( $fp, $vkbot);
	echo $response;
	// результат - 400 Bad Request

	curl_close($curl);

На последнем шаге специально результат записываю в файл, так как иначе происходит какой-то вечный редирект.

Гипотезы почему не работает. Не правильно работаю с куки. На шаге №3 посмотрев как работает контакт в входные куки передается параметр remixsid. Он единственный не delete. Но в выходных куках на шаге №2 данного параметра нет. Как его получить я не понимаю.

Буду рад любому направлению в правильную сторону.
  • Вопрос задан
  • 12782 просмотра
Пригласить эксперта
Ответы на вопрос 4
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Для того что бы это сделать надо залогиниться через логин пароль, и подтвердить права.

Вся эта возьня с api придумана отчасти чтобы вы не могли так делать.
Решение на питоне
habrahabr.ru/post/143972
Как на php провернуть не знаю.
Ответ написан
Комментировать
@sdwvit
Если последний запрос сформировать как POST, то работать будет.

POST https://m.vk.com/login?__q_hash=3dcf81592afake358d... HTTP/1.1
Host: m.vk.com
Cookie: cookie: remixq_3dcf815fakeebf0e49358df6d8=b5b4sofake6370231c0fce

В ответ приходит set-cookie:remixsid=84f74d93fakeremixidb91efake977747c284;
Ответ написан
Комментировать
gufibox
@gufibox
php nginx ubuntu
начни писать свой класс подключения) я скопировал отсюда и своего добавил) Не забудь там csrf токен еще передается.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы