Авторизация ВКонтакте на PHP
Этапы авторизации на сайте vkontakte.ru
- Загружаем страницу входа ВКонтакте
GET http://vkontakte.ru/login.php
Сразу же для сайта *.vkontakte.ru ставится кука remixchk
Set-Cookie remixchk=5
В загруженной странице, мы видим форму login и функции try_to_login() и quick_login()
function try_to_login(obj, text) {
//нам важно только это
if (text.substr(0, 7) == 'vklogin') {
vklogin = true;
ge('login').submit(); //ge это getElementById()
}
}
function quick_login() {
var options = {onSuccess: try_to_login};
hide('message_text');
Ajax.postWithCaptcha('http://vkontakte.ru/login.php', {'op': 'a_login_attempt'}, options);
}
<form method="post" name="login" id="login" action="http://login.vk.com/" onsubmit="quick_login();">
<input type="hidden" name="act" id="act" value="login">
<input type="hidden" name="success_url" id="success_url" value="">
<input type="hidden" name="fail_url" id="fail_url" value="">
<input type="hidden" name="try_to_login" id="try_to_login" value="1">
<input type="hidden" name="to" id="to" value=""/>
<input type="hidden" name="vk" id="vk" value="">
<span>E-mail или Логин:</span>
<input type="text" name="email" value="" id="email"/>
<span>Пароль:</span>
<input type="password" name="pass" value="" id="pass"/>
<input type="hidden" name="expire" id="expire" />
<span><a href="javascript: quick_login()">Вход</a></span>
<input type="submit" value='.'/>
</form>
- После нажатия кнопки «Вход», выполняется функция quick_login(), которая пытается авторизоваться по кукам и делает POST запрос vkontakte.ru/login.php
POST http://vkontakte.ru/login.php
Cookie: remixchk=5
op=a_login_attempt
Получаем:
HTTP/1.1 200 OK
vklogin - Функция try_to_login() анализирует результат и делает POST запрос формой login:
POST http://login.vk.com/Parameter Name Value act login success_url fail_url try_to_login 1 to vk email no@rus.chars pass no*rus*chars expire Получаем:
HTTP/1.1 200 OK
<body onload="document.getElementById('l').submit();">
<form id="l" action="http://vkontakte.ru/login.php" method="post"> <input id="op" name="op" type="hidden" value="slogin" />
<input id="redirect" name="redirect" type="hidden" value="1" />
<input id="expire" name="expire" type="hidden" value="0" />
<input id="to" name="to" type="hidden" />
<input id="s" name="s" type="hidden" value="a8gf99fcf9d22f1eb5a92201d1ec66abbe14752b5c6c2acbd42813ea" />
</form>
</body> - В событии onload, т.е сразу после загрузки страницы делается POST формы «l»
POST http://vkontakte.ru/login.phpParameter Name Value op slogin redirect 1 expire 0 to s a8gf99fcf9d22f1eb5a92201d1ec66abbe14752b5c6c2acbd42813ea В ответе получаем:
HTTP/1.1 302 Found
Set-Cookie: remixsid=a8gf99fcf9d22f1eb5a92201d1ec66abbe14752b5c6c2acbd42813ea; expires=Fri, 14-Jan-2011 08:39:43 GMT; path=/; domain=.vkontakte.ru
Location: profile.php
Из переменной s нам повесили куку remixsid.
Итак, мы получили 302 redirect на profile.php, а значит, авторизовались. - Загружаем страницу profile.php
GET http://vkontakte.ru/profile.php
Cookie: remixsid=a8gf99fcf9d22f1eb5a92201d1ec66abbe14752b5c6c2acbd42813ea; remixchk=5
В ответе получаем
HTTP/1.1 200 OK
PHP-скрипт авторизации vkontakte.ru
Данный скрипт авторизуется на сайте vkontakte.ru, используя те же этапы, что и в теории с помощью библиотеки cURL.
sleep(2) – задержка на 2 секунды
$Email – логин
$Password – пароль
<?php
$Email = urlencode('no@rus.chars');
$Password = urlencode('no*rus*chars');
$ch = curl_init();
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0");
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
//GET vkontakte.ru/login.php
curl_setopt ($ch, CURLOPT_URL, 'http://vkontakte.ru/login.php');
$body = curl_exec($ch);
sleep(2);
//POST vkontakte.ru/login.php
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "op=a_login_attempt");
curl_setopt ($ch, CURLOPT_URL, 'http://vkontakte.ru/login.php');
$body = curl_exec($ch);
//POST login.vk.com/
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "act=login&success_url=&fail_url=&try_to_login=1&to=&vk=&email=".$Email."&pass=".$Password."&expire=");
curl_setopt ($ch, CURLOPT_URL, 'http://login.vk.com/');
$body = curl_exec($ch);
sleep(2);
//парсим remixsid
$arr = array();
preg_match_all("|<input\stype=\'hidden\'\sname=\'s\'\sid=\'s\'\svalue=\'(.+)\'\s/>|U", $body, $arr);
//POST vkontakte.ru/login.php
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "op=slogin&redirect=1&expire=0&to=&s=".$arr[1][0]);
curl_setopt ($ch, CURLOPT_URL, 'http://vkontakte.ru/login.php');
$body = curl_exec($ch);
curl_close($ch);
//парсим mid и activityhash
preg_match_all("|<input\stype=\"hidden\"\sid=\"mid\"\svalue=\"(.+)\"\s/>|U", $body, $arr);
$userID = $arr[1][0];
preg_match_all("|<input type='hidden' id='activityhash' value='(.+)'>|U", $body, $arr);
$activityhash = $arr[1][0];
print("userID = $userID activityhash = $activityhash");
?>


не могу зайти в контакт..(
$Email и $Password надо написать свои..
покажите лог сниффера
У меня пишет вот такую ошибку: Warning: preg_match_all() [function.preg-match-all]: Unknown modifier ‘|’ in /home/sseks315/public_html/test/vk.php on line 38
userID = 15841355 activityhash = 15841355
замени строку
preg_match_all(»|U», $body, $arr);
на
preg_match_all(»||U», $body, $arr);
Автору спасибо за скрипт)
хмм порезался код , короче в 38 строке после первой кавычки поставь |
ага, спасибо
Не получается… видать опять чета поменяли…
504-выдает nginx…
А нельзя без авторизации хапать странички под одним акком, подставляя куки?
перестала нажиматься кнопка Вход
всегда нажималась..
причем у всех в нашей сети..
Вирусов нет, файл host в порядке
браузер.. Опера, Мозила и др. на всех одинаково
Если не жать кнопку, а сразу после ввода пароля нажать Enter то начинаются затяжные попытки входа.. (минуты)
пока не надоест.. тогда жму автономный режим и вот только только многострадальческая страничка появляется.. Наполовину не рабочая
Помогите кто может?! )
[...] авторизации ВКонтакте на php уже как то раз рассказывал, но поскольку алгоритм снова изменился, напишу [...]