Пытаюсь авторизоваться в вк без 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) // возвращает страницу с ошибкой авторизации
Незнаю насчет осн версии сайта но уверен что тоже самое(за исключением вывода каптчи), я авторизуюсь через моб версию и из гета на 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 соотв-но тот что мы спарсили с гет запроса. а каптчу контакт тебе отдаст только после этого(разве не логично?), а ты сразу зачем то в этот пост все параметры добавил.
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); Пробовал разные варианты. В общем так тоже самое, остаюсь на странице авторизации... С вебом у меня плоховато, так, что, извиняюсь заранее за тупняки
Так... Возле самого экзешника должны лежать дллки: 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")) { //треб ввод цифр //обрабатываем и работаем далее } Ну как то так, это скорее не код а просто описание процесса, во все тонкости надо самому вникать, а то это уже будет не кодинг а копи-пастинг. Надеюсь помог.
Ты задаешь много лишних параметров. Сейчас направлю тебя на верную мысль. Для авторизации тебе нужно просто подключить SSL , ты это делаешь. Далее нужно чтоб возле самой программы находились вышеуказанные dll-ки. Потом ставишь handleredirect:=true и все. Остальные настройки TIdHTTP тебе ни к чему. Максимум можешь менять UserAgent если необходимо и добавлять прокси. После этих манпуляций тебе не нужно парсить все элементы типа ip_h и тд. Просто спарси ссылку на авторизацию. Все параметры уже в ней. И на эту ссылку тебе остается только передать логин и пароль подключения. То есть в data записываешь логин и пароль и делаешь POST запрос с этими данными на уже имеющуюся ссылку авторизации. Так должно работать 100%