PHP авторизация vkontakte
Сегодня расскажу как авторизоваться вконтакте средствами PHP и CURL. Начну с теории. Моя цель была авторизоваться в мобильной версии vkontakte.ru, т.е. m.vkontakte.ru и выдернуть оттуда нужные мне данные. Объясню почему… Во первых мобильная версия сайта проще для парсинга, с мобильной версии легче получить какие либо данные. В принципе по функционалу, тоже самое. Единственный минус — доступны не все функции и фичи. Но мне фичи были не нужны, мне нужно было только страница друзей, которые находятся в онлайне.
Давно не вникал в методы авторизации этого контакта. Поюзав поиск не нашел нужного мне решения и решил приступить к написанию сам, к тому же найденные методы почему то на данный момент не работали, видимо вконтакте не редко меняет алгоритм авторизации. Разумеется я использовал связку PHP+CURL. Как без нее нынче =) Авторизация вконтакте нынче сложная, с двумя или даже тремя редиректами. Чтобы вникнуть во всю суть я использовал сниффер. Разобравшись что к чему получился вот такой код:
<?
$user_agent='Opera/9.80 (S60; SymbOS; Opera Mobi/499; U; ru) Presto/2.4.18 Version/10.00';//браузер
$login='';//мыло, логин или номер телефона
$password='';//пароль
if (!$ch=curl_init()) {//инициализируем curl, если не получается выдаем ошибку
echo 'error curl init!';
exit;
}
//отключаем проверку корневых сертификатов
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//включаем показ заголовков в выводе
curl_setopt($ch, CURLOPT_HEADER, true);
//true т.к. мы будем отправлять post запрос
curl_setopt($ch, CURLOPT_POST, true);
//обманываем сайт, пусть думает что мы браузер
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
//ответ сервера будем записывать в переменную
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
//по редиректам будем переходить автоматически
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, 'https://login.vk.com');
//формируем запрос
$post=array(
'act' => 'login',
'pda' => '1',
'from_host' => 'm.vkontakte.ru',
//'ip_h' => '8f69244421976fb1a5',//для чего?
'from_protocol' => 'http',
'to' => '',
'email' => $login,
'pass' => $password
);
$post=http_build_query($post);
//отправляем post запрос
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
if (!$answer=curl_exec($ch)) {//если нет ответа - выдаем ошибку
echo 'error get answer!';
}
//вытаскиваем remixsid
$p='/remixsid=([a-z0-9]{10,70})/';//регулярка
preg_match($p, $answer, $tmp);
$remixsid=$tmp[1];
$cookie='remixsid='.$remixsid;//создаем печеньку =)
curl_setopt($ch, CURLOPT_POST, false);//переключаемся обратно к методу GET
curl_setopt($ch, CURLOPT_COOKIE, $cookie); //даем контакту скушать начу печеньку
curl_setopt($ch, CURLOPT_URL, 'http://m.vkontakte.ru/friendsonline');//страница друзей онлайн ->
//-> Вы можете вставить сюда ссылку на любую другую страницу контакта, которая нужна Вам
$answer=curl_exec($ch);//итоговый результат хранится в переменной $answer
echo $answer;//тут я вывожу содержимое этой переменной на экран, Вы же можете делать с ней все что хотите
//если что то не получается, можно раскомментировать две строки ниже и посмотреть ошибки
//echo "CURL error number: ".curl_errno($ch)."<br>";
//echo "CURL error: ".curl_error($ch)."<br>";
curl_close($ch);//закрываем curl сессию и очищаем память
?>
Вкратце постараюсь рассказать что да как. Скрипт использует библиотеку CURL. Написан на PHP. Старался писать с множеством комментариев чтобы было понятней тем, кто будет использовать данный скрипт, ну и писал не «загнуто» по «крутопрограммистски», а ля сокращение всего и вся в какие то специфические конструкции которые знают только те кто вкусил большую часть знаний. При написании столкнулся с такой проблемкой: при авторизации используется шифрованное соединение https, curl постоянно выдавал ошибку, ругаясь на непроверенный корневой сертификат, ошибка 60 (CURLE_SSL_CACERT), ясное дело у него не много этих корневых сертификатов… Я решил попросту отключить проверку сертификатов безопасности, для упрощения скрипта, врядли тут понадобится сия функция, можно было было импортировать сертификаты из браузера, положить их в отдельную папку и вручную потом их обновлять, но как я уже писал в данном случае не за чем. И еще не совсем понял для чего передается значение переменной ip_h? И без нее работает прекрасно, поэтому данную часть кода я закомментировал. (Если кто понял или знает, рад буду услышать). Самое ценное для нас — это значение переменной remixsid, которое выдается нам в куках. Я выдираю это значение из общей кучи заголовков (кстати в вывод включены и заголовки, но не думаю что это кому то не понравится) и потом подсовываю в печеньку, а затем скармливаю эту печеньку контакту =) Кстати зная значение данной переменной можно с легкостью сидеть с чьего либо аккаунта (и писать всякие гадости, читать сообщения), но не более. В общем если у Вас дорогие читатели будут какие либо вопросы по работе данного скрипта или советы по улучшению и т.д. прошу оставлять все это в комментариях, я с радостью отвечу. Буду рад, если кому то помог!
UPD: оказывается авторизовавшись в мобильной версии m.vkontakte.ru и зная remixsid, Вы можете спокойной получать необходимые данные и с полной версии vkontakte.ru, так что можно сказать скрипт универсален.