delphi vs vk.com captha

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by justonline, 17 Apr 2012.

  1. justonline

    justonline network ninja

    Joined:
    27 Jul 2011
    Messages:
    499
    Likes Received:
    60
    Reputations:
    53
    Доброе время суток всем. Вполне в белых целях хочу автоматизировать добавление друзей на анкету.
    знаю как через idhttp залогиниться, передавать запросы, парсить... но... как там определять появилась каптча или нет? она ж аяксом подрубается
     
  2. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    ВК большинство запросов аяксом делается тебя это не должно волновать, пришел ответ не стандартный и внутри что то типа мд5 хеша это 80% капча оч давно писал софт под ВК для добавления друзей и.т.д
    Так определял.
     
  3. Mr.Snuffer

    Mr.Snuffer Member

    Joined:
    2 Jul 2010
    Messages:
    140
    Likes Received:
    13
    Reputations:
    0
    Юзай апи.
    Там все проще :)
     
  4. justonline

    justonline network ninja

    Joined:
    27 Jul 2011
    Messages:
    499
    Likes Received:
    60
    Reputations:
    53
    погуглил, пример добавления в друзья не нашел. подкинь линку?
     
  5. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Писал как-то для себя давно :)

    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)<>0then  Result:=uns else result:='';
    end;
    Тоесть передаем в функцию исходный код страницы, и если возвратило пустоту то капчи нет, если возвратило цифры то возвратило номер капчи ;)
     
  6. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Дикие у вас методы определения каптчи. Там все проще.

    Вот копипаста из скрипта ВК :
    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-ая сложная ли каптча).