[Delphi] Авторизация ВКонтакте

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kandi, 22 Dec 2009.

  1. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Всем, привет) вот возник вопрос по авторизации вконтакте. Написал я пост запрос на авторизацию, вроде как) смотрю через снифер ->

    Первый пост запрос:
    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-

    Вот такое выдаёт снифер, скрин:
    [​IMG]


    Кто знает с чего он себя так начинает вести? :confused:
     
    #1 Kandi, 22 Dec 2009
    Last edited: 22 Dec 2009
  2. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    cHJvZmlsZS5waHA = profile.php (base64)
     
  3. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    а чуть по русский можно? :D
     
  4. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Понял) это кодировка base64
    cHJvZmlsZS5waHA это и есть profile.php ???
    Верно?)
    Если да, тогда расскажи, что делать ? :(
    как с этим бороться!?
     
  5. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    Редирект на profile.php = удачная авторизация.
     
  6. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Code:
    var
      .....
      Http  : TidHttp;
      ....
    begin
     try
        Http.HandleRedirects := true;
    
    он как бе в true)
    ил надо делать ручками редирект?!
     
  7. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    А вообще, немного иначе.

    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 - проще отловить результат авторизации.
     
  8. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    я бы парсер сделал сразу с учетом того что гдето басе64 юзается, расшифровщик басе64 вообще понты весит.

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

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    да мне сначало бы сделать просто без басе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-
    (в снифере)
    хз че за трабла:(
     
  10. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    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 из кукисов (для авторизации больше ничего и не нужно).
     
  11. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Ваш код выдаёт ошибку, такую же как и мою, не знаю как он у вас работает!?
    Ошибка:
    Project Project1.exe raised exception class EIdHTTPProtocolException With Message 'HTTP/1.1 302 Found'. Process stopped. Use Step or Run continue
     
  12. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    Вот, пробуй этот код:
    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.
     
  13. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    patcher
    Какая у тебя Indy, у меня нету компанента IdMultiPartFormDataStream :(

    Code:
    s:=copy(res[10], 51, length(res[10])-54);
    
    Как я понимаю спускаемся до 10 стр. идём до 51 знака и потом тип копируем 54.
    Вообще куки длиной 56 и строка не 10 а 11 в коде(
     
    #13 Kandi, 22 Dec 2009
    Last edited: 22 Dec 2009
  14. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    Эмм....забыл:
    Code:
    uses IdMultipartFormData
     
  15. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    так у тя там ж в заголовке написано 302 Found... Location: profile.php

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

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    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
     
    #16 eLWAux, 22 Dec 2009
    Last edited: 22 Dec 2009
  17. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Огромное спасибо eLWAux. Наконец, сделал авторизацию!
     
  18. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    К сожалению сделал её только на pda.vkontakte.ru
    как быть с vk.com и vkontakte.ru ??? :(
     
  19. unl1m

    unl1m Banned

    Joined:
    25 Nov 2008
    Messages:
    0
    Likes Received:
    18
    Reputations:
    0
    спасибо ТС
     
  20. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Скачивай исходники программы Vkonpic на этом сайте:
    _http://3po.ru/vkonpic/
    Там есть рабочая процедура авторизации на vkontakte.ru.
     
    1 person likes this.