我正在尝试使用 2captcha api 绕过 funcaptcha

问题描述

我一直试图绕过验证码,但所有的努力都是徒劳的。 我不知道触发了哪个功能,因此它继续前进,因为网站上没有提交按钮。 所以只有当有人手动解决它时它才会向前显示挑战完成屏幕。

我被困在注入令牌上。请指导我下一步做什么,因为我是 JavaScript 的菜鸟 这里有几个 javascript 函数,我认为是这一切的原因。 请告诉我如何触发回调函数使其移动到下一页。或完成 Funcaptcha。

谢谢

var loadedCheck = 0;
function getAllUrlParams(e) {
    var t = e ? e.split("?")[1] : window.location.search.slice(1),a = {};
    if (t)
        for (var n = (t = t.split("#")[0]).split("&"),i = 0; i < n.length; i++) {
            var o = n[i].split("="),s = o[0],r = void 0 === o[1] || o[1];
            if (((s = s.toLowerCase()),"string" == typeof r && (r = r.toLowerCase()),s.match(/\[(\d+)?\]$/))) {
                var l = s.replace(/\[(\d+)?\]/,"");
                if ((a[l] || (a[l] = []),s.match(/\[\d+\]$/))) {
                    var c = /\[(\d+)\]/.exec(s)[1];
                    a[l][c] = r;
                } else a[l].push(r);
            } else a[s] ? (a[s] && "string" == typeof a[s] ? ((a[s] = [a[s]]),a[s].push(r)) : a[s].push(r)) : (a[s] = r);
        }
    return a;
}
function loadArkose() {
    var e = getAllUrlParams(window.location.href);
    "xBox_1" === e.uitheme
        ? navigator.__defineGetter__("userAgent",function () {
              return "XBox_Dark";
          })
        : "xBox_2" === e.uitheme
        ? navigator.__defineGetter__("userAgent",function () {
              return "XBox_Light";
          })
        : "win8wiz" === e.uitheme &&
          navigator.__defineGetter__("userAgent",function () {
              return "Win8Wiz";
          });
    var t = window.location.pathname.split("/"),a = new ArkoseEnforcement({
            public_key: t[1],language: e.mkt,target_html: "arkose",callback: function () {
                parent.postMessage(JSON.stringify({ eventId: "challenge-complete",payload: { sessionToken: a.getSessionToken() } }),"*");
            },loaded_callback: function () {
                (frameHeight = document.getElementById("fc-iframe-wrap").offsetHeight),(frameWidth = document.getElementById("fc-iframe-wrap").offsetWidth),"xBox_1" === e.uitheme || "xBox_2" === e.uitheme ? a.enableDirectionalinput() : e.uitheme,parent.postMessage(JSON.stringify({ eventId: "challenge-loaded",payload: { sessionToken: a.getSessionToken(),frameHeight: frameHeight,frameWidth: frameWidth } }),"*"),(loadedCheck = 1);
            },onsuppress: function () {
                parent.postMessage(JSON.stringify({ eventId: "challenge-suppressed",onshown: function () {
                parent.postMessage(JSON.stringify({ eventId: "challenge-shown",});
}
window.addEventListener("message",function (e) {
    try {
        JSON.parse(e.data);
    } catch (e) {
        return;
    }
    var t = JSON.parse(e.data);
    switch (t.eventId) {
        case "challenge-left":
        case "challenge-right":
        case "challenge-down":
        case "challenge-up":
        case "challenge-proceed":
            window.dispatchEvent(new CustomEvent("FunCaptcha-action",{ detail: { action: t.payload.action } }));
    }
});
var interval = setInterval(function () {
    (frameHeight = document.getElementById("fc-iframe-wrap").offsetHeight),1 == loadedCheck && parent.postMessage(JSON.stringify({ eventId: "challenge-iframeSize",payload: { frameHeight: frameHeight,"*");
},3e3);

解决方法

好吧,在尝试了很多之后,我无法找到解决方案,但突然 anti-captcha api 服务更新了那里的扩展。

所以这个方法对我有用。

  1. 在 anti-captcha.com 上注册并获取 api

  2. 从此页面下载扩展程序 Download 并设置名称 anticaptcha

  3. 通过此代码段为您的 selenium 代码添加扩展。

      co = Options()
      co.add_extension(os.path.abspath('anticaptcha.crx'))
      driver = webdriver.Chrome(options=co)
    
  4. 现在定义将 api 密钥注入扩展的函数。

    def acp_api_send_request(driver,message_type,data={}):
         message = {
             'receiver': 'antiCaptchaPlugin',# request type,for example setOptions
             'type': message_type,# merge with additional data
             **data
             }
    
    
              return driver.execute_script("""
              return window.postMessage({});
              """.format(json.dumps(message)))
    
  5. 现在在加载您想要解决验证码的网站之前,首先加载任何网站,以便可以正确注入 api。像这样调用上面的函数。将您的 api 密钥替换为 Your_API_KEY_HERE 文本。

       acp_api_send_request(
            driver,'setOptions',{'options': {'antiCaptchaApiKey': 
            'Your_API_KEY_HERE'}}
    
        )
    
  6. 现在一切都很完美,当验证码加载脚本时,脚本会自动检测并解决它并提交表单。

快乐编码..