Сменили же авторизацию... если кто не жадный поделитесь. переменную S не могу сперового запроса дернуть Code: http://vkontakte.ru/ 0e9e99d3aec4b53ae2a6fc7d&op
PHP: //--------------------------------------------------------------------------- int VK::Auth(String sLogin, String sPass) { ClearCookie(); sUrl = "http://vkontakte.ru/login.php"; sRequest = "op=a_login_attempt"; if( !Post() ) return -1; while( (sCaptchaSid = TextMid("\"captcha_sid\":\"", "\"")).Length() ) { if( !GetCaptcha() ) return -8; sCaptcha = AntigateCheckCaptcha(); setopt(curl, CURLOPT_PROXY , sProxy); setopt(curl, CURLOPT_PROXYTYPE , prProxyType); if(sCaptcha.Pos("ERROR") ) return -9; sUrl = "http://vkontakte.ru/login.php"; sRequest = "op=a_login_attempt&captcha_sid=" + sCaptchaSid + "&captcha_key=" + sCaptcha; if( !Post() ) return -10; } if( !sPage.Pos("vklogin") ) return -2; sUrl = "http://login.vk.com/?act=login"; sRequest = "email=" + sLogin + "&pass=" + sPass + "&expire=&vk="; if( !Post() ) return -3; String s = ValueByName("s", '\''); if(s.IsEmpty()) { if(sPage.Pos("Location: http://vkontakte.ru/login.php?m=")) { sPage = TextMid("Location: http://vkontakte.ru/login.php?m=", '&'); return IsNum(sPage) ? sPage.ToInt() : -4; } return -5; } sUrl = "http://vkontakte.ru/login.php"; sRequest = "s=" + s + "&op=slogin&redirect=1&expire=0&to="; if( !Post() ) return -6; if( !sPage.Pos("Set-Cookie: remixsid=") ) return -7; sCookie = TextMid("Set-Cookie: remixsid=", ';'); return 0; } //---------------------------------------------------------------------------
PHP: //--------------------------------------------------------------------------- String VK::ValueByName(String sName, String sQuote) { String sResult = sPage; if(sResult.Pos("name=" + sQuote + sName + sQuote)) { sResult.Delete(1, sResult.Pos("name=" + sQuote + sName + sQuote)); if(sResult.Pos("value=" + sQuote)) { sResult.Delete(1, sResult.Pos("value=" + sQuote) + 7 - 1); sResult.SetLength(sResult.Pos(sQuote) - 1); return sResult; } } return ""; } //--------------------------------------------------------------------------- String VK::TextMid(String sLeft, String sRight) { String sResult = sPage; if(sResult.Pos(sLeft)) { sResult.Delete(1, sResult.Pos(sLeft) + sLeft.Length() - 1); if(sResult.Pos(sRight)) { sResult.SetLength(sResult.Pos(sRight) - 1); return sResult; } } return ""; } //---------------------------------------------------------------------------
PHP: data.Add('email='+login); data.Add('pass='+pass); uns:=UTF8toANSI(idhttp1.post('http://login.vk.com/?act=login', data)); s:=copy(uns, pos('<input type='#39'hidden'#39' name='#39's'#39' value='#39'', uns)+37, 56);
PHP: //--------------------------------------------------------------------------- bool VK::GetCaptcha(void) { setopt(curl, CURLOPT_POST, 0); setopt(curl, CURLOPT_HEADER , 0); setopt(curl, CURLOPT_WRITEFUNCTION, CaptchaWrite); setopt(curl, CURLOPT_WRITEDATA, (void*)&bufCaptcha); sUrl = "http://vkontakte.ru/captcha.php?sid=" + sCaptchaSid; bufCaptcha.size = 0; setopt(curl, CURLOPT_URL, sUrl); perform(curl); setopt(curl, CURLOPT_WRITEFUNCTION, PageWrite); setopt(curl, CURLOPT_WRITEDATA, &sPage); //---------------------------------------------------------------------------
PHP: //--------------------------------------------------------------------------- String VK::AntigateCheckCaptcha() { setopt(curl, CURLOPT_HEADER , 0); setopt(curl, CURLOPT_PROXY , ""); setopt(curl, CURLOPT_PROXYTYPE , HTTP); struct curl_httppost *post = NULL; struct curl_httppost *last = NULL; formadd(&post, &last, CURLFORM_COPYNAME, "method", CURLFORM_COPYCONTENTS, "post", CURLFORM_END); formadd(&post, &last, CURLFORM_COPYNAME, "soft_id", CURLFORM_COPYCONTENTS, "5", CURLFORM_END); formadd(&post, &last, CURLFORM_COPYNAME, "key", CURLFORM_COPYCONTENTS, sAntigateKey, CURLFORM_END); formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_BUFFER, "captcha.jpg", CURLFORM_BUFFERPTR, bufCaptcha.memory, CURLFORM_BUFFERLENGTH, bufCaptcha.size, CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END); String sId = ""; sUrl = "http://antigate.com/in.php"; sPage = ""; setopt(curl, CURLOPT_URL, sUrl); setopt(curl, CURLOPT_HTTPPOST, post); perform(curl); setopt(curl, CURLOPT_POST, 0); formfree(post); if(sPage.Pos("\r")) sPage.SetLength(sPage.Pos("\r") - 1); if(sPage.IsEmpty()) return "ERROR_REPLY_IN"; else if(sPage.Pos("ERROR_")) return sPage; else if(sPage.Pos("OK")) sId = sPage.SubString(sPage.Pos("|") + 1, sPage.Length() - sPage.Pos("|")); if(sId.IsEmpty()) return "ERROR_BAD_CAPTCHA_ID"; for(int i = 0; i < 12; ++i) { Sleep(5000); sUrl = "http://antigate.com/res.php?key=" + sAntigateKey + "&action=get&id=" + sId; sPage = ""; setopt(curl, CURLOPT_URL, sUrl); perform(curl); if(sPage.Pos("\r")) sPage.SetLength(sPage.Pos("\r") - 1); if(sPage.IsEmpty()) return "ERROR_REPLY_GET"; else if(sPage.Pos("ERROR_")) return sPage; else if(sPage.Pos("OK")) { sPage.Delete(1, sPage.Pos("|")); return sPage; } } return "ERROR_TIMEOUT"; } //---------------------------------------------------------------------------
PHP: //--------------------------------------------------------------------------- static void *cap_realloc(void *ptr, size_t size) { return ptr ? realloc(ptr, size) : malloc(size); } //--------------------------------------------------------------------------- static size_t CaptchaWrite(void *data, size_t size, size_t nmemb, void *buffer) { size_t realsize = size * nmemb; struct CaptchaBuffer *mem = (struct CaptchaBuffer *)buffer; mem->memory = (char*)cap_realloc(mem->memory, mem->size + realsize + 1); if(mem->memory) { memcpy(&(mem->memory[mem->size]), data, realsize); mem->size += realsize; mem->memory[mem->size] = 0; } return realsize; } //---------------------------------------------------------------------------
Теперь осталось только собрать весь код вместе и перевести на нужный язык =) При изменении этой строки работоспособность кода не гарантируется
Скажите что нетак..... сначало заходит потом выкидывает Code: procedure TForm1.Button1Click(Sender: TObject); var s,PageProfile:string; data,log:tstringlist; begin IdHTTP1.AllowCookies:=true; //IdHTTP1.HandleRedirects:=false; data:=TStringList.Create; log:=TStringList.Create; data.Add('[email protected]'); data.Add('pass=123456'); s:=UTF8toANSI(idhttp1.post('http://login.vk.com/?act=login', data)); x:=copy(s, pos('<input type='#39'hidden'#39' name='#39's'#39' value='#39'', s)+37, 56); try log.Add('s='+x); log.Add('op=slogin'); log.Add('redirect=1'); log.Add('expire=0'); log.Add('to='); log.Add('request_method=post'); PageProfile:=idhttp1.post('http://vkontakte.ru/login.php', log); except end; if Pos('logout', PageProfile)<>0 then Memo1.Lines.Add('Авторизация удалась') else Memo1.Lines.Add('Авторизация не удалась') end;
вобщем-то наличие самого параметра s на странице уже говорит об успешной авторизации, и дальше делать запросы невижу смысла - просто в куки подставляй s и делай свои грязные дела способ конечно не без подводных камней - например если страница заблокирована за спам, программа будет думать, что страница валидная.. хотя конечно и твой код не отличит заблоченную от валидной
Авторизацию лучше проходить через wap версию Авторизацию лучше проходить через wap версию wap.vkontakte.ru Все легко и отлично авторизовывается. Вот ИСХОДНИК Перехватывает капчу, если лезит капча, то выводит ее в image
1) Чем авторизация через вап проще обычной? 2) Если в прошлом году, можно было авторизоваться через вап и с теми же куками работать в обычной версии, то сейчас такого нет и работать придется через вап, а это накладывает много ограничений. 3) IP адреса чаще попадают в блэк.