Ради интереса решил с имитировать авторизацию в 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.