delphi post авторизация в vk

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by firstfallen, 21 Mar 2017.

  1. firstfallen

    firstfallen New Member

    Joined:
    1 Mar 2010
    Messages:
    64
    Likes Received:
    0
    Reputations:
    0
    Пытаюсь авторизоваться в вк без api. Но всегда вылетает ошибка. Что не так?
    Code:
    listlist := tstringlist.Create();
      htttp := tidhttp.Create(nil);
      htttp.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
      htttp.Request.Accept := 'text/html, */*';
      htttp.Request.UserAgent :=
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
      htttp.Request.ContentType := 'application/x-www-form-urlencoded';
      htttp.HandleRedirects := true;
      email := mail;
      pass := pass;
      listlist.Add('act=login');
      listlist.Add('role=al_frame');
    
      response := htttp.Get('https://vk.com');
    
      p1 := Pos('ip_h" value="', response);
      if p1 > 0 then
        test1 := Copy(response, p1 + length('ip_h" value="'), 18);
      p1 := Pos('lg_h" value="', response);
      if p1 > 0 then
        test2 := Copy(response, p1 + length('lg_h" value="'), 18);
      showmessage(response); //
      showmessage(test1); //     для проверки что найдено то что нужно
      showmessage(test2); //
      listlist.Add('ip_h=' + test1);
      listlist.Add('lg_h=' + test2);
      listlist.Add('email=' + email);
      listlist.Add('pass=' + pass);
      listlist.Add('expire=');
      listlist.Add('captcha_sid=');
      listlist.Add('captcha_key=');
      listlist.Add('_origin=http%3A%2F%2Fvk.com');
      listlist.Add('q=1');
      response := htttp.Post('https://login.vk.com/?act=login', listlist);
      Memo1.Lines.Add(response) // возвращает страницу с ошибкой авторизации
     
  2. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    TIdCookieManager нужно привязать к HTTP клиенту.
     
  3. firstfallen

    firstfallen New Member

    Joined:
    1 Mar 2010
    Messages:
    64
    Likes Received:
    0
    Reputations:
    0
    Привязал... но результат тот же
     
  4. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Может капча, нужно смотреть какой код ошибки возвращает login.vk.com
     
  5. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    Незнаю насчет осн версии сайта но уверен что тоже самое(за исключением вывода каптчи), я авторизуюсь через моб версию и из гета на m.vk.com я беру только ip_h.

    В первый пост нужны только 2 параметра:
    post->Add("email=[email protected]");
    post->Add("pass=123456");
    пост отправляем на (обрати внимание на то как сформирован урл):
    http->Post("https://login.vk.com/?act=login&_origin=http://m.vk.com&"+ip_h, post);
    ip_h соотв-но тот что мы спарсили с гет запроса.
    а каптчу контакт тебе отдаст только после этого(разве не логично?), а ты сразу зачем то в этот пост все параметры добавил.
     
    #5 besfamilnyi, 22 Mar 2017
    Last edited: 22 Mar 2017
  6. firstfallen

    firstfallen New Member

    Joined:
    1 Mar 2010
    Messages:
    64
    Likes Received:
    0
    Reputations:
    0
    Code:
     listlist := tstringlist.Create();
      htttp := tidhttp.Create(nil);
      htttp.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
      htttp.Request.Accept :=
        'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
      htttp.Request.UserAgent :=
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
      htttp.Request.ContentType := 'application/x-www-form-urlencoded';
      htttp.HandleRedirects := true;
      htttp.AllowCookies := true;
      htttp.Request.AcceptLanguage := 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
      htttp.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7';
      htttp.Request.Host := 'login.vk.com';
      htttp.Request.Connection := 'keep-alive';
      htttp.Request.Referer := 'http://m.vk.com/';
      email := 'mail';
      pass := 'pass';
    
      htttp.CookieManager:=IdCookieManager1;
      response := htttp.Get('https://m.vk.com');
    
      p1 := Pos('ip_h" value="', response);
      if p1 > 0 then
        test1 := Copy(response, p1 + length('ip_h" value="'), 18);
    
      listlist.Add('email=' + email);
      listlist.Add('pass=' + pass);
    
      response := htttp.Post('https://login.vk.com/?act=login&_origin=http://m.vk.com&'+test1,listlist);
    
      Memo1.Lines.Add(response);
    Пробовал разные варианты. В общем так тоже самое, остаюсь на странице авторизации...

    С вебом у меня плоховато, так, что, извиняюсь заранее за тупняки
     
  7. besfamilnyi

    besfamilnyi Member

    Joined:
    5 Jun 2012
    Messages:
    45
    Likes Received:
    10
    Reputations:
    0
    Так... Возле самого экзешника должны лежать дллки: libeay32.dll и ssleay32.dll.
    Из всех заголовков нужен только User-Agent. Потом я не знаю именно как в делфи люди делают, но хэндлер, перед тем как его прицепить, нужно указать метод ssl, показываю в билдеровском стиле:
    Code:
    //допустим создали компоненты для http
    TIdHTTP*http=new TIdHTTP(NULL);
    TIdSSLIOHandlerSocketOpenSSL*ssl=new TIdSSLIOHandlerSocketOpenSSL(NULL);
    //TIdSocksInfo*socks_info=new TIdSocksInfo(NULL);// а вот этим прицепляют соксы
    //далее про то что я говорил указываем метод:
    ssl->SSLOptions->Method=sslvSSLv23; //вк работает с этим методом.
    //здесь какие то действия наподобие добавления соксов:
                  
                    //socks_info->Host=p_host; //но комент
                   // socks_info->Port=StrToInt(p_port);
      //socks_info->Authentication=saUsernamePassword;//авториз прокси
                       // socks_info->Username=p_login; //но комент
                       // socks_info->Password=p_pass; //
        //когда в сокс инфо все добавлено после этого его прицепляем:
          //ssl->TransparentProxy=socks_info;
    //и потом хэндлер прицепляется:
    http->IOHandler=ssl;
    http->Request->UserAgent="Mozilla blabla"//какой-то юзерагент
    все эти хэндлредиректс, эллоу кукис, я не использую, всё делаем вручную:
           try{
                page=http->Get("https://m.vk.com");
                }
                catch () { } // в делфи наверно try exept
    //отсюда дергается ip_h
    //и готовятся пост параметры
        page.Delete(1, page.Pos("action=") +7);//тут наверно кому как проще парсить
        ip_h=page.SubString(1, page.Pos("\"")-1);                  
        page=NULL;                                                   
        post->Clear();       //когда в цикле делаешь, сначала надо почистить  от предыдущих данных                                     
        post->Add("email="+login );
        post->Add("pass="+pass );
        //login=NULL;
        //pass=NULL;
        ::Sleep(3000); // я тут делаю паузу, хотя может она и не нужна но мне так спокойнее.
            try {
                http->Post("https://login.vk.com/?act=login&_origin=http://m.vk.com&"+ip_h, post);
                } catch (...){}
       //и так, мы отправили контакту логин и пароль.
           Далее, если мы используем моб версию, то он в заголовках ответа пришлет нам в поле  Location или урл для дальнейшей авторизации, или каптчу, откуда просто
            page=http->Response->RawHeaders->Text;//тут урл редир на капчу
    и просто смотришь page и проверяешь что там в локейшене, если каптча то ее удобно распознавать в цикле, сохраняют ее в TMemoryStream*cap=new TMemoryStream;
    while(page.Pos("sid="))     //цикл распознавания капчи
                        {
                          //дергаешь потом отправляешь такой же пост запрос как перед этим, с логином и паролем
                        try {
                            http->Get("https://m.vk.com/captcha.php?sid="+cap_sid, cap);
                            } catch (...) {}//дернули каптчу, делее
                     //сохраняем картинку
                        cap->SaveToFile(cap_sid+".jpeg");
                       //выводим ее например на форму
                        Form1->img_cap->Picture->LoadFromFile(cap_sid+".jpeg");
                         //здесь должен быть цикл ожидания нажатия на кнопку например
                         while(cap_pause==true)
                         {
                          Sleep(4000);
                          }
                          // в пост добавим параметры
                         post->Add("captcha_sid="+cap_sid);
                         post->Add("captcha_key="+http->URL->ParamsEncode(Form1->Edit1->Text) );
                  
                         try{
                              http->Post("https://login.vk.com/?act=login&_origin=https://m.vk.com&"+ip_h, post);
                              }catch(...){}
                            page=http->Response->RawHeaders->Text;
                           //т.е. если тут опять каптча, то опять повторяется цикл, только нужно                          //будет удалить установленный предыдущие параметры 
                        post->Delete(3); //cap sid
                        post->Delete(2); // del cap key
                         }
        //тут например после поста есть кукис l= и в нем айди аккаунта, для работы в программе его удобно спарсить на данном этапе.
       //ну а для полной авторизации остается пройти по последнему редиректу
          loc_url=http->Response->Location;
                try {
                        page=http->Get(loc_url);  //доавторизовываемся
                    }  catch (...) { }
    
    //и дергаем куки, они будут в загшоловках ответа
    page=http->Response->RawHeaders->Text;
    //выдергиваем оттуда remixsid и подставляем
    page.Delete(1, page.Pos("remixsid") -1);
            r_sid=page.SubString(1, page.Pos(";")-1);
    http->Request->CustomHeaders->Add("Cookie: "+r_sid);
    //как бы всё, у нас есть ремикссид, и с ним далее куда хочешь туда ходишь. Определение спам блока, требования цифр телефона происходит тоже на этом этапе. Например в чекере акков далее мы будем пытаться зайти на
    http->Get("https://m.vk.com/id"+myid); //где myid это спарсенный айди из кукиса "l="
    и если акк в спам-блоке то контакт нам ответит это в заголовке :
    page=http->Response->RawHeaders->Text;
                  //и мы это задетектируем
                        if ( page.Pos("act=blocked"))
                        {
                         //акк в спам блоке
                         }
             //если в заголовке контакт выдаст нам ссылку на ввод цифр телефона, то опять же
           //задетектируем этот момент в тех же заголовках
                   if(page.Pos("security_check"))
                        {
                         //треб ввод цифр
                         //обрабатываем и работаем далее
                         }
    
    Ну как то так, это скорее не код а просто описание процесса, во все тонкости надо самому вникать, а то это уже будет не кодинг а копи-пастинг. Надеюсь помог.
     
    #7 besfamilnyi, 23 Mar 2017
    Last edited: 23 Mar 2017
  8. firmfreez

    firmfreez Banned

    Joined:
    21 Oct 2016
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Ты задаешь много лишних параметров. Сейчас направлю тебя на верную мысль. Для авторизации тебе нужно просто подключить SSL , ты это делаешь. Далее нужно чтоб возле самой программы находились вышеуказанные dll-ки. Потом ставишь handleredirect:=true и все. Остальные настройки TIdHTTP тебе ни к чему. Максимум можешь менять UserAgent если необходимо и добавлять прокси.

    После этих манпуляций тебе не нужно парсить все элементы типа ip_h и тд. Просто спарси ссылку на авторизацию. Все параметры уже в ней. И на эту ссылку тебе остается только передать логин и пароль подключения. То есть в data записываешь логин и пароль и делаешь POST запрос с этими данными на уже имеющуюся ссылку авторизации.

    Так должно работать 100%
     
  9. firmfreez

    firmfreez Banned

    Joined:
    21 Oct 2016
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    И еще 1 нюанс. Куки менеджер тоже не нужен. TIdHTTP запоминает куки для ВК нормально.