问题描述
我一直试图绕过验证码,但所有的努力都是徒劳的。 我不知道触发了哪个功能,因此它继续前进,因为网站上没有提交按钮。 所以只有当有人手动解决它时它才会向前显示挑战完成屏幕。
我被困在注入令牌上。请指导我下一步做什么,因为我是 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 服务更新了那里的扩展。
所以这个方法对我有用。
-
在 anti-captcha.com 上注册并获取 api
-
从此页面下载扩展程序 Download 并设置名称 anticaptcha
-
通过此代码段为您的 selenium 代码添加扩展。
co = Options() co.add_extension(os.path.abspath('anticaptcha.crx')) driver = webdriver.Chrome(options=co)
-
现在定义将 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)))
-
现在在加载您想要解决验证码的网站之前,首先加载任何网站,以便可以正确注入 api。像这样调用上面的函数。将您的 api 密钥替换为 Your_API_KEY_HERE 文本。
acp_api_send_request( driver,'setOptions',{'options': {'antiCaptchaApiKey': 'Your_API_KEY_HERE'}} )
-
现在一切都很完美,当验证码加载脚本时,脚本会自动检测并解决它并提交表单。
快乐编码..