Авторизация 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 данного параметра нет. Как его получить я не понимаю.

Буду рад любому направлению в правильную сторону.
  • Вопрос задан
  • 12763 просмотра
Пригласить эксперта
Ответы на вопрос 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 токен еще передается.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
26 апр. 2024, в 18:27
200000 руб./за проект
26 апр. 2024, в 18:24
80000 руб./за проект
26 апр. 2024, в 18:00
500 руб./за проект