Авторизация vkontakte на PHP

Ради интереса решил с имитировать авторизацию в vkontakte.ru Много примеров пересмотрел. Но большинство из них уже не рабочие, ибо постоянно меняется принцип. Да и всегда примеры с использованием curl. Я решил на основе сокетов сделать.


Двух этапная авторизация.
Обычно авторизация проходит в один этап. Вы вводите логин и пароль и, нажав кнопку, инициируете POST запрос, который обработает сервер.
На vkontakte немного посложнее.

Первый этап.
Имитация POST запроса формы. Посылаем серверу логин и пароль(заметьте, что запрос идёт к login.vk.com). В ответе с сервера нам необходимы пара параметров из раздела Set-Cookie.
Сам запрос.

$fp = stream_socket_client('tcp://login.vk.com'.':'.$this->port, $err, $errstr, 8, STREAM_CLIENT_CONNECT);
if (!$fp) 
{
	trigger_error('httpPost error: '.$errstr);
	return NULL;
}
else
{
	$posts='act=login&al_frame=1&expire=&captcha_sid=&captcha_key=&from_host=vkontakte.ru&email='.urlencode($this->login).'&pass='.urlencode($this->pass);
	$query="POST /?act=login HTTP/1.0\r\n".
	"Host: login.vk.com\r\n".
	"User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1\r\n".
	"Accept: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
	"Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n".
	"Accept-Encoding: gzip, deflate\r\n".
	"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n".
	"Referer: http://vkontakte.ru/al_index.php?act=auth_frame\r\n".
	"Content-Type: application/x-www-form-urlencoded\r\n".
	"Content-Length: ".strlen($posts)."\r\n\r\n".
	$posts."\r\n\r\n".
	"Connection: close\r\n\r\n";
	fwrite($fp, $query);
}
$data = $this->Read($fp);
fclose($fp);

В $data будет ответ от сервера. Оттуда надо выцепить id юзера, хэш и адрес, куда пойти должен редирект.

$this->id = preg_replace('/(.*)Set-Cookie: l=(.*); expires(.*)Set-Cookie(.*)/is', '$2', $data['data']);
$location = preg_replace('/(.*)Location: http:\/\/vkontakte.ru(.*)s=1(.*)/is', '$2s=1', $data['data']);
$this->hash = preg_replace('/(.*)hash=(.*)&&s=1/is', '$2', $location);

Второй этап.
У нас есть адрес, есть хэш, теперь можно отправить GET запрос на получение remixsid. Это как раз цель всей имитации. Посылаем запрос.

$fp = stream_socket_client('tcp://vkontakte.ru'.':'.$this->port, $err, $errstr, 8, STREAM_CLIENT_CONNECT);
if (!$fp) 
{
	//trigger_error('httpPost error: '.$errstr);
	echo 'error in socket';
	return NULL;
}
else
{
	$query="GET ".$location." HTTP/1.0\r\n".
	"Host: vkontakte.ru\r\n".
	"User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1\r\n".
	"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
	"Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n".
	"Accept-Encoding: gzip, deflate\r\n".
	"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n".
	"Referer: http://vkontakte.ru/al_index.php?act=auth_frame\r\n".
	"Cookie: remixchk=5\r\n".
	"Connection: close\r\n\r\n";
	fwrite($fp, $query);
}
$data = $this->Read($fp);
fclose($fp);

В ответе из кукисов надо выцепить remixsid.

$this->remixsid=preg_replace ('/(.*)Set-Cookie: remixsid=(.*); expires(.*)/is', 
								'$2', 
								$data['data']) ;

Теперь можно осуществить какой-нибудь пробный запрос под этим юзером, используя remixsid.

  Категории: php
  • http://fstrange.ru/coder/php/avtorizaciya-vkontakte.html fStrange

    Достаточно компактно получилось.

    p.s. Парсер накосячил в коде. 9 строка и дальше “&”

    • Suvitruf

      Да, не первый раз уже “amp;” вылезает в этом плагине.

      p.s. спасибо)

  • Fidelia

    Home run! Great sgulgnig with that answer!

  • hearing aids

    Great blog, how about links exchanging? Please contact me asap, Thanks.