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