Всем, привет) вот возник вопрос по авторизации вконтакте. Написал я пост запрос на авторизацию, вроде как) смотрю через снифер -> Первый пост запрос: 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/ этот вроде бы тоже не особо жалуется, и проходит нормально возвращает, что то типа этого: Code: <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- Вот такое выдаёт снифер, скрин: Кто знает с чего он себя так начинает вести?
Понял) это кодировка base64 cHJvZmlsZS5waHA это и есть profile.php ??? Верно?) Если да, тогда расскажи, что делать ? как с этим бороться!?
Code: var ..... Http : TidHttp; .... begin try Http.HandleRedirects := true; он как бе в true) ил надо делать ручками редирект?!
А вообще, немного иначе. 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 - проще отловить результат авторизации.
я бы парсер сделал сразу с учетом того что гдето басе64 юзается, расшифровщик басе64 вообще понты весит. но тут сценарий просто отсмотри, расшифруй все похожие редиректы и юзай. а может их вообще не надо декодить и в таком виде и льется. по снифферу удали запросы не потеме и посмотри сценарий.
да мне сначало бы сделать просто без басе64, а там буду совершенствовать.... дело в том, что в 3 пост запросе у меня идёт вроде всё нормально возвращает вот что: Code: 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- (в снифере) хз че за трабла
Code: 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 из кукисов (для авторизации больше ничего и не нужно).
Ваш код выдаёт ошибку, такую же как и мою, не знаю как он у вас работает!? Ошибка: Project Project1.exe raised exception class EIdHTTPProtocolException With Message 'HTTP/1.1 302 Found'. Process stopped. Use Step or Run continue
Вот, пробуй этот код: Code: 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.
patcher Какая у тебя Indy, у меня нету компанента IdMultiPartFormDataStream Code: s:=copy(res[10], 51, length(res[10])-54); Как я понимаю спускаемся до 10 стр. идём до 51 знака и потом тип копируем 54. Вообще куки длиной 56 и строка не 10 а 11 в коде(
100% работает (2а запроса): Code: 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
Скачивай исходники программы Vkonpic на этом сайте: _http://3po.ru/vkonpic/ Там есть рабочая процедура авторизации на vkontakte.ru.