Доброе время суток всем. Вполне в белых целях хочу автоматизировать добавление друзей на анкету. знаю как через idhttp залогиниться, передавать запросы, парсить... но... как там определять появилась каптча или нет? она ж аяксом подрубается
ВК большинство запросов аяксом делается тебя это не должно волновать, пришел ответ не стандартный и внутри что то типа мд5 хеша это 80% капча оч давно писал софт под ВК для добавления друзей и.т.д Так определял.
Писал как-то для себя давно PHP: function captcha(uns:string):string; var i:integer; begin for i:=1 to 4 do delete(uns,1,pos('<!>',uns)); uns:=pars('<!>',uns,'<!>'); if (length(uns) = 12) and not(pos('_',uns)<>0) then Result:=uns else result:=''; end; Тоесть передаем в функцию исходный код страницы, и если возвратило пустоту то капчи нет, если возвратило цифры то возвратило номер капчи
Дикие у вас методы определения каптчи. Там все проще. Вот копипаста из скрипта ВК : Code: // Process response function var processResponse = function(code, answer) { if (o.cache) { var answ = ajaxCache[cacheKey]; if (answ && answ._loading) { setTimeout(function() { for (var i in answ._callbacks) { answ._callbacks[i](code, answer); } }, 0); delete ajaxCache[cacheKey]; } } if (o.stat) { o.stat = false; statAct = processResponse.pbind(code, answer); return false; } if (o.cache && !o.forceGlobalCache) { if (!code) { ajaxCache[cacheKey] = answer; } } // Parse response if (o.hideProgress) o.hideProgress(); if (code != 2) { if (o._captcha) { if (o._suggest) cleanElems(o._suggest); o._suggest = o._captcha = hideBoxes(o._captcha); } o._box = hideBoxes(o._box); } switch (code) { case 1: // email not confirmed if (ge('confirm_mail')) { showFastBox({ width: 430, title: ge('confirm_mail_title').value, onDestroy: o.onFail }, '<div class="confirm_mail">' + ge('confirm_mail').innerHTML + '</div>'); } else { topMsg('<b>Error!</b> Email is not confirmed!'); } break; case 2: // captcha var resend = function(sid, key) { var nq = extend(q, {captcha_sid: sid, captcha_key: key}); var no = o.cache ? extend(o, {cache: -1}) : o; ajax._post(url, nq, no); } var addText = ''; // if (vk.nophone == 1 && !vk.nomail) { // addText = getLang('global_try_to_activate').replace('{link}', '<a class="phone_validation_link">').replace('{/link}', '</a>'); // addText = '<div class="phone_validation_suggest">' + addText + '</div>'; // } o._captcha = showCaptchaBox(answer[0], intval(answer[1]), o._captcha, { onSubmit: resend, addText: addText, onDestroy: function() { if (o.onFail) o.onFail(); } }); o._suggest = geByClass1('phone_validation_link', o._captcha.bodyNode); if (o._suggest) { addEvent(o._suggest, 'click', function() { o._box = validateMobileBox({onDone: o._captcha.submit}); }); } break; case 11: // mobile validation needed case 12: var no = o.cache ? extend(o, {cache: -1}) : o; o._box = validateMobileBox({acceptCaptcha: (code == 11), onDone: function(sid, key) { vk.nophone = 0; if (sid) o._captcha = curBox(); ajax._post(url, sid ? extend(q, {captcha_sid: sid, captcha_key: key}) : q, no); }, onFail: o.onFail, hash: answer[0]}); break; case 3: // auth failed var no = o.cache ? extend(o, {cache: -1}) : o; window.onReLoginDone = ajax._post.pbind(url, q, no); window.onReLoginFailed = function(toRoot) { if (toRoot) { nav.go('/'); } else { window.onReLoginDone(); } } utilsNode.appendChild(ce('iframe', {src: vk.loginscheme + '://login.vk.com/?al_frame=1&from_host=' + locHost + '&from_protocol=' + locProtocol + '&ip_h=' + (answer[0] || vk.ip_h)})); break; case 4: // redirect if (answer[1]) { // ajax layout redirect nav.go(answer[0], false, {nocur: (answer[1] === '2'), noback: (answer[1] === true) ? true : false, showProgress: o.showProgress, hideProgress: o.hideProgress}); } else { hab.stop(); location.href = answer[0]; } break; case 5: // reload nav.reload({force: intval(answer[0]), from: 1, url: url, query: q && ajx2q(q)}); // force reload break; case 6: // mobile activation needed var no = o.cache ? extend(o, {cache: -1}) : o; o._box = activateMobileBox({onDone: ajax._post.pbind(url, q, no), onFail: o.onFail, hash: answer[0]}); break; case 7: // message if (o.onFail) o.onFail(); topMsg(answer[0], 10); break; case 8: // error if (o.onFail) { if (o.onFail(answer[0])) { return; } } topError(answer[0], {dt: answer[1] ? 0 : 10, type: 4, url: url, query: q && ajx2q(q)}); break; case 9: // votes payment if (o.fromBox) { if (code == -1) { __adsSet(answer.pop()); } if (o.onDone) { // page, box or other o.onDone.apply(window, answer); } break; } o._box = showFastBox(answer[0], answer[1]); var no = extend(clone(o), {showProgress: o._box.showProgress, hideProgress: o._box.hideProgress}); if (o.cache) { no.cache = -1; } o._box = requestBox(o._box, function() { if (isVisible(o._box.progress)) return; ajax._post(url, extend(q, {_votes_ok: 1}), no); }, o.onFail); o._box.evalBox(answer[2]); break; case 10: //zero zone o._box = showFastBox({ title: answer[0] || getLang('global_charged_zone_title'), onHide: o.onFail }, answer[1], getLang('global_charged_zone_continue'), function() { var nq = extend(q, {charged_confirm: answer[3]}); ajax._post(url, nq, o); }, getLang('global_cancel')); break; default: if (code == -1) { __adsSet(answer.pop()); } if (o.onDone) { // page, box or other o.onDone.apply(window, answer); } break; } if (window._updateDebug) _updateDebug(); } То есть, берем ответ(ТОЛЬКО при аяксе), режем ответ на разделители <!> Если частей больше 4 - значит это AL формат, 4-ая часть это код(смотрим исходник скрипта ВК), если код 2 - каптча(5-ая часть если не ошибаюсь код каптчи, 6-ая сложная ли каптча).