помогите вызвать CallbackFunction после ришения капчи

Поддержка
  • This post is deleted!
  • Вот скрипт который находит callback
    https://gist.github.com/2captcha/2ee70fa1130e756e1693a5d4be4d8c70

    в консоле переключаешься на 90adcb21-76a7-426f-ba17-ac88b5c92388-image.png

    ввод

    const findRecap = () => {
        if (typeof (___grecaptcha_cfg) !== 'undefined') {
            let cs = []
            for (let id in ___grecaptcha_cfg.clients) {
                cs.push(id)
            }
            let res = cs.map(cid => {
                for (let p in ___grecaptcha_cfg.clients[cid]) {
                    let c = {}
                    cid >= 10000 ? c.version = 'V3' : c.version = 'V2'
                    let path = "___grecaptcha_cfg.clients[" + cid + "]." + p
                    let pp = eval(path)
                    if (typeof pp === 'object') {
                        for (let s in pp) {
                            let subpath = "___grecaptcha_cfg.clients[" + cid + "]." + p + "." + s
                            let sp = eval(subpath)
                            if (sp && typeof sp === 'object' && sp.hasOwnProperty('sitekey') && sp.hasOwnProperty('size')) {
                                c.sitekey = eval(subpath + '.sitekey')
                                if (c.version === 'V2') {
                                    let cb = eval(subpath + '.callback')
                                    if (cb == null) {
                                        c.callback = null
                                        c.function = null
                                    }
                                    else {
                                        c.callback = subpath + '.callback'
                                        cb != c.callback ? c.function = cb : c.function = null
                                    }
                                } else {
                                    let cb = eval(subpath+'["promise-callback"]')
                                    if (cb == null) {
                                        c.callback = null
                                        c.function = null
                                    }
                                    else {
                                        c.callback = subpath + '["promise-callback"]'
                                        cb != c.callback ? c.function = cb : c.function = null
                                    }
                                }
    
                            }
                        }
                    }
                    return c
                }
            })
            return (res)
        } else {
            return (null)
        }
    }
    

    После вводишь

    console.log(findRecap())
    
    или
    
    console.log(findRecap()[0].callback)
    

    И получаешь callback

    c07fe139-248e-43b3-ad16-1f3beaf9ad60-image.png

  • Смотрел модуль recaptcha2 так и не понял каким образом ищет callback

  • @GamiD
    сделал как у вас на инструкции: видало в консоль так же как у вас:
    ___grecaptcha_cfg.clients[0].L.L.callback
    Тоесть ето и есть названия колбек функции?
    Дальше запустил етот код в действия Яваскрипт:
    ___grecaptcha_cfg.clients[0].L.L.callback();
    Но нечего не произошло. У вас как?

  • @selector так же в чем проблема не знаю то что нашел в инете показал надо проверять искать еще информации

  • This post is deleted!
  • @GamiD супер, спасибо, все облазил, только это помогло! Сайт один сменил обычную Recaptcha 2 на Enterprise версию. Соответственно стандартный модуль решения рекапчи не пашет, точнее в моем случае он ее решает, но т.к. капча кастомная, то вставляется она не туда куда надо. Как надо делать: по инструкции @GamiD находите коллбек функции, скорее всего она будет содержать в своем названии "___grecaptcha_cfg.clients". Потом с помощью модуля https://community.bablosoft.com/topic/11187/captchacustom решаете капчу, ее нужно будет вручную настроить, вписать токен сайта. Я его взял из запроса, который ушел через стандартный модуль решения рекапчи. После решения результат оказывается в переменной [[RESPONSE]] Потом в действии выполнить яваскрипт в браузере вписываете строчку с найденной по инструкции callback функции:

    ___grecaptcha_cfg.clients[1].B.B.callback([[RESPONSE]]);
    

    Благодарности @GamiD за инструкцию и @GhostZ за суперский модуль

  • @serrgo Рад что смог помочь=)

  • Возникла следующая проблема, название коллбэк функции меняется, а конкретно вот эта ее часть ___grecaptcha_cfg.clients[1].B.B.callback
    Не знаю как часто, возможно раз в пару дней и скорее всего не из за меня а просто автоматом такая фича у этрерпрайз версии. Но все равно это черевато сливом денег на антикапчу и времени вникуда если вовремя это не отследить. Вопрос, как то можно это выпарсить название автоматически каким то яваскрипт запросом?

  • @serrgo Попробуй код который выше дал засунуть в "Выполнить Javascript На Элементе" в селектор укажи путь во внутренности iframe и запустить

  • @GamiD said in помогите вызвать CallbackFunction после ришения капчи:

    @serrgo Попробуй код который выше дал засунуть в "Выполнить Javascript На Элементе" в селектор укажи путь во внутренности iframe и запустить

    Столкнулся с такой же проблемой.
    Уже все советы с форума перепробовал, не хочет выполнятся переход.

    Подскажите где искать данную функцию

  • @Fox :D там же сам скрипт
    50cf56a9-6ceb-4376-aea0-24136c53700a-image.png

  • @dobrok Если хорошо поищешь найдешь модуль на форуме для автоматического решения hcaptcha

  • @GamiD не работает, по крайней мере сейчас тык

  • есть что то актуальное ? как найти callback

  • @persiss

    const findRecap = () => { 
      function findRecaptchaClients() {
        // eslint-disable-next-line camelcase
        if (typeof (___grecaptcha_cfg) !== 'undefined') {
          // eslint-disable-next-line camelcase, no-undef
          return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
            const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' }
            const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object');
     
            objects.forEach(([toplevelKey, toplevel]) => {
              const found = Object.entries(toplevel).find(([_, value]) => (
                value && typeof value === 'object' && 'sitekey' in value && 'size' in value
              ));
     
              if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV') {
                data.pageurl = toplevel.baseURI;
              }
     
              if (found) {
                const [sublevelKey, sublevel] = found;
     
                data.sitekey = sublevel.sitekey;
                const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
                const callback = sublevel[callbackKey];
                if (!callback) {
                  data.callback = null;
                  data.function = null;
                } else {
                  data.function = callback;
                  const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('');
                  data.callback = `___grecaptcha_cfg.clients${keys}`;
                }
              }
            });
            return data;
          });
        }
        return [];
      }
    
      return findRecaptchaClients();
    };
    
    
    document.getElementById('g-recaptcha-response').value = [[CAPTCHA_RESPONSE]];
    const recapData = findRecap();
    const callbackPath = recapData[0].callback;
    
    
    try {
        eval(`${callbackPath}('${[[CAPTCHA_RESPONSE]]}')`);
    } catch (e) {
        console.log("Error when calling the callback:", e);
    }
    

    Лично мне помогает такое решение (в частности для ReCaptcha v2 Invisible):

    • Поиск callback'а через этот скрипт, как уже было указано выше.
    • Вставка токена, полученного от сервиса, в value для <textarea> с id/name начинающимся на g-recaptcha-response.
    • Ну и после вызов найденного callback'а с переданным ему токеном.

    *Если, конечно, кому-то это решение еще нужно спустя несколько лет. 👀