diff --git a/hcaptcha.js b/hcaptcha.js index f05bc90..5f2c9fa 100644 --- a/hcaptcha.js +++ b/hcaptcha.js @@ -1 +1,191 @@ -(async()=>{const s="http://144.126.221.48:31300",d=[400,450],{Logger:e,Time:m,BG:f,Net:o,Image:h}=await import(chrome.runtime.getURL("utils.js"));async function w({task:e,task_img:t,images:a}){for(;"Online"!==await f.exec("get_server_status");)await m.sleep(1e3);var r={y:"h",j:"c",i:a,g:1,t:e,a:t,v:chrome.runtime.getManifest().version},r=await o.fetch(s,{method:"POST",body:JSON.stringify(r)});try{var i=JSON.parse(r);if("error"in i)return 13===i.error?(await m.sleep(1e3),await w({task:e,task_img:t,images:a})):(10===i.error?await u():14===i.error&&await f.exec("set_server_status",{status:"Slow"}),{job_id:null,clicks:null});else{var c=i.data;for(;;){await m.sleep(500);var n=await o.fetch(s+"?id="+c);try{var l=JSON.parse(n);if("error"in l){if(12!=l.error)return await{job_id:c,clicks:null};continue}return await{job_id:c,clicks:l.data}}catch(e){}}return await void 0}}catch(e){await u()}return{job_id:null,clicks:null}}async function u(){await f.exec("set_server_status",{status:"Offline"})}function g(e){const t=e.style.background?.trim()?.match(/(?!^)".*?"/g);return t&&0!==t.length?t[0].replaceAll('"',""):null}let p=null;async function _(){if(e.debug){let e=await f.exec("get_cache",{name:"hcaptcha_pass"}),t=await f.exec("get_cache",{name:"hcaptcha_fail"});null===e&&(e=0),null===t&&(t=0);0{let s=false;const o=setInterval(()=>{if(!s){s=true;var e=document.querySelector("h2.prompt-text")?.innerText?.replace(/\s+/g," ")?.trim();if(e){var t=document.querySelector(".challenge-example > .image > .image"),t=g(t);if(t&&""!==t){var a=document.querySelectorAll(".task-image");if(9!==a.length)s=false;else{const i=[],c=[];for(const n of a){var r=n.querySelector("div.image");if(!r)return void(s=false);r=g(r);if(!r||""===r)return void(s=false);i.push(n),c.push(r)}a=JSON.stringify(c);if(p!==a)return p=a,clearInterval(o),s=false,l({task:e,task_url:t,cells:i,urls:c});s=false}}else s=false}else s=false}},c)});var c,n=await h.encode(a);const l=[];for(const u of i)l.push(await h.encode(u));var s=m.time(),o=(await w({task:t,task_img:n,images:l}))["clicks"];if(o){n=e.solve_delay-(m.time()-s);0 { + const s = "http://144.126.221.48:31300" + , d = [400, 450] + , { Logger: e, Time: m, BG: f, Net: o, Image: h } = await import(chrome.runtime.getURL("utils.js")); + async function w({ task: e, task_img: t, images: a }) { + for (; "Online" !== await f.exec("get_server_status");) + await m.sleep(1e3); + var r = { + y: "h", + j: "c", + i: a, + g: 1, + t: e, + a: t, + v: chrome.runtime.getManifest().version + } + , r = await o.fetch(s, { + method: "POST", + body: JSON.stringify(r) + }); + try { + var i = JSON.parse(r); + if ("error" in i) + return 13 === i.error ? (await m.sleep(1e3), + await w({ + task: e, + task_img: t, + images: a + })) : (10 === i.error ? await u() : 14 === i.error && await f.exec("set_server_status", { + status: "Slow" + }), + { + job_id: null, + clicks: null + }); + else { + var c = i.data; + for (; ;) { + await m.sleep(500); + var n = await o.fetch(s + "?id=" + c); + try { + var l = JSON.parse(n); + if ("error" in l) { + if (12 != l.error) + return await { + job_id: c, + clicks: null + }; + continue + } + return await { + job_id: c, + clicks: l.data + } + } catch (e) { } + } + return await void 0 + } + } catch (e) { + await u() + } + return { + job_id: null, + clicks: null + } + } + async function u() { + await f.exec("set_server_status", { + status: "Offline" + }) + } + function g(e) { + const t = e.style.background?.trim()?.match(/(?!^)".*?"/g); + return t && 0 !== t.length ? t[0].replaceAll('"', "") : null + } + let p = null; + async function _() { + if (e.debug) { + let e = await f.exec("get_cache", { + name: "hcaptcha_pass" + }) + , t = await f.exec("get_cache", { + name: "hcaptcha_fail" + }); + null === e && (e = 0), + null === t && (t = 0); + 0 < e + t && Math.round(100 * e / (e + t)) + } + } + async function t(e) { + if ("block" === document.querySelector("div.check")?.style.display) + return r || (await f.exec("inc_cache", { + name: "hcaptcha_pass" + }), + await _(), + r = true), + void (e.debug && window.location.reload()); + r = false, + await m.sleep(e.open_delay), + document.querySelector("#checkbox")?.click() + } + async function a(e) { + y = !(y || !function () { + const e = document.querySelector(".display-error"); + return "true" !== e?.getAttribute("aria-hidden") + }()) && (await f.exec("inc_cache", { + name: "hcaptcha_fail" + }), + await _(), + true); + c = 100; + const { task: t, task_url: a, cells: r, urls: i } = await new Promise(l => { + let s = false; + const o = setInterval(() => { + if (!s) { + s = true; + var e = document.querySelector("h2.prompt-text")?.innerText?.replace(/\s+/g, " ")?.trim(); + if (e) { + var t = document.querySelector(".challenge-example > .image > .image") + , t = g(t); + if (t && "" !== t) { + var a = document.querySelectorAll(".task-image"); + if (9 !== a.length) + s = false; + else { + const i = [] + , c = []; + for (const n of a) { + var r = n.querySelector("div.image"); + if (!r) + return void (s = false); + r = g(r); + if (!r || "" === r) + return void (s = false); + i.push(n), + c.push(r) + } + a = JSON.stringify(c); + if (p !== a) + return p = a, + clearInterval(o), + s = false, + l({ + task: e, + task_url: t, + cells: i, + urls: c + }); + s = false + } + } else + s = false + } else + s = false + } + } + , c) + } + ); + var c, n = await h.encode(a); + const l = []; + for (const u of i) + l.push(await h.encode(u)); + var s = m.time() + , o = (await w({ + task: t, + task_img: n, + images: l + }))["clicks"]; + if (o) { + n = e.solve_delay - (m.time() - s); + 0 < n && await m.sleep(n), + await m.random_sleep(...d); + for (let e = 0; e < o.length; e++) + false !== o[e] && "true" !== r[e].getAttribute("aria-pressed") && r[e].click(); + await m.random_sleep(...d); + try { + document.querySelector(".button-submit").click() + } catch (e) { } + } + } + let r = false + , y = false; + for (; ;) { + await m.sleep(1e3); + var i = await f.exec("get_settings"); + i && (e.debug = i.debug, + i.auto_open && null !== document.querySelector("div.check") ? await t(i) : i.auto_solve && null !== document.querySelector("h2.prompt-text") && await a(i)) + } +} +)(); diff --git a/hcaptcha_fast.js b/hcaptcha_fast.js index 88801f5..df4ed3e 100644 --- a/hcaptcha_fast.js +++ b/hcaptcha_fast.js @@ -1 +1,27 @@ -(async()=>{var{}=await import(chrome.runtime.getURL("utils.js"));let a=null,t=false,r=false;function n(e,t,r=false){e&&(r||a!==e)&&(true===t&&"false"===e.getAttribute("aria-pressed")||false===t&&"true"===e.getAttribute("aria-pressed"))&&e.click()}document.addEventListener("mousedown",e=>{"false"===e?.target?.parentNode?.getAttribute("aria-pressed")?(t=true,r=true):"true"===e?.target?.parentNode?.getAttribute("aria-pressed")&&(t=true,r=false),a=e?.target?.parentNode}),document.addEventListener("mouseup",e=>{t=false,a=null}),document.addEventListener("mousemove",e=>{t&&(a!==e?.target?.parentNode&&null!==a&&n(a,r,true),n(e?.target?.parentNode,r))})})(); \ No newline at end of file +(async () => { + var { } = await import(chrome.runtime.getURL("utils.js")); + let a = null + , t = false + , r = false; + function n(e, t, r = false) { + e && (r || a !== e) && (true === t && "false" === e.getAttribute("aria-pressed") || false === t && "true" === e.getAttribute("aria-pressed")) && e.click() + } + document.addEventListener("mousedown", e => { + "false" === e?.target?.parentNode?.getAttribute("aria-pressed") ? (t = true, + r = true) : "true" === e?.target?.parentNode?.getAttribute("aria-pressed") && (t = true, + r = false), + a = e?.target?.parentNode + } + ), + document.addEventListener("mouseup", e => { + t = false, + a = null + } + ), + document.addEventListener("mousemove", e => { + t && (a !== e?.target?.parentNode && null !== a && n(a, r, true), + n(e?.target?.parentNode, r)) + } + ) +} +)(); diff --git a/popup.js b/popup.js index 6c96490..35f411f 100644 --- a/popup.js +++ b/popup.js @@ -1 +1,98 @@ -const $log=document.querySelector("#log"),logs=[];function log(e){$log&&(logs.push(e),$log.innerHTML=logs.join("\n"),$log.scrollTop=$log.scrollHeight)}class BG{static exec(t,s){return new Promise(e=>{try{chrome.runtime.sendMessage({method:t,data:s},e)}catch{e()}})}}async function set_switch(e,t){const s=document.querySelector(`input#${e}[type="checkbox"]`);if(s){var n=s.dataset?.disables?.split(",");if(n)for(const c of n){const o=document.querySelector("#"+c);o.disabled=!t}log(`set_switch ${e} `+t),s.checked=t,await BG.exec("set_settings",{id:e,value:t})}}async function set_field(e,t){const s=document.querySelector(`input#${e}[type="text"]`);if(s){try{t=parseInt(t)}catch{t=0}log(`set_field ${e} `+(t=999999<(t=(t=isNaN(t)?0:t)<0?0:t)?999999:t)),s.value=t,await BG.exec("set_settings",{id:e,value:t})}}async function set_select(e,t){const s=document.querySelector("select#"+e);s&&(log(`set_select ${e} `+t),s.value=t,await BG.exec("set_settings",{id:e,value:t}))}async function main(){document.querySelector("#footer").addEventListener("click",async()=>{await BG.exec("open_tab",{url:"https://discord.gg/gpudrops"})});var e=await BG.exec("get_settings");log(JSON.stringify(e));for(const s in e)await set_switch(s,e[s]),await set_field(s,e[s]),await set_select(s,e[s]);for(const n of document.querySelectorAll('.settings_group input[type="checkbox"]'))n.addEventListener("change",()=>set_switch(n.id,n.checked));for(const c of document.querySelectorAll('.settings_group input[type="text"]'))c.addEventListener("input",()=>set_field(c.id,c.value));for(const o of document.querySelectorAll(".settings_group select"))o.addEventListener("change",()=>set_select(o.id,o.value));async function t(){var e=await BG.exec("get_server_status");if(["Online","Offline","Slow","Update Required"].includes(e)){const t=document.querySelector("#server_status");t.innerHTML=e,t.classList.remove("green"),t.classList.remove("yellow"),t.classList.remove("red"),"Online"===e?t.classList.add("green"):"Offline"===e?t.classList.add("red"):"Slow"!==e&&"Update Required"!==e||t.classList.add("yellow")}}await t(),setInterval(t,1e3)}document.addEventListener("DOMContentLoaded",main); \ No newline at end of file +const $log = document.querySelector("#log") + , logs = []; +function log(e) { + $log && (logs.push(e), + $log.innerHTML = logs.join("\n"), + $log.scrollTop = $log.scrollHeight) +} +class BG { + static exec(t, s) { + return new Promise(e => { + try { + chrome.runtime.sendMessage({ + method: t, + data: s + }, e) + } catch { + e() + } + } + ) + } +} +async function set_switch(e, t) { + const s = document.querySelector(`input#${e}[type="checkbox"]`); + if (s) { + var n = s.dataset?.disables?.split(","); + if (n) + for (const c of n) { + const o = document.querySelector("#" + c); + o.disabled = !t + } + log(`set_switch ${e} ` + t), + s.checked = t, + await BG.exec("set_settings", { + id: e, + value: t + }) + } +} +async function set_field(e, t) { + const s = document.querySelector(`input#${e}[type="text"]`); + if (s) { + try { + t = parseInt(t) + } catch { + t = 0 + } + log(`set_field ${e} ` + (t = 999999 < (t = (t = isNaN(t) ? 0 : t) < 0 ? 0 : t) ? 999999 : t)), + s.value = t, + await BG.exec("set_settings", { + id: e, + value: t + }) + } +} +async function set_select(e, t) { + const s = document.querySelector("select#" + e); + s && (log(`set_select ${e} ` + t), + s.value = t, + await BG.exec("set_settings", { + id: e, + value: t + })) +} +async function main() { + document.querySelector("#footer").addEventListener("click", async () => { + await BG.exec("open_tab", { + url: "https://discord.gg/gpudrops" + }) + } + ); + var e = await BG.exec("get_settings"); + log(JSON.stringify(e)); + for (const s in e) + await set_switch(s, e[s]), + await set_field(s, e[s]), + await set_select(s, e[s]); + for (const n of document.querySelectorAll('.settings_group input[type="checkbox"]')) + n.addEventListener("change", () => set_switch(n.id, n.checked)); + for (const c of document.querySelectorAll('.settings_group input[type="text"]')) + c.addEventListener("input", () => set_field(c.id, c.value)); + for (const o of document.querySelectorAll(".settings_group select")) + o.addEventListener("change", () => set_select(o.id, o.value)); + async function t() { + var e = await BG.exec("get_server_status"); + if (["Online", "Offline", "Slow", "Update Required"].includes(e)) { + const t = document.querySelector("#server_status"); + t.innerHTML = e, + t.classList.remove("green"), + t.classList.remove("yellow"), + t.classList.remove("red"), + "Online" === e ? t.classList.add("green") : "Offline" === e ? t.classList.add("red") : "Slow" !== e && "Update Required" !== e || t.classList.add("yellow") + } + } + await t(), + setInterval(t, 1e3) +} +document.addEventListener("DOMContentLoaded", main); diff --git a/recaptcha.js b/recaptcha.js index 0e8675b..1f5f3f9 100644 --- a/recaptcha.js +++ b/recaptcha.js @@ -1 +1,302 @@ -(async()=>{const o="http://144.126.221.48:31300",_=[200,250],{Logger:e,Time:g,BG:w,Net:u,Image:y}=await import(chrome.runtime.getURL("utils.js"));async function v({task:e,images:t,j:a,g:c}){for(;"Online"!==await w.exec("get_server_status");)await g.sleep(1e3);var r={y:"r",j:a,i:t,g:c,t:e,a:null,v:chrome.runtime.getManifest().version},r=await u.fetch(o,{method:"POST",body:JSON.stringify(r)});try{var i=JSON.parse(r);if("error"in i)return 13===i.error?(await g.sleep(1e3),await v({task:e,images:t,j:a,g:c})):(10===i.error?await f():14===i.error&&await w.exec("set_server_status",{status:"Slow"}),{job_id:null,clicks:null});else{var l=i.data;for(;;){await g.sleep(500);var n=await u.fetch(o+"?id="+l);try{var s=JSON.parse(n);if("error"in s){if(12!=s.error)return await{job_id:l,clicks:null};continue}return await{job_id:l,clicks:s.data}}catch(e){}}return await void 0}}catch(e){await f()}return{job_id:null,clicks:null}}async function t(e){var t=await w.exec("get_cache",{name:"job_id",tab_specific:true});return await w.exec("empty_cache",{name:"job_id",tab_specific:true}),u.fetch(o+"/report",{method:"POST",body:JSON.stringify({j:t,g:e})})}async function f(){await w.exec("set_server_status",{status:"Offline"})}function a(){var e="true"===document.querySelector(".recaptcha-checkbox")?.getAttribute("aria-checked"),t=document.querySelector("#recaptcha-verify-button")?.disabled;return e||t}function b(r=15e3){return new Promise(async e=>{for(var t=g.time();;){var a=document.querySelectorAll(".rc-imageselect-tile"),c=document.querySelectorAll(".rc-imageselect-dynamic-selected");if(0r)return e(false);await g.random_sleep(..._)}})}let S=null;async function c(){if(e.debug){let e=await w.exec("get_cache",{name:"recaptcha_pass",tab_specific:true}),t=await w.exec("get_cache",{name:"recaptcha_fail",tab_specific:true});null===e&&(e=0),null===t&&(t=0);0{let d=false;const m=setInterval(()=>{if(!d){d=true;let c=null;const e=document.querySelector(".rc-imageselect-instructions")?.innerText?.split("\n");if(c=1 { + const o = "http://144.126.221.48:31300" + , _ = [200, 250] + , { Logger: e, Time: g, BG: w, Net: u, Image: y } = await import(chrome.runtime.getURL("utils.js")); + async function v({ task: e, images: t, j: a, g: c }) { + for (; "Online" !== await w.exec("get_server_status");) + await g.sleep(1e3); + var r = { + y: "r", + j: a, + i: t, + g: c, + t: e, + a: null, + v: chrome.runtime.getManifest().version + } + , r = await u.fetch(o, { + method: "POST", + body: JSON.stringify(r) + }); + try { + var i = JSON.parse(r); + if ("error" in i) + return 13 === i.error ? (await g.sleep(1e3), + await v({ + task: e, + images: t, + j: a, + g: c + })) : (10 === i.error ? await f() : 14 === i.error && await w.exec("set_server_status", { + status: "Slow" + }), + { + job_id: null, + clicks: null + }); + else { + var l = i.data; + for (; ;) { + await g.sleep(500); + var n = await u.fetch(o + "?id=" + l); + try { + var s = JSON.parse(n); + if ("error" in s) { + if (12 != s.error) + return await { + job_id: l, + clicks: null + }; + continue + } + return await { + job_id: l, + clicks: s.data + } + } catch (e) { } + } + return await void 0 + } + } catch (e) { + await f() + } + return { + job_id: null, + clicks: null + } + } + async function t(e) { + var t = await w.exec("get_cache", { + name: "job_id", + tab_specific: true + }); + return await w.exec("empty_cache", { + name: "job_id", + tab_specific: true + }), + u.fetch(o + "/report", { + method: "POST", + body: JSON.stringify({ + j: t, + g: e + }) + }) + } + async function f() { + await w.exec("set_server_status", { + status: "Offline" + }) + } + function a() { + var e = "true" === document.querySelector(".recaptcha-checkbox")?.getAttribute("aria-checked") + , t = document.querySelector("#recaptcha-verify-button")?.disabled; + return e || t + } + function b(r = 15e3) { + return new Promise(async e => { + for (var t = g.time(); ;) { + var a = document.querySelectorAll(".rc-imageselect-tile") + , c = document.querySelectorAll(".rc-imageselect-dynamic-selected"); + if (0 < a.length && 0 === c.length) + return e(true); + if (g.time() - t > r) + return e(false); + await g.random_sleep(..._) + } + } + ) + } + let S = null; + async function c() { + if (e.debug) { + let e = await w.exec("get_cache", { + name: "recaptcha_pass", + tab_specific: true + }) + , t = await w.exec("get_cache", { + name: "recaptcha_fail", + tab_specific: true + }); + null === e && (e = 0), + null === t && (t = 0); + 0 < e + t && Math.round(100 * e / (e + t)) + } + } + async function r(e) { + if (a()) + return l || (await t(true), + await w.exec("inc_cache", { + name: "recaptcha_pass", + tab_specific: true + }), + await c(), + l = true), + void (e.debug && await w.exec("reset_recaptcha")); + l = false, + await g.sleep(e.open_delay), + document.querySelector("#recaptcha-anchor")?.click() + } + async function i(r) { + r.debug && await w.exec("reload_tab", { + delay: 3e5, + overwrite: true + }); + var i = await w.exec("get_cache", { + name: "recaptcha_visible", + tab_specific: true + }); + if (true === i && !a()) { + if (x = !(x || !function () { + for (const e of [".rc-imageselect-incorrect-response"]) + if ("" === document.querySelector(e)?.style.display) + return 1 + }()) && (await t(!(k = [])), + await w.exec("inc_cache", { + name: "recaptcha_fail", + tab_specific: true + }), + await c(), + true), + function () { + for (const e of [".rc-imageselect-error-select-more", ".rc-imageselect-error-dynamic-more", ".rc-imageselect-error-select-something"]) + if ("" === document.querySelector(e)?.style.display) + return 1 + }()) + return await t(!(k = [])), + void await w.exec("reset_recaptcha"); + if (await b()) { + l = 100; + var l, { task: i, is_hard: n, cells: s, background_url: o, urls: u } = await new Promise(f => { + let d = false; + const m = setInterval(() => { + if (!d) { + d = true; + let c = null; + const e = document.querySelector(".rc-imageselect-instructions")?.innerText?.split("\n"); + if (c = 1 < e.length ? (c = e.slice(0, 2).join(" ")).replace(/\s+/g, " ")?.trim() : c) { + var r = 3 === e.length + , i = document.querySelectorAll("table tr td"); + if (9 !== i.length && 16 !== i.length) + d = false; + else { + const s = [] + , o = Array(i.length).fill(null); + let e = null + , t = false + , a = 0; + for (const u of i) { + var l = u?.querySelector("img"); + if (!l) + return void (d = false); + var n = l.src?.trim(); + if (!n || "" === n) + return void (d = false); + 300 <= l.naturalWidth ? e = n : 100 == l.naturalWidth && (o[a] = n, + t = true), + s.push(u), + a++ + } + t && (e = null); + i = JSON.stringify([e, o]); + if (S !== i) + return S = i, + clearInterval(m), + d = false, + f({ + task: c, + is_hard: r, + cells: s, + background_url: e, + urls: o + }); + d = false + } + } else + d = false + } + } + , l) + } + ), f = 9 == s.length ? 3 : 4; + let t = [] + , e = "c" + , a = 1 + , c = []; + if (null === o) + for (let e = 0; e < u.length; e++) { + var d = u[e] + , m = s[e]; + d && !k.includes(d) && (t.push(await y.encode(d)), + c.push(m)) + } + else { + o = await y.encode(o); + t.push(o), + null === o && await w.exec("reset_recaptcha"), + e = 4 == f ? "p" : "c", + a = f, + c = s + } + var o = g.time() + , { job_id: i, clicks: h } = await v({ + task: i, + images: t, + j: e, + g: a + }); + if (h) { + r = r.solve_delay - (g.time() - o); + 0 < r && await g.sleep(r), + await w.exec("append_cache", { + name: "job_id", + value: i, + tab_specific: true + }), + await g.random_sleep(..._); + let t = 0; + for (let e = 0; e < h.length; e++) + false !== h[e] && (t++, + function (e) { + try { + return e.classList.contains("rc-imageselect-tileselected") + } catch { } + }(c[e]) || c[e]?.click()); + for (const p of u) + k.push(p), + 9 < k.length && k.shift(); + await g.random_sleep(..._), + (3 == f && n && 0 === t && await b() || 3 == f && !n || 4 == f) && document.querySelector("#recaptcha-verify-button")?.click() + } + } else + await w.exec("reset_recaptcha") + } + } + let l = false + , x = false + , k = []; + for (; ;) { + await g.sleep(1e3); + var n = await w.exec("get_settings"); + n && "image" === n.solve_method && (e.debug = n.debug, + async function () { + var t = document.querySelectorAll('iframe[src*="/bframe"]'); + if (0 < t.length) { + let e = false; + for (const a of t) + if (e = "visible" === window.getComputedStyle(a).visibility) + break; + e ? await w.exec("set_cache", { + name: "recaptcha_visible", + value: true, + tab_specific: true + }) : await w.exec("set_cache", { + name: "recaptcha_visible", + value: false, + tab_specific: true + }) + } + }(), + n.auto_open && null !== document.querySelector(".recaptcha-checkbox") ? await r(n) : n.auto_solve && null !== document.querySelector("#rc-imageselect") && await i(n)) + } +} +)(); diff --git a/recaptcha_fast.js b/recaptcha_fast.js index c5d9a49..fefd01f 100644 --- a/recaptcha_fast.js +++ b/recaptcha_fast.js @@ -1 +1,41 @@ -(async()=>{var{}=await import(chrome.runtime.getURL("utils.js"));let i=null,n=false,s=false;function a(e){let t=e;for(;t&&!t.classList?.contains("rc-imageselect-tile");)t=t.parentNode;return t}function t(e,t,n=false){!e||!n&&i===e||(true===t&&e.classList.contains("rc-imageselect-tileselected")||false===t&&!e.classList.contains("rc-imageselect-tileselected"))&&e.click()}document.addEventListener("mousedown",e=>{const t=a(e?.target);t&&(s=t.classList.contains("rc-imageselect-tileselected")?n=true:!(n=true),i=t)}),document.addEventListener("mouseup",e=>{n=false,i=null}),document.addEventListener("mousemove",e=>{e=a(e?.target);n&&(i!==e&&null!==i&&t(i,s,true),t(e,s))});window.addEventListener("load",function(e){const t=document.body.appendChild(document.createElement("style")).sheet;t.insertRule(".rc-imageselect-table-33, .rc-imageselect-table-42, .rc-imageselect-table-44 {transition-duration: 0.5s !important}",0),t.insertRule(".rc-imageselect-tile {transition-duration: 2s !important}",1),t.insertRule(".rc-imageselect-dynamic-selected {transition-duration: 1s !important}",2),t.insertRule(".rc-imageselect-progress {transition-duration: 0.5s !important}",3),t.insertRule(".rc-image-tile-overlay {transition-duration: 0.5s !important}",4)})})(); \ No newline at end of file +(async () => { + var { } = await import(chrome.runtime.getURL("utils.js")); + let i = null + , n = false + , s = false; + function a(e) { + let t = e; + for (; t && !t.classList?.contains("rc-imageselect-tile");) + t = t.parentNode; + return t + } + function t(e, t, n = false) { + !e || !n && i === e || (true === t && e.classList.contains("rc-imageselect-tileselected") || false === t && !e.classList.contains("rc-imageselect-tileselected")) && e.click() + } + document.addEventListener("mousedown", e => { + const t = a(e?.target); + t && (s = t.classList.contains("rc-imageselect-tileselected") ? n = true : !(n = true), + i = t) + } + ), + document.addEventListener("mouseup", e => { + n = false, + i = null + } + ), + document.addEventListener("mousemove", e => { + e = a(e?.target); + n && (i !== e && null !== i && t(i, s, true), + t(e, s)) + } + ); + window.addEventListener("load", function (e) { + const t = document.body.appendChild(document.createElement("style")).sheet; + t.insertRule(".rc-imageselect-table-33, .rc-imageselect-table-42, .rc-imageselect-table-44 {transition-duration: 0.5s !important}", 0), + t.insertRule(".rc-imageselect-tile {transition-duration: 2s !important}", 1), + t.insertRule(".rc-imageselect-dynamic-selected {transition-duration: 1s !important}", 2), + t.insertRule(".rc-imageselect-progress {transition-duration: 0.5s !important}", 3), + t.insertRule(".rc-image-tile-overlay {transition-duration: 0.5s !important}", 4) + }) +} +)(); diff --git a/recaptcha_voice.js b/recaptcha_voice.js index c25d5e7..c00da30 100644 --- a/recaptcha_voice.js +++ b/recaptcha_voice.js @@ -1 +1,79 @@ -(async()=>{const r=[200,400],{Logger:o,Time:i,BG:n,Net:l}=await import(chrome.runtime.getURL("utils.js"));function u(){var e,t;if(!s())return e="true"===document.querySelector(".recaptcha-checkbox")?.getAttribute("aria-checked"),t=document.querySelector("#recaptcha-verify-button")?.disabled,e||t}function s(){return"Try again later"===document.querySelector(".rc-doscaptcha-header")?.innerText}async function e(e){u()||(await i.sleep(e.open_delay),document.querySelector("#recaptcha-anchor")?.click())}async function t(t){var c=await n.exec("get_cache",{name:"recaptcha_visible",tab_specific:true});if(true===c&&!u()){if(s())return o.log("got solve error"),void await n.exec("reset_recaptcha");c=document.querySelector(".rc-audiochallenge-tdownload-link")?.href,c=(fetch(c),await i.random_sleep(...r),document.querySelector("#audio-source")?.src?.replace("recaptcha.net","google.com"));let e=document.querySelector("html")?.getAttribute("lang")?.trim();e&&0!==e.length||(e="en");var a=i.time(),c=await l.fetch("https://engageub.pythonanywhere.com",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"input="+encodeURIComponent(c)+"&lang="+e}),c=(document.querySelector("#audio-response").value=c,t.solve_delay-(i.time()-a));0 { + const r = [200, 400] + , { Logger: o, Time: i, BG: n, Net: l } = await import(chrome.runtime.getURL("utils.js")); + function u() { + var e, t; + if (!s()) + return e = "true" === document.querySelector(".recaptcha-checkbox")?.getAttribute("aria-checked"), + t = document.querySelector("#recaptcha-verify-button")?.disabled, + e || t + } + function s() { + return "Try again later" === document.querySelector(".rc-doscaptcha-header")?.innerText + } + async function e(e) { + u() || (await i.sleep(e.open_delay), + document.querySelector("#recaptcha-anchor")?.click()) + } + async function t(t) { + var c = await n.exec("get_cache", { + name: "recaptcha_visible", + tab_specific: true + }); + if (true === c && !u()) { + if (s()) + return o.log("got solve error"), + void await n.exec("reset_recaptcha"); + c = document.querySelector(".rc-audiochallenge-tdownload-link")?.href, + c = (fetch(c), + await i.random_sleep(...r), + document.querySelector("#audio-source")?.src?.replace("recaptcha.net", "google.com")); + let e = document.querySelector("html")?.getAttribute("lang")?.trim(); + e && 0 !== e.length || (e = "en"); + var a = i.time() + , c = await l.fetch("https://engageub.pythonanywhere.com", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded" + }, + body: "input=" + encodeURIComponent(c) + "&lang=" + e + }) + , c = (document.querySelector("#audio-response").value = c, + t.solve_delay - (i.time() - a)); + 0 < c && await i.sleep(c), + await i.random_sleep(...r), + document.querySelector("#recaptcha-verify-button")?.click() + } + } + for (; ;) { + await i.sleep(1e3); + var c = await n.exec("get_settings"); + c && "voice" === c.solve_method && (o.debug = c.debug, + async function () { + var t = document.querySelectorAll('iframe[src*="/recaptcha/api2/bframe"]'); + if (0 < t.length) { + let e = false; + for (const c of t) + if (e = "visible" === window.getComputedStyle(c).visibility) + break; + e ? await n.exec("set_cache", { + name: "recaptcha_visible", + value: true, + tab_specific: true + }) : await n.exec("set_cache", { + name: "recaptcha_visible", + value: false, + tab_specific: true + }) + } + }(), + c.auto_open && null !== document.querySelector(".recaptcha-checkbox") ? await e(c) : c.auto_solve && null !== document.querySelector(".rc-imageselect-instructions") ? (a = c, + await (true === await n.exec("get_cache", { + name: "recaptcha_visible", + tab_specific: true + }) && !u() && (await i.sleep(a.open_delay), + !document.querySelector("#recaptcha-audio-button")?.click()))) : !c.auto_solve || null === document.querySelector("#audio-instructions") && null === document.querySelector(".rc-doscaptcha-header") || await t(c)) + } + var a +} +)(); diff --git a/utils.js b/utils.js index 65bb058..60f99b3 100644 --- a/utils.js +++ b/utils.js @@ -1 +1,110 @@ -"use strict";class Type{static _string_constructor="string".constructor;static _array_constructor=[].constructor;static _object_constructor={}.constructor;static of(t){return null===t?"null":void 0===t?"undefined":t.constructor===Type._string_constructor?"string":t.constructor===Type._array_constructor?"array":t.constructor===Type._object_constructor?"object":""}}class Logger{static debug=true;static log(t=0){const e=new Array(...arguments).map(t=>["array","object"].includes(Type.of(t))?JSON.stringify(t,null,4):""+t);e.join(" ")}}class Time{static time(){return Date.now||(Date.now=()=>(new Date).getTime()),Date.now()}static sleep(e=1e3){return new Promise(t=>setTimeout(t,e))}static async random_sleep(t,e){e=Math.floor(Math.random()*(e-t)+t);return Time.sleep(e)}static pad(t){var e=2-String(t).length+1;return 0{try{chrome.runtime.sendMessage({method:t,data:r},e)}catch(t){e()}})}}class Net{static async fetch(t,e){return BG.exec("fetch",{url:t,options:e})}}class Image{static encode(e){return new Promise(r=>{if(null===e)return r(null);const t=new XMLHttpRequest;t.onload=()=>{const e=new FileReader;e.onloadend=()=>{let t=e.result;if(t.startsWith("data:text/html;base64,"))return r(null);t=t.replace("data:image/jpeg;base64,",""),r(t)},e.readAsDataURL(t.response)},t.onerror=()=>{r(null)},t.onreadystatechange=()=>{4==this.readyState&&200!=this.status&&r(null)},t.open("GET",e),t.responseType="blob",t.send()})}}function oep(n,s=1,t=100){return new Promise(e=>{const r=setInterval(()=>{var t=document.querySelectorAll(n);if(t.length===s)return clearInterval(r),e(1===s?t[0]:t)},t)})}export{Type,Logger,Time,BG,Net,Image,oep}; \ No newline at end of file +"use strict"; +class Type { + static _string_constructor = "string".constructor; + static _array_constructor = [].constructor; + static _object_constructor = {}.constructor; + static of(t) { + return null === t ? "null" : void 0 === t ? "undefined" : t.constructor === Type._string_constructor ? "string" : t.constructor === Type._array_constructor ? "array" : t.constructor === Type._object_constructor ? "object" : "" + } +} +class Logger { + static debug = true; + static log(t = 0) { + const e = new Array(...arguments).map(t => ["array", "object"].includes(Type.of(t)) ? JSON.stringify(t, null, 4) : "" + t); + e.join(" ") + } +} +class Time { + static time() { + return Date.now || (Date.now = () => (new Date).getTime()), + Date.now() + } + static sleep(e = 1e3) { + return new Promise(t => setTimeout(t, e)) + } + static async random_sleep(t, e) { + e = Math.floor(Math.random() * (e - t) + t); + return Time.sleep(e) + } + static pad(t) { + var e = 2 - String(t).length + 1; + return 0 < e ? "" + new Array(e).join("0") + t : "" + t + } + static date() { + return new Date + } + static string(t = null) { + return t = t || Time.date(), + Time.pad(t.getMonth() + 1) + `/${Time.pad(t.getDate())}/${t.getFullYear()} ${Time.pad(t.getHours() % 12)}:${Time.pad(t.getMinutes())}:${Time.pad(t.getSeconds())} ` + (12 <= t.getHours() ? "PM" : "AM") + } +} +class BG { + static exec(t, r) { + return new Promise(e => { + try { + chrome.runtime.sendMessage({ + method: t, + data: r + }, e) + } catch (t) { + e() + } + } + ) + } +} +class Net { + static async fetch(t, e) { + return BG.exec("fetch", { + url: t, + options: e + }) + } +} +class Image { + static encode(e) { + return new Promise(r => { + if (null === e) + return r(null); + const t = new XMLHttpRequest; + t.onload = () => { + const e = new FileReader; + e.onloadend = () => { + let t = e.result; + if (t.startsWith("data:text/html;base64,")) + return r(null); + t = t.replace("data:image/jpeg;base64,", ""), + r(t) + } + , + e.readAsDataURL(t.response) + } + , + t.onerror = () => { + r(null) + } + , + t.onreadystatechange = () => { + 4 == this.readyState && 200 != this.status && r(null) + } + , + t.open("GET", e), + t.responseType = "blob", + t.send() + } + ) + } +} +function oep(n, s = 1, t = 100) { + return new Promise(e => { + const r = setInterval(() => { + var t = document.querySelectorAll(n); + if (t.length === s) + return clearInterval(r), + e(1 === s ? t[0] : t) + } + , t) + } + ) +} +export { Type, Logger, Time, BG, Net, Image, oep };