PDA

Просмотр полной версии : [Delphi] Авторизация ВКонтакте


Kandi
22.12.2009, 12:38
Всем, привет) вот возник вопрос по авторизации вконтакте. Написал я пост запрос на авторизацию, вроде как) смотрю через снифер ->

Первый пост запрос:
post = op=a_login_attempt
url = http://vkontakte.ru/login.php

он проходит вроде нормально..по сниферу смарел получает он vklogin, по-моему так и должно быть!

Второй пост запрос:
post = act=login
post = success_url=
post = fail_url=
post = try_to_login=1
post = to=
post = vk=
post = email= + email
post = pass= + pass
url = http://login.vk.com/

этот вроде бы тоже не особо жалуется, и проходит нормально возвращает, что то типа этого:

<html>
<head>
<meta http-equiv='content-type' content='text/html; charset=windows-1251' />
</head>
<body onload="document.getElementById('l').submit();">
<form id='l' method='post' action='http://vkontakte.ru/login.php'>
<input type='hidden' name='op' id='op' value='slogin' />
<input type='hidden' name='redirect' id='redirect' value='1' />
<input type='hidden' name='expire' id='expire' value='0' />
<input type='hidden' name='to' id='to' value='' />
<input type='hidden' name='s' id='s' value='Cookie' />
</form>
</body>
</html>


Вместо слова Cookie конечно же возвращает куки...

теперь я их копирую, тоже вроде бы нормально копирую...без проблем всё..

Третий пост запрос:

post = op=slogin
post = redirect=1
post = expire=0
post = to=
post = s='+Cookie(<- это скопированные куки)
url = http://vkontakte.ru/login.php

И вот с этого момента, снифер мне начинает возвращать страницу типа ->
/login.php?u=1to=cHJvZmlsZS5waHA-

Вот такое выдаёт снифер, скрин:
http://i008.radikal.ru/0912/ec/81ec81e27407t.jpg (http://i008.radikal.ru/0912/ec/81ec81e27407.jpg)


Кто знает с чего он себя так начинает вести? :confused:

sn0w
22.12.2009, 12:42
cHJvZmlsZS5waHA = profile.php (base64)

Kandi
22.12.2009, 12:43
cHJvZmlsZS5waHA = profile.php (base64)
а чуть по русский можно? :D

Kandi
22.12.2009, 12:45
Понял) это кодировка base64
cHJvZmlsZS5waHA это и есть profile.php ???
Верно?)
Если да, тогда расскажи, что делать ? :(
как с этим бороться!?

Пуховой
22.12.2009, 12:45
Редирект на profile.php = удачная авторизация.

Kandi
22.12.2009, 12:47
Редирект на profile.php = удачная авторизация.

var
.....
Http : TidHttp;
....
begin
try
Http.HandleRedirects := true;


он как бе в true)
ил надо делать ручками редирект?!

Пуховой
22.12.2009, 12:52
А вообще, немного иначе.

1 запрос

op=a_login_attempt

-> http://vk.com/login.php

2 запрос

email=
pass=
expire=
vk=1

-> http://login.vk.com/?act=login

3 запрос

op=slogin
redirect=1
expire=0
to=
s={переменная s из ответа}

-> http://vk.com/login.php

При удачной авторизации, код ответа от сервера будет 302, и редирект на profile.php.

handleredirects лучше остановить в false - проще отловить результат авторизации.

sn0w
22.12.2009, 12:56
я бы парсер сделал сразу с учетом того что гдето басе64 юзается, расшифровщик басе64 вообще понты весит.

но тут сценарий просто отсмотри, расшифруй все похожие редиректы и юзай.
а может их вообще не надо декодить и в таком виде и льется. по снифферу удали запросы не потеме и посмотри сценарий.

Kandi
22.12.2009, 13:16
я бы парсер сделал сразу с учетом того что гдето басе64 юзается, расшифровщик басе64 вообще понты весит.

но тут сценарий просто отсмотри, расшифруй все похожие редиректы и юзай.
а может их вообще не надо декодить и в таком виде и льется. по снифферу удали запросы не потеме и посмотри сценарий.
да мне сначало бы сделать просто без басе64, а там буду совершенствовать.... дело в том, что в 3 пост запросе у меня идёт вроде всё нормально возвращает вот что:

HTTP/1.1 302 Found
Server: nginx/0.7.59
Date: Tue, 22 Dec 2009 09:04:32 GMT
Content-Type: text/html; charset=windows-1251
Connection: keep-alive
X-Powered-By: PHP/5.2.6-1+lenny3
Set-Cookie: remixlang=3; expires=Wed, 22-Dec-2010 09:04:32 GMT; path=/; domain=.vk.com
Pragma: no-cache
Cache-control: no-store
Set-Cookie: remixchk=5; expires=Tue, 28-Dec-2010 11:04:49 GMT; path=/; domain=.vk.com
P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Set-Cookie: remixsid=Cookie; expires=Wed, 22-Dec-2010 09:04:32 GMT; path=/; domain=.vk.com
Location: profile.php
Vary: Accept-Encoding
Content-Length: 0

а потом пост делаю на profile.php и тут вылетает redirectURL - /login.php?u=1&to=cHJvZmlsZS5waHA-
(в снифере)
хз че за трабла:(

Пуховой
22.12.2009, 13:34
function test_log_vk (name, pass : string) : string;
var
http : Tidhttp;
s : string;
post : Tstringlist;
coo : Tidcookiemanager;
compressor : tidCompressorZLib;
begin
coo := Tidcookiemanager.Create;
http := Tidhttp.Create; http.ReadTimeout := 60000; http.AllowCookies := true; http.HandleRedirects := false; http.CookieManager := coo; http.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'; http.Request.AcceptEncoding := 'gzip,deflate';
compressor := tIdCompressorZLib.Create; http.Compressor := compressor;
post := Tstringlist.Create;

http.get ('http://vk.com');
post.add ('op=a_login_attempt');
http.post ('http://vk.com/login.php', post);
post.Clear;

post.add ('email=' + name);
post.add ('pass=' + pass);
post.add ('expire=');
post.add ('vk=1');
s := http.post ('http://login.vk.com/?act=login', post);
post.Clear;

post.Add ('op=slogin');
post.Add ('redirect=1');
post.Add ('expire=0');
post.Add ('to=');
post.Add ('s=' + copy (s, 536, 56));
try
http.post ('http://vk.com/login.php', post);
except end;

if http.Response.Location = 'profile.php' then Result := 'remixsid=' + copy (s, 536, 56) else result := 'false';

http.Free; coo.Free; post.Free; compressor.Free;
end;

Код от руки писаный, но работает. Возвращает remixsid из кукисов (для авторизации больше ничего и не нужно).

Kandi
22.12.2009, 17:36
Ваш код выдаёт ошибку, такую же как и мою, не знаю как он у вас работает!?
Ошибка:
Project Project1.exe raised exception class EIdHTTPProtocolException With Message 'HTTP/1.1 302 Found'. Process stopped. Use Step or Run continue

patcher
22.12.2009, 17:46
Вот, пробуй этот код:

function loginvk(login, pass:string; HTTPClient:TIdHTTP):boolean;
var data:TIdMultiPartFormDataStream; s:string; res:TStringList;
begin;
HTTPClient.HandleRedirects:=True;
Data:=TIdMultiPartFormDataStream.Create;
Data.AddFormField('op', 'a_login_attempt');
HTTPClient.Post('http://vkontakte.ru/login.php', data);
data.Free;
res:=TStringList.Create;
Data:=TIdMultiPartFormDataStream.Create;
Data.AddFormField('email', login);
Data.AddFormField('pass', pass);
Data.AddFormField('expire', '');
Data.AddFormField('vk', '');
res.text:=HTTPClient.Post('http://login.vk.com/?act=login', data);
data.Free;
s:=copy(res[10], 51, length(res[10])-54);
res.Free;
if s<>'ext/css' then begin
Data:=TIdMultiPartFormDataStream.Create;
Data.AddFormField('op', 'slogin');
Data.AddFormField('redirect', '1');
Data.AddFormField('expire', '0');
Data.AddFormField('to', '');
Data.AddFormField('s', s);
HTTPClient.Post('http://vkontakte.ru/login.php', data);
data.Free;
result:=true;
end
else result:=false;
end;

Функция при удачной авторизации возвращает true, при неудачной - false.

Kandi
22.12.2009, 18:03
patcher
Какая у тебя Indy, у меня нету компанента IdMultiPartFormDataStream :(


s:=copy(res[10], 51, length(res[10])-54);


Как я понимаю спускаемся до 10 стр. идём до 51 знака и потом тип копируем 54.
Вообще куки длиной 56 и строка не 10 а 11 в коде(

patcher
22.12.2009, 18:05
Эмм....забыл:
uses IdMultipartFormData

sn0w
22.12.2009, 19:28
так у тя там ж в заголовке написано 302 Found... Location: profile.php

блин ща сам посмотрю)

eLWAux
22.12.2009, 19:35
100% работает (2а запроса):

use
..IdHTTP,ShellApi,RegExpr..;

var LoginInfo: TStrings;
r :TRegExpr;
page : string;

....

LoginInfo := TStringList.Create;
LoginInfo.Clear;

IdHTTP1.Host:='login.vk.com';
IdHTTP1.Port:=80;
LoginInfo.Add('op=a_login_attempt');
try
page := idhttp1.Post('http://vkontakte.ru/login.php',LoginInfo);
except
showmessage('nemogy auth');
exit;
end;
if (pos('captcha_sid',page)>0) then
begin
showmessage('this is captchaaaaa!');
exit;
end;

LoginInfo.Clear;
LoginInfo.Add('email='+edit_login.Text);
LoginInfo.Add('pass='+edit_pass.Text);
page := idhttp1.Post('http://pda.vkontakte.ru/login?pda=index&acknowledge=0',LoginInfo);
r := TRegExpr.Create;
page := idhttp1.get('http://pda.vkontakte.ru/status');
if (pos('name="activityhash"',page)<=0) then begin
showmessage('bad login \ pass');
exit;
end;
showmessage('good login \ pass');


http://www.sendspace.com/file/55jwwv

Kandi
22.12.2009, 20:50
Огромное спасибо eLWAux. Наконец, сделал авторизацию!

Kandi
22.12.2009, 23:03
К сожалению сделал её только на pda.vkontakte.ru
как быть с vk.com и vkontakte.ru ??? :(

unl1m
23.12.2009, 00:27
спасибо ТС

Chrome~
23.12.2009, 01:47
Скачивай исходники программы Vkonpic на этом сайте:
_http://3po.ru/vkonpic/
Там есть рабочая процедура авторизации на vkontakte.ru.

Kandi
23.12.2009, 02:14
Скачивай исходники программы Vkonpic на этом сайте:
_http://3po.ru/vkonpic/
Там есть рабочая процедура авторизации на vkontakte.ru.
да, я тоже о ней думал) вообще я туда заглядывал как то) там просто что то типо
Http.Get('http://vkontakte.ru/blablabla&=1&login='+login+'&pass='+pass);
надо будет глянуть :)
хотя меня оч интересует очень пост запросы) в чем проблема не пойму (((
а еще меня оч интересует вот эта тема:
http://forum.antichat.ru/thread165241.html
а сейчас (sleep)25200000;
:o :rolleyes:

flacs
23.12.2009, 10:32
У меня на опере не сразу заходит сцуко, сначала вот на эту страницу про которую ТС говорил, приходится еще раз жать Обновить! Раньше такого не было, как обойти эти грабли?

P.S. Opera 9.50.10063 build

Kandi
23.12.2009, 16:23
У меня на опере не сразу заходит сцуко, сначала вот на эту страницу про которую ТС говорил, приходится еще раз жать Обновить! Раньше такого не было, как обойти эти грабли?

P.S. Opera 9.50.10063 build

че то я тебя не особо понял) ты на опере заходишь вконтакт и тебя выкидывает на страницу -
http://vkontakte.ru/login.php?u=1to=cHJvZmlsZS5waHA-
что то типо того?)
потом жмёшь обновить и заходит вконтакт?)! :confused:

flacs
23.12.2009, 18:48
поставил оперу 10, теперь все норм.

Kandi
26.12.2009, 01:31
Установил Delphi 2010. Функция авторизации от Пухового заработала :)
Просто мистика, на Delphi 7 зависала :(
Спасибо всем за помощь)