diff --git a/.prettierignore b/.prettierignore index 59e44fd..c4cdb31 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,3 +4,4 @@ dist/ node_modules/ .next/ .vercel/ +third-party/ \ No newline at end of file diff --git a/demos/demo.ts b/demos/demo.ts index dda1d94..8f0b234 100644 --- a/demos/demo.ts +++ b/demos/demo.ts @@ -1,4 +1,3 @@ -import delay from 'delay' import dotenv from 'dotenv-safe' import { oraPromise } from 'ora' diff --git a/package.json b/package.json index 7ecdf65..64518d9 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ } }, "files": [ - "build" + "build", + "third-party" ], "engines": { "node": ">=18" diff --git a/src/openai-auth.ts b/src/openai-auth.ts index 413db55..61b1a18 100644 --- a/src/openai-auth.ts +++ b/src/openai-auth.ts @@ -1,7 +1,10 @@ import * as fs from 'node:fs' import * as os from 'node:os' +import * as path from 'node:path' +import * as url from 'node:url' import delay from 'delay' +import { TimeoutError } from 'p-timeout' import type { Browser, Page, Protocol, PuppeteerLaunchOptions } from 'puppeteer' import puppeteer from 'puppeteer-extra' import RecaptchaPlugin from 'puppeteer-extra-plugin-recaptcha' @@ -12,6 +15,10 @@ import * as types from './types' puppeteer.use(StealthPlugin()) let hasRecaptchaPlugin = false +let hasNopechaExtension = false + +const __filename = url.fileURLToPath(import.meta.url) +const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) /** * Represents everything that's required to pass into `ChatGPTAPI` in order @@ -122,13 +129,21 @@ export async function getOpenAIAuth({ await page.type('#username', email, { delay: 20 }) await delay(100) - if (hasRecaptchaPlugin) { - // console.log('solveRecaptchas()') + if (hasNopechaExtension) { + await waitForRecaptcha(page, { timeoutMs }) + } else if (hasRecaptchaPlugin) { const res = await page.solveRecaptchas() - // console.log('solveRecaptchas result', res) + console.log('solveRecaptchas result', res) } - await page.click('button[type="submit"]') + await delay(1200) + const frame = page.mainFrame() + const submit = await page.waitForSelector('button[type="submit"]', { + timeout: timeoutMs + }) + frame.focus('button[type="submit"]') + await submit.focus() + await submit.click() await page.waitForSelector('#password', { timeout: timeoutMs }) await page.type('#password', password, { delay: 10 }) submitP = () => page.click('button[type="submit"]') @@ -186,10 +201,12 @@ export async function getOpenAIAuth({ export async function getBrowser( opts: PuppeteerLaunchOptions & { captchaToken?: string + nopechaKey?: string } = {} ) { const { captchaToken = process.env.CAPTCHA_TOKEN, + nopechaKey = process.env.NOPECHA_KEY, executablePath = defaultChromeExecutablePath(), ...launchOptions } = opts @@ -209,24 +226,71 @@ export async function getBrowser( ) } - return puppeteer.launch({ + const puppeteerArgs = [ + '--no-sandbox', + '--disable-infobars', + '--disable-dev-shm-usage', + '--disable-blink-features=AutomationControlled', + '--no-first-run', + '--no-service-autorun', + '--password-store=basic', + '--system-developer-mode' + ] + + if (nopechaKey) { + const nopechaPath = path.join( + __dirname, + '..', + 'third-party', + 'nopecha-chrome-extension' + ) + puppeteerArgs.push(`--disable-extensions-except=${nopechaPath}`) + puppeteerArgs.push(`--load-extension=${nopechaPath}`) + hasNopechaExtension = true + } + + const browser = await puppeteer.launch({ headless: false, // https://peter.sh/experiments/chromium-command-line-switches/ - args: [ - '--no-sandbox', - '--exclude-switches', - 'enable-automation', - '--disable-infobars', - '--disable-dev-shm-usage', - '--disable-blink-features=AutomationControlled', - '--no-first-run', - '--no-service-autorun', - '--password-store=basic' + args: puppeteerArgs, + ignoreDefaultArgs: [ + '--disable-extensions', + '--enable-automation', + '--disable-component-extensions-with-background-pages' ], ignoreHTTPSErrors: true, executablePath, ...launchOptions }) + + // TOdO: this is a really hackity hack way of setting the API key... + if (hasNopechaExtension) { + const page = (await browser.pages())[0] || (await browser.newPage()) + await page.goto(`https://nopecha.com/setup#${nopechaKey}`) + await delay(1000) + const page3 = await browser.newPage() + await page.close() + + const extensionId = 'npgnhlnhpphdlkfdnggbdpbhoopefaai' + const extensionUrl = `chrome-extension://${extensionId}/popup.html` + await page3.goto(extensionUrl, { waitUntil: 'networkidle2' }) + await delay(500) + + const editKey = await page3.waitForSelector('#edit_key .clickable') + await editKey.click() + + const settingsInput = await page3.$('input.settings_text') + await settingsInput.type(nopechaKey) + await settingsInput.evaluate((el, value) => { + el.value = value + }, nopechaKey) + await settingsInput.press('Enter') + await delay(500) + await editKey.click() + await delay(2000) + } + + return browser } /** @@ -260,13 +324,6 @@ async function checkForChatGPTAtCapacity(page: Page) { try { res = await page.$x("//div[contains(., 'ChatGPT is at capacity')]") - // console.log('capacity1', els) - // if (els?.length) { - // res = await Promise.all( - // els.map((a) => a.evaluate((el) => el.textContent)) - // ) - // console.log('capacity2', res) - // } } catch (err) { // ignore errors likely due to navigation } @@ -326,3 +383,40 @@ async function waitForConditionOrAtCapacity( setTimeout(waitForCapacityText, pollingIntervalMs) }) } + +async function waitForRecaptcha( + page: Page, + opts: { + pollingIntervalMs?: number + timeoutMs?: number + } = {} +) { + if (!hasNopechaExtension) { + return + } + + const { pollingIntervalMs = 100, timeoutMs } = opts + const captcha = await page.$('textarea#g-recaptcha-response') + const startTime = Date.now() + + if (captcha) { + console.log('waiting to solve recaptcha...') + + do { + const value = (await captcha.evaluate((el) => el.value))?.trim() + if (value?.length) { + // recaptcha has been solved! + break + } + + if (timeoutMs) { + const now = Date.now() + if (now - startTime >= timeoutMs) { + throw new TimeoutError('Timed out waiting to solve Recaptcha') + } + } + + await delay(pollingIntervalMs) + } while (true) + } +} diff --git a/third-party/nopecha-chrome-extension/api.js b/third-party/nopecha-chrome-extension/api.js new file mode 100644 index 0000000..6ab7001 --- /dev/null +++ b/third-party/nopecha-chrome-extension/api.js @@ -0,0 +1 @@ +const VERSION="chrome",browser=globalThis.chrome;function reconnect_scripts(){browser.runtime.onInstalled.addListener(async()=>{for(const e of browser.runtime.getManifest().content_scripts)for(const r of await browser.tabs.query({url:e.matches}))browser.scripting.executeScript({target:{tabId:r.id},files:e.js})})}function register_language(){browser.declarativeNetRequest.updateDynamicRules({addRules:[{id:1,priority:1,action:{type:"redirect",redirect:{transform:{queryTransform:{addOrReplaceParams:[{key:"hl",value:"en-US"}]}}}},condition:{regexFilter:"^(http|https)://[^\\.]*\\.(google\\.com|recaptcha\\.net)/recaptcha",resourceTypes:["sub_frame"]}},{id:2,priority:1,action:{type:"redirect",redirect:{transform:{queryTransform:{addOrReplaceParams:[{key:"lang",value:"en"}]}}}},condition:{regexFilter:"^(http|https)://[^\\.]*\\.(funcaptcha\\.(co|com)|arkoselabs\\.(com|cn)|arkose\\.com\\.cn)",resourceTypes:["sub_frame"]}}],removeRuleIds:[1,2]})}export{VERSION,browser,reconnect_scripts,register_language}; diff --git a/third-party/nopecha-chrome-extension/awscaptcha.js b/third-party/nopecha-chrome-extension/awscaptcha.js new file mode 100644 index 0000000..1a3c649 --- /dev/null +++ b/third-party/nopecha-chrome-extension/awscaptcha.js @@ -0,0 +1 @@ +(async()=>{let i=null;function a(a=500){return new Promise(t=>{let c=!1;const n=setInterval(async()=>{if(!c){c=!0;var a=await BG.exec("Settings.get");if(a.enabled&&a.awscaptcha_auto_solve){a=document.querySelector('input[placeholder="Answer"]');if(a&&""===a.value){var e=function(){try{return document.querySelector("audio").src.replace("data:audio/aac;base64,","")}catch(a){}return null}();if(e&&i!==e)return i=e,clearInterval(n),c=!1,t({input:a,audio_data:e})}c=!1}}},a)})}for(;;){await Time.sleep(1e3);var e=await BG.exec("Settings.get");if(e&&e.enabled){var t,c,n,o,l=await Location.hostname();if(!e.disabled_hosts.includes(l))if(e.awscaptcha_auto_open&&null!==document.querySelector("#captcha-container > #root #amzn-captcha-verify-button")){l=void 0;try{var l=document.querySelector("#captcha-container > #root #amzn-captcha-verify-button");l&&l.click()}catch(a){}await 0}else if(e.hcaptcha_auto_solve&&null!==document.querySelector('#captcha-container > #root #amzn-btn-audio-internal > img[title="Audio problem"]')){l=void 0;try{l=document.querySelector("#captcha-container > #root #amzn-btn-audio-internal");l&&l.click()}catch(a){}await 0}else e.hcaptcha_auto_solve&&null!==document.querySelector('#captcha-container > #root #amzn-btn-audio-internal > img[title="Visual problem"]')&&(n=c=t=o=e=l=void 0,{input:l,audio_data:e}=await a(),await!(null!==l&&null!==e&&(o=await BG.exec("Settings.get")).enabled&&o.awscaptcha_auto_solve&&(t=Time.time(),{job_id:c,data:e}=await NopeCHA.post({captcha_type:IS_DEVELOPMENT?"awscaptcha_dev":"awscaptcha",audio_data:[e],key:o.key}),!e||0===e.length||(n=(n=parseInt(o.awscaptcha_solve_delay_time))||1e3,0<(o=o.awscaptcha_solve_delay?n-(Time.time()-t):0)&&await Time.sleep(o),0===e[0].length)?(document.querySelector("#amzn-btn-refresh-internal")?.click(),await Time.sleep(200),i=null):(l.value=e[0],await Time.sleep(200),document.querySelector("#amzn-btn-verify-internal")?.click()))))}}})(); diff --git a/third-party/nopecha-chrome-extension/background.js b/third-party/nopecha-chrome-extension/background.js new file mode 100644 index 0000000..a279a36 --- /dev/null +++ b/third-party/nopecha-chrome-extension/background.js @@ -0,0 +1 @@ +import{deep_copy,SettingsManager,Time}from"./utils.mjs";import*as bapi from"./api.js";class API{static endpoints={};static register(t,e){var a=t.name+"."+e;const s=t[e];this.endpoints[a]=function(){return s.apply(t,[{tab_id:arguments[0].tab_id,frame_id:arguments[0].frame_id,...arguments[0].data}])}}}class Cache{static cache={};static async set({tab_id:t,name:e,value:a,tab_specific:s}={tab_specific:!1}){return s&&(e=t+"_"+e),Cache.cache[e]=a,Cache.cache[e]}static async get({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){return a&&(e=t+"_"+e),Cache.cache[e]}static async remove({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){a&&(e=t+"_"+e);a=Cache.cache[e];return delete Cache.cache[e],a}static async append({tab_id:t,name:e,value:a,tab_specific:s}={tab_specific:!1}){return(e=s?t+"_"+e:e)in Cache.cache||(Cache.cache[e]=[]),Cache.cache[e].push(a),Cache.cache[e]}static async empty({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){a&&(e=t+"_"+e);a=Cache.cache[e];return Cache.cache[e]=[],a}static async inc({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){return(e=a?t+"_"+e:e)in Cache.cache||(Cache.cache[e]=0),Cache.cache[e]++,Cache.cache[e]}static async dec({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){return(e=a?t+"_"+e:e)in Cache.cache||(Cache.cache[e]=0),Cache.cache[e]--,Cache.cache[e]}static async zero({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){return a&&(e=t+"_"+e),Cache.cache[e]=0,Cache.cache[e]}static{API.register(this,"set"),API.register(this,"get"),API.register(this,"remove"),API.register(this,"append"),API.register(this,"empty"),API.register(this,"inc"),API.register(this,"dec"),API.register(this,"zero")}}class Settings{static data={};static _save(){return new Promise(t=>{bapi.browser.storage.sync.set({settings:Settings.data},t)})}static _get_settings(){return new Promise(e=>{bapi.browser.storage.sync.get(["settings"],({settings:t})=>{e(t)})})}static async load(){for(let t=0;t<4;t++){var e=await Settings._get_settings();if(e)return Settings.data=e,void(Settings.data.version!==SettingsManager.DEFAULT.version&&(e=Settings.data.key,await Settings.reset(),Settings.data.key=e))}await Settings.reset()}static async get(){return Settings.data}static async set({id:t,value:e}){Settings.data[t]=e,await Settings._save()}static async update({settings:t}){for(var[e,a]of Object.entries(t))Settings.data[e]=a;await Settings._save()}static async replace({settings:t}){Settings.data=t,await Settings._save()}static async reset(){Settings.data=deep_copy(SettingsManager.DEFAULT),await Settings._save()}static{API.register(this,"get"),API.register(this,"set"),API.register(this,"update"),API.register(this,"replace"),API.register(this,"reset")}}class Net{static async fetch({url:t,options:e}={options:{}}){try{return await(await fetch(t,e)).text()}catch(t){return null}}static{API.register(this,"fetch")}}class Tab{static reloads={};static _reload({tab_id:e}){return new Promise(t=>bapi.browser.tabs.reload(e,{bypassCache:!0},t))}static async reload({tab_id:t,delay:e,overwrite:a}={delay:0,overwrite:!0}){e=parseInt(e);var s=Tab.reloads[t]?.delay-(Date.now()-Tab.reloads[t]?.start),s=isNaN(s)||s<0?0:s;return!!(a||0==s||e<=s)&&(clearTimeout(Tab.reloads[t]?.timer),Tab.reloads[t]={delay:e,start:Date.now(),timer:setTimeout(()=>Tab._reload({tab_id:t}),e)},!0)}static close({tab_id:e}){return new Promise(t=>bapi.browser.tabs.remove(e,t))}static open({url:e}={url:null}){return new Promise(t=>bapi.browser.tabs.create({url:e},t))}static navigate({tab_id:e,url:a}){return new Promise(t=>bapi.browser.tabs.update(e,{url:a},t))}static info({tab_id:t}){return new Promise(e=>{try{bapi.browser.tabs.get(t,t=>e(t))}catch(t){e(!1)}})}static active(){return new Promise(async e=>{var t;if("firefox"!==bapi.VERSION)return[t]=await bapi.browser.tabs.query({active:!0,lastFocusedWindow:!0}),e(t);bapi.browser.tabs.query({active:!0,lastFocusedWindow:!0},([t])=>{bapi.browser.runtime.lastError,e(t)})})}static{API.register(this,"reload"),API.register(this,"close"),API.register(this,"open"),API.register(this,"navigate"),API.register(this,"info"),API.register(this,"active")}}class Inject{static async _inject(e){e.target.tabId||(t=await Tab.active(),e.target.tabId=t.id);var t=new Promise(t=>bapi.browser.scripting.executeScript(e,t));return t}static async func({tab_id:t,func:e,args:a}={args:[]}){t={target:{tabId:t,allFrames:!0},world:"MAIN",injectImmediately:!0,func:e,args:a};return Inject._inject(t)}static async files({tab_id:t,frame_id:e,files:a}){t={target:{tabId:t,frameIds:[e]},world:"MAIN",injectImmediately:!0,files:a};return"firefox"===bapi.VERSION&&delete t.world,Inject._inject(t)}static{API.register(this,"func"),API.register(this,"files")}}class Recaptcha{static async reset({tab_id:t}){return await Inject.func({tab_id:t,data:{func:()=>{try{window.grecaptcha?.reset()}catch{}},args:[]}}),!0}static{API.register(this,"reset")}}class Server{static ENDPOINT="https://api.nopecha.com/status?v="+bapi.browser.runtime.getManifest().version;static is_fetching_plan=!1;static async get_plan({key:t}){if(Server.is_fetching_plan)return!1;Server.is_fetching_plan=!0;let e={plan:"Unknown",credit:0};try{"undefined"===t&&(t="");var a=await fetch(Server.ENDPOINT+"&key="+t);e=JSON.parse(await a.text())}catch{}return Server.is_fetching_plan=!1,e}static{API.register(this,"get_plan")}}class Image{static encode({url:t}){return new Promise(a=>{fetch(t).then(t=>t.blob()).then(t=>{const e=new FileReader;e.onload=()=>a(e.result),e.readAsDataURL(t)})})}static{API.register(this,"encode")}}class Relay{static async send({tab_id:t,data:e}){t=t||(await Tab.active()).id,bapi.browser.tabs.sendMessage(t,e)}static{API.register(this,"send")}}class Icon{static set({status:a}){return new Promise(t=>{var e="firefox"===bapi.VERSION?bapi.browser.browserAction:bapi.browser.action;"on"===a?e.setIcon({path:{16:"/icon/16.png",32:"/icon/32.png",48:"/icon/48.png",128:"/icon/128.png"}},t):"off"===a?e.setIcon({path:{16:"/icon/16g.png",32:"/icon/32g.png",48:"/icon/48g.png",128:"/icon/128g.png"}},t):t(!1)})}static set_badge_text({tab_id:a,data:s}){return new Promise(t=>{var e={text:s};a&&(e.tabId=a),bapi.browser.action.setBadgeText(e,t)})}static set_badge_color({tab_id:a,data:s}){return new Promise(t=>{var e={color:s};a&&(e.tabId=a),bapi.browser.action.setBadgeBackgroundColor(e,t)})}static async set_badge({tab_id:t,data:{global:e,text:a,color:s}}){t||e||(t=(await Tab.active()).id),e&&(t=null);e=[Icon.set_badge_text({tab_id:t,data:a})];return s&&e.push(Icon.set_badge_color({tab_id:t,data:s})),Promise.all(e)}static{API.register(this,"set")}}class Browser{static async version(){return bapi.VERSION}static async log(){}static{API.register(this,"version"),API.register(this,"log")}}class ContextMenu{static listen(){bapi.browser.contextMenus.onClicked.addListener(function(e,t){if("nopecha_disable_host"===e.menuItemId){e=e.pageUrl;if(e){e=e.replace(/^(.*:)\/\/([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$/,"$2");let t=new Set;for(const a of Settings.data.disabled_hosts)t.add(a.trim());t.add(e),t=[...t],Settings.set({id:"disabled_hosts",value:t})}}})}static create(){bapi.browser.contextMenus.create({title:"Disable NopeCHA on this site",id:"nopecha_disable_host"})}static{bapi.browser.runtime.onInstalled.addListener(ContextMenu.create),ContextMenu.listen()}}(async()=>{bapi.register_language(),await Settings.load(),await Icon.set({status:Settings.data.enabled?"on":"off"}),bapi.browser.runtime.onMessage.addListener((t,e,a)=>{const s=t[0];let i=null;t=(i=1{["Browser.log","Settings.get","Settings.set","Cache.get","Cache.set","Tab.info"].includes(s);try{a(t)}catch(t){}}).catch(t=>{})}catch(t){}return!0})})(); diff --git a/third-party/nopecha-chrome-extension/content.js b/third-party/nopecha-chrome-extension/content.js new file mode 100644 index 0000000..b9f26d8 --- /dev/null +++ b/third-party/nopecha-chrome-extension/content.js @@ -0,0 +1,151 @@ +class BG { + static exec() { + return new Promise((a) => { + try { + chrome.runtime.sendMessage([...arguments], a) + } catch (e) { + a(null) + } + }) + } +} +class Net { + static async fetch(e, a) { + return BG.exec('Net.fetch', { url: e, options: a }) + } +} +class Script { + static inject_file(t) { + return new Promise((e) => { + var a = document.createElement('script') + ;(a.src = chrome.runtime.getURL(t)), + (a.onload = e), + (document.head || document.documentElement).appendChild(a) + }) + } +} +class Location { + static parse_hostname(e) { + return e.replace(/^(.*:)\/\/([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$/, '$2') + } + static async hostname() { + var e = await BG.exec('Tab.info'), + e = e.url || 'Unknown Host' + return Location.parse_hostname(e) + } +} +class Image { + static encode(a) { + return new Promise((t) => { + if (null === a) return t(null) + const e = new XMLHttpRequest() + ;(e.onload = () => { + const a = new FileReader() + ;(a.onloadend = () => { + let e = a.result + if (e.startsWith('data:text/html;base64,')) return t(null) + ;(e = e.replace('data:image/jpeg;base64,', '')), t(e) + }), + a.readAsDataURL(e.response) + }), + (e.onerror = () => { + t(null) + }), + (e.onreadystatechange = () => { + 4 == this.readyState && 200 != this.status && t(null) + }), + e.open('GET', a), + (e.responseType = 'blob'), + e.send() + }) + } +} +class NopeCHA { + static INFERENCE_URL = 'https://api.nopecha.com' + static MAX_WAIT_POST = 60 + static MAX_WAIT_GET = 60 + static ERRORS = { + UNKNOWN: 9, + INVALID_REQUEST: 10, + RATE_LIIMTED: 11, + BANNED_USER: 12, + NO_JOB: 13, + INCOMPLETE_JOB: 14, + INVALID_KEY: 15, + NO_CREDIT: 16, + UPDATE_REQUIRED: 17 + } + static async post({ + captcha_type: e, + task: a, + image_urls: t, + image_data: r, + grid: n, + audio_data: o, + key: i + }) { + for ( + var s = Date.now(), c = await BG.exec('Tab.info'); + !(Date.now() - s > 1e3 * NopeCHA.MAX_WAIT_POST); + + ) { + var d = { + type: e, + task: a, + key: i, + v: chrome.runtime.getManifest().version, + url: c ? c.url : window.location.href + } + t && (d.image_urls = t), + r && (d.image_data = r), + n && (d.grid = n), + o && (d.audio_data = o) + try { + var l = { 'Content-Type': 'application/json' }, + u = + (i && 'undefined' !== i && (l.Authorization = 'Bearer ' + i), + await Net.fetch(NopeCHA.INFERENCE_URL, { + method: 'POST', + headers: l, + body: JSON.stringify(d) + })), + p = JSON.parse(u) + if (!p) { + break + } + if ('error' in p) { + if (p.error === NopeCHA.ERRORS.RATE_LIMITED) { + await Time.sleep(2e3) + continue + } + if (p.error === NopeCHA.ERRORS.INVALID_KEY) break + if (p.error === NopeCHA.ERRORS.NO_CREDIT) break + break + } + var _ = p.data + return await NopeCHA.get({ job_id: _, key: i }) + } catch (e) {} + await Time.sleep(1e3) + } + return { job_id: null, data: null } + } + static async get({ job_id: e, key: a }) { + for (var t = Date.now(); !(Date.now() - t > 1e3 * NopeCHA.MAX_WAIT_GET); ) { + await Time.sleep(1e3) + var r = {}, + r = + (a && 'undefined' !== a && (r.Authorization = 'Bearer ' + a), + await Net.fetch(NopeCHA.INFERENCE_URL + `?id=${e}&key=` + a, { + headers: r + })) + try { + var n = JSON.parse(r) + if (!('error' in n)) + return { job_id: e, data: n.data, metadata: n.metadata } + if (n.error !== NopeCHA.ERRORS.INCOMPLETE_JOB) + return { job_id: e, data: null, metadata: null } + } catch (e) {} + } + return { job_id: e, data: null, metadata: null } + } +} diff --git a/third-party/nopecha-chrome-extension/font/plex-sans-bold.woff b/third-party/nopecha-chrome-extension/font/plex-sans-bold.woff new file mode 100644 index 0000000..e7a52a2 Binary files /dev/null and b/third-party/nopecha-chrome-extension/font/plex-sans-bold.woff differ diff --git a/third-party/nopecha-chrome-extension/font/plex-sans-bold.woff2 b/third-party/nopecha-chrome-extension/font/plex-sans-bold.woff2 new file mode 100644 index 0000000..f97a88a Binary files /dev/null and b/third-party/nopecha-chrome-extension/font/plex-sans-bold.woff2 differ diff --git a/third-party/nopecha-chrome-extension/font/plex-sans-regular.woff b/third-party/nopecha-chrome-extension/font/plex-sans-regular.woff new file mode 100644 index 0000000..81a40ee Binary files /dev/null and b/third-party/nopecha-chrome-extension/font/plex-sans-regular.woff differ diff --git a/third-party/nopecha-chrome-extension/font/plex-sans-regular.woff2 b/third-party/nopecha-chrome-extension/font/plex-sans-regular.woff2 new file mode 100644 index 0000000..ce85e82 Binary files /dev/null and b/third-party/nopecha-chrome-extension/font/plex-sans-regular.woff2 differ diff --git a/third-party/nopecha-chrome-extension/funcaptcha.js b/third-party/nopecha-chrome-extension/funcaptcha.js new file mode 100644 index 0000000..291bf44 --- /dev/null +++ b/third-party/nopecha-chrome-extension/funcaptcha.js @@ -0,0 +1 @@ +(async()=>{function o(){return null!==(document.querySelector('button[aria-describedby="descriptionVerify"]')||document.querySelector("#wrong_children_button")||document.querySelector("#wrongTimeout_children_button"))}function r(){try{var e=document.querySelector('button[aria-describedby="descriptionVerify"]'),t=(e&&(window.parent.postMessage({nopecha:!0,action:"clear"},"*"),e.click()),document.querySelector("#wrong_children_button")),a=(t&&(window.parent.postMessage({nopecha:!0,action:"clear"},"*"),t.click()),document.querySelector("#wrongTimeout_children_button"));a&&(window.parent.postMessage({nopecha:!0,action:"clear"},"*"),a.click())}catch(e){}}function u(){return document.querySelector("#game_children_text > h2")?.innerText?.trim()}function s(){return document.querySelector("img#game_challengeItem_image")?.src?.split(";base64,")[1]}let d=null;async function e(){e=500;var e,{task:t,cells:a,image_data:n}=await new Promise(n=>{let c=!1;const i=setInterval(async()=>{if(!c){c=!0;var e=await BG.exec("Settings.get");if(e.enabled&&e.funcaptcha_auto_solve){e.funcaptcha_auto_open&&o()&&await r();e=u();if(e){var t=document.querySelectorAll("#game_children_challenge ul > li > a");if(6===t.length){var a=s();if(a&&d!==a)return d=a,clearInterval(i),c=!1,n({task:e,cells:t,image_data:a})}}c=!1}}},e)});if(null!==t&&null!==a&&null!==n){var c=await BG.exec("Settings.get");if(c.enabled&&c.funcaptcha_auto_solve){var i=Time.time(),l=(await NopeCHA.post({captcha_type:IS_DEVELOPMENT?"funcaptcha_dev":"funcaptcha",task:t,image_data:[n],key:c.key}))["data"];if(l){t=parseInt(c.funcaptcha_solve_delay_time)||1e3,n=c.funcaptcha_solve_delay?t-(Time.time()-i):0;0{const u={linkedin:["3117BF26-4762-4F5A-8ED9-A85E69209A46",!1],rockstar:["A5A70501-FCDE-4065-AF18-D9FAF06EF479",!1],github:["20782B4C-05D0-45D7-97A0-41641055B6F6",!1],paypal:["9409E63B-D2A5-9CBD-DBC0-5095707D0090",!1],blizzard:["E8A75615-1CBA-5DFF-8032-D16BCF234E10",!1],twitch:["E5554D43-23CC-1982-971D-6A2262A2CA24",!1],demo1:["804380F4-6844-FFA1-ED4E-5877CA1F1EA4",!1],demo2:["D39B0EE3-2973-4147-98EF-C92F93451E2D",!1],"ea signup":["73BEC076-3E53-30F5-B1EB-84F494D43DBA",!1],"ea signin":["0F5FE186-B3CA-4EDB-A39B-9B9A3397D01D",!1],myprepaidcenter:["0F941BF0-7303-D94B-B76A-EAA2E2048124",!1],twitter:["2CB16598-CB82-4CF7-B332-5990DB66F3AB",!0],discoveryplus:["FE296399-FDEA-2EA2-8CD5-50F6E3157ECA",!1],minecraft:["D39B0EE3-2973-4147-98EF-C92F93451E2D",!1],imvu:["0C2B415C-D772-47D4-A183-34934F786C7E",!1],adobe:["430FF2C3-1AB1-40B7-8BE7-44FC683FE02C",!1]},h={outlook:["https://iframe.arkoselabs.com/B7D8911C-5CC8-A9A3-35B0-554ACEE604DA/index.html?mkt=en",!1],"outlook auth":["https://iframe-auth.arkoselabs.com/B7D8911C-5CC8-A9A3-35B0-554ACEE604DA/index.html?mkt=en",!1]};let E=18;function w(){g("linkedin",0,1),g("rockstar",0,1),g("demo1",0,1),g("blizzard",0,1),g("twitch",0,1),g("paypal",0,1),A("outlook auth",0,1),g("github",0,1),g("demo2",0,1),A("outlook",0,1),g("ea signup",0,1),g("ea signin",0,1),g("twitter",0,1),g("minecraft",0,1),g("imvu",0,1),g("adobe",0,1)}function g(t,o,n){n=n||E;for(let e=0;e * { + height: 20px; + line-height: 20px; + padding: 0; + border: 0; + font-size: 12px; + }`,`.input_row > input[type="button"] { + width: 100px; + cursor: pointer; + transition: 200ms all; + }`,`.input_row > input[type="button"]:hover { + opacity: 0.8; + }`,`#nframes_label { + background-color: #fff; + color: #222; + width: 70px; + text-align: center; + }`,`#nframes, #nframes:active { + width: 30px; + border: none; + outline: none; + }`,`.name { + color: #fff; + }`,`.iframe_row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + }`,`.iframe_wrap { + background-color: #eee; + width: 275px; + height: 275px; + padding: 0; + overflow: hidden; + }`,`iframe { + border: none !important; + width: 400px !important; + height: 400px !important; + -ms-zoom: 0.75 !important; + -moz-transform: scale(0.75) !important; + -moz-transform-origin: 0 0 !important; + -o-transform: scale(0.75) !important; + -o-transform-origin: 0 0 !important; + -webkit-transform: scale(0.75) !important; + -webkit-transform-origin: 0 0 !important; + }`,`iframe.small { + width: 550px !important; + height: 550px !important; + -ms-zoom: 0.5 !important; + -moz-transform: scale(0.5) !important; + -moz-transform-origin: 0 0 !important; + -o-transform: scale(0.5) !important; + -o-transform-origin: 0 0 !important; + -webkit-transform: scale(0.5) !important; + -webkit-transform-origin: 0 0 !important; + }`];const o=document.body.appendChild(document.createElement("style")).sheet;for(const n in t)o.insertRule(t[n],n);let n=0;let r=1;const a={};a[0]=document.createElement("div");a[0].classList.add("input_row");document.body.append(a[0]);const i=document.createElement("div");i.id="nframes_label";i.innerText="# iframes";a[0].append(i);const c=document.createElement("input");c.id="nframes";c.placeholder="Number of iframes";c.value=E;c.addEventListener("input",()=>{E=parseInt(c.value)});a[0].append(c);const m={reset:{row:0,fn:e,args:[]},all:{row:0,fn:w,args:[]}};for(const s in u)n++%9==0&&r++,m[s]={row:r,fn:g,args:[s,0]};for(const d in h)n++%9==0&&r++,m[d]={row:r,fn:A,args:[d,0]};for(const[p,l]of Object.entries(m)){const r=l.row,f=(l.row in a||(a[l.row]=document.createElement("div"),a[l.row].classList.add("input_row"),document.body.append(a[l.row])),document.createElement("input"));f.type="button",f.value=p,f.addEventListener("click",()=>{e(),l.fn(...l.args)}),a[l.row].append(f)}}(),g("imvu",0,E)})(); diff --git a/third-party/nopecha-chrome-extension/funcaptcha_fast.js b/third-party/nopecha-chrome-extension/funcaptcha_fast.js new file mode 100644 index 0000000..c3809fe --- /dev/null +++ b/third-party/nopecha-chrome-extension/funcaptcha_fast.js @@ -0,0 +1 @@ +(async()=>{window.addEventListener("load",()=>{var t=document.body.appendChild(document.createElement("style")).sheet;t.insertRule("* {transition-duration: 0s !important}",0),t.insertRule("li > a::after {border: 8px solid rgba(0, 255, 0, 0.6) !important}",1),t.insertRule("#interstitial {backdrop-filter: none !important}",2),t.insertRule("#interstitial {background-color: transparent !important}",3),t.insertRule("#interstitial_wrapper {background-color: transparent !important}",4)})})(); diff --git a/third-party/nopecha-chrome-extension/funcaptcha_scrape.js b/third-party/nopecha-chrome-extension/funcaptcha_scrape.js new file mode 100644 index 0000000..6157d86 --- /dev/null +++ b/third-party/nopecha-chrome-extension/funcaptcha_scrape.js @@ -0,0 +1 @@ +(async()=>{var e=IS_DEVELOPMENT;const o="lazy";window.nopecha=[];var a={};async function t(e){var a=(document.querySelector("#game_children_text > h2")||document.querySelector("#game-header"))?.innerText?.trim(),t=(document.querySelector("img#game_challengeItem_image")||document.querySelector("#challenge-image"))?.src?.split(";base64,")[1];a&&t&&(a={task:a,image:t,index:e,url:(await BG.exec("Tab.info"))?.url},o.startsWith("l")&&window.parent.postMessage({nopecha:!0,action:"append",data:a},"*"),o.startsWith("e"))&&await Net.fetch("https://api.nopecha.com/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}var n=window.addEventListener?"addEventListener":"attachEvent";for(window[n]("attachEvent"==n?"onmessage":"message",async e=>{e=e[e.message?"message":"data"];e&&!0===e.nopecha&&("append"===e.action?window.nopecha.push(e.data):"clear"===e.action?window.nopecha=[]:"reload"===e.action&&(window.parent.postMessage({nopecha:!0,action:"reload"},"*"),window.location.reload(!0)))},!1);;){await Time.sleep(1e3);try{if(document.querySelector("body.victory")){var i=[];for(const s of window.nopecha){var c=Net.fetch("https://api.nopecha.com/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});i.push(c)}await Promise.all(i),window.nopecha=[],e&&(window.parent.postMessage({nopecha:!0,action:"reload"},"*"),window.location.reload(!0))}"block"===document.querySelector("#timeout_widget")?.style?.display&&(window.parent.postMessage({nopecha:!0,action:"reload"},"*"),window.location.reload(!0));var r=document.querySelectorAll("#game_children_challenge ul > li > a");for(const l in r){var d=r[l];l in a&&d.removeEventListener("click",a[l]),a[l]=t.bind(this,parseInt(l)),d.addEventListener("click",a[l])}}catch(e){}}})(); diff --git a/third-party/nopecha-chrome-extension/hcaptcha.js b/third-party/nopecha-chrome-extension/hcaptcha.js new file mode 100644 index 0000000..6f26fa1 --- /dev/null +++ b/third-party/nopecha-chrome-extension/hcaptcha.js @@ -0,0 +1 @@ +(async()=>{function u(e){e=e?.style.background?.trim()?.match(/(?!^)".*?"/g);return e&&0!==e.length?e[0].replaceAll('"',""):null}async function h(){var e=document.querySelector("h2.prompt-text")?.innerText?.replace(/\s+/g," ")?.trim();if(!e)return null;var t={"0430":"a","0441":"c","0501":"d","0065":"e","0435":"e","04bb":"h","0069":"i","0456":"i","0458":"j","03f3":"j","04cf":"l","03bf":"o","043e":"o","0440":"p","0455":"s","0445":"x","0443":"y","0335":"-"};var a=[];for(const i of e){var c=function(e,t,a){for(;(""+e).length{let r=!1;const s=setInterval(async()=>{if(!r){r=!0;var e=await h();if(e){var t=u(document.querySelector(".challenge-example > .image > .image"));if(t&&""!==t){var a=document.querySelectorAll(".task-image");if(9===a.length){var c=[],i=[];for(const l of a){var n=l.querySelector("div.image");if(!n)return void(r=!1);n=u(n);if(!n||""===n)return void(r=!1);c.push(l),i.push(n)}a=JSON.stringify(i);if(d!==a)return d=a,clearInterval(s),r=!1,o({task:e,task_url:t,cells:c,urls:i})}}}r=!1}},e)}),i=await BG.exec("Settings.get");if(i.enabled&&i.hcaptcha_auto_solve){var n=Time.time(),{data:l,metadata:t}=await NopeCHA.post({captcha_type:IS_DEVELOPMENT?"hcaptcha_dev":"hcaptcha",task:t,image_urls:c,key:i.key});if(l){o&&o.postMessage({event:"NopeCHA.metadata",metadata:t});c=parseInt(i.hcaptcha_solve_delay_time)||3e3,t=i.hcaptcha_solve_delay?c-(Time.time()-n):0;0{"NopeCHA.hook"===e.data.event&&(o=e.source)}),window.location.hash.includes("frame=challenge")&&(c=!0,"firefox"===await BG.exec("Browser.version")?await Script.inject_file("hcaptcha_hook.js"):await BG.exec("Inject.files",{files:["hcaptcha_hook.js"]}))),n.hcaptcha_auto_open&&0!==document.body.getBoundingClientRect()?.width&&0!==document.body.getBoundingClientRect()?.height&&null!==document.querySelector("div.check")?await e():n.hcaptcha_auto_solve&&null!==document.querySelector("h2.prompt-text")&&await t()))}})(); diff --git a/third-party/nopecha-chrome-extension/hcaptcha_fast.js b/third-party/nopecha-chrome-extension/hcaptcha_fast.js new file mode 100644 index 0000000..0fce138 --- /dev/null +++ b/third-party/nopecha-chrome-extension/hcaptcha_fast.js @@ -0,0 +1 @@ +(async()=>{let a=null,t=!1,r=!1;function n(e,t,r=!1){e&&(r||a!==e)&&(!0===t&&"false"===e.getAttribute("aria-pressed")||!1===t&&"true"===e.getAttribute("aria-pressed"))&&e.click()}document.addEventListener("mousedown",e=>{"false"===e?.target?.parentNode?.getAttribute("aria-pressed")?(t=!0,r=!0):"true"===e?.target?.parentNode?.getAttribute("aria-pressed")&&(t=!0,r=!1),a=e?.target?.parentNode}),document.addEventListener("mouseup",e=>{t=!1,a=null}),document.addEventListener("mousemove",e=>{t&&(a!==e?.target?.parentNode&&null!==a&&n(a,r,!0),n(e?.target?.parentNode,r))}),window.addEventListener("load",()=>{document.body.appendChild(document.createElement("style")).sheet.insertRule('[aria-pressed="true"] > .border-focus {background-color: #0f0 !important; opacity: 0.3 !important}',0)})})(); diff --git a/third-party/nopecha-chrome-extension/hcaptcha_hook.js b/third-party/nopecha-chrome-extension/hcaptcha_hook.js new file mode 100644 index 0000000..736c349 --- /dev/null +++ b/third-party/nopecha-chrome-extension/hcaptcha_hook.js @@ -0,0 +1 @@ +(()=>{var e=function(){"use strict";Array.prototype.indexOf||(Array.prototype.indexOf=function(t){for(let e=0;eArray.prototype.slice.call(e,t);let e=null;"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?e=self:"undefined"!=typeof global?e=global:window&&(e=window);const t=e,u=e.document;var n="undefined"!=typeof navigator&&navigator.useragent?navigator.userAgent:"";let g=null;(/msie (\d+)/.test(n.toLowerCase())||/trident\/.*; rv:(\d+)/.test(n.toLowerCase()))&&(g=parseInt(RegExp.$1,10));function E(e,t){for(var n in e)if(!c(n)){var r=e[n];try{t[n]=r}catch(e){}}return t}function m(e,a,s){var t;for(t of Array.from(e))s._has(t)&&(a["on"+t]=(o=>function(e){var t,n,r={};for(t in e)c(t)||(n=e[t],r[t]=n===a?s:n);return s.dispatchEvent(o,r)})(t))}function b(o){let r={};const a=e=>r[e]||[],s={addEventListener:function(e,t,n){r[e]=a(e),0<=r[e].indexOf(t)||(n=void 0===n?r[e].length:n,r[e].splice(n,0,t))},removeEventListener:function(e,t){void 0===e?r={}:(void 0===t&&(r[e]=[]),-1!==(t=a(e).indexOf(t))&&a(e).splice(t,1))}};return s.dispatchEvent=function(){var t=i(arguments),e=t.shift(),n=(o||(t[0]=E(t[0],function(t){var e;if(u&&null!=u.createEventObject)return(e=u.createEventObject()).type=t,e;try{return new Event(t)}catch(e){return{type:t}}}(e))),s["on"+e]),r=(n&&n.apply(s,t),a(e).concat(a("*")));for(let e=0;e!(!r[e]&&!s["on"+e]),o&&(s.listeners=e=>i(a(e)),s.on=s.addEventListener,s.off=s.removeEventListener,s.fire=s.dispatchEvent,s.once=function(e,t){var n=function(){return s.off(e,n),t.apply(null,arguments)};return s.on(e,n)},s.destroy=()=>r={}),s}const L=["load","loadend","loadstart"],w=["progress","abort","error","timeout"],c=e=>["returnValue","totalSize","position"].includes(e);var x=function(e,t){let n;switch(null==t&&(t={}),typeof e){case"object":var r,o=[];for(r in e){var a=e[r];n=r.toLowerCase(),o.push(n+`: `+a)}return o.join("\n")+"\n";case"string":o=e.split("\n");for(var s of Array.from(o))/([^:]+):\s*(.+)/.test(s)&&(n=null!=RegExp.$1?RegExp.$1.toLowerCase():void 0,s=RegExp.$2,null==t[n])&&(t[n]=s);return t}return[]};function r(){const i=new R,u={};let o=null,a=void 0,c=void 0,l=void 0;var s=0;function t(){if(l.status=o||i.status,-1===o&&g<10||(l.statusText=i.statusText),-1!==o){var e,t=x(i.getAllResponseHeaders());for(e in t){var n,r=t[e];l.headers[e]||(n=e.toLowerCase(),l.headers[n]=r)}}}function r(e){for(;sO(l.headers[e?e.toLowerCase():void 0]),y.getAllResponseHeaders=()=>O(x(l.headers)),i.overrideMimeType&&(y.overrideMimeType=function(){i.overrideMimeType.apply(i,arguments)}),i.upload&&(v=b(),y.upload=v,u.upload=v),y.UNSENT=0,y.OPENED=1,y.HEADERS_RECEIVED=2,y.LOADING=3,y.DONE=4,y.response="",y.responseText="",y.responseXML=null,y.readyState=0,y.statusText="",y}const N=b(!0),O=e=>void 0===e?null:e,R=t.XMLHttpRequest;r.UNSENT=0,r.OPENED=1,r.HEADERS_RECEIVED=2,r.LOADING=3,r.DONE=4;var o={patch(){R&&(t.XMLHttpRequest=r)},unpatch(){R&&(t.XMLHttpRequest=R)},Native:R,XH:r};function a(e,u){null==u&&(u={headers:{}});let c=null;e instanceof Request?c=e:u.url=e;const l=N.listeners("before"),f=N.listeners("after");return new Promise(function(n,t){function r(e){var t;return f.length?2===(t=f.shift()).length?(t(a(),e),r(e)):3===t.length?t(a(),e,r):r(e):n(e)}function o(){var e;if(l.length)return 1===(e=l.shift()).length?s(e(u)):2===e.length&&e(a(),s);i()}const a=function(){return u.headers&&(u.headers=new Headers(u.headers)),c=c||new Request(u.url,u),E(u,c)},s=function(e){void 0!==e?(e=new Response(e.body||e.text,e),n(e),r(e)):o()};var i=()=>d(a()).then(e=>r(e)).catch(function(e){return n=t,r(e),t(e)});o()})}const d=t.fetch;var s={patch(){d&&(t.fetch=a)},unpatch(){d&&(t.fetch=d)},Native:d,XH:a};const l=N;return l.EventEmitter=b,l.before=function(e,t){if(e.length<1||2{"NopeCHA.metadata"===e.data.event&&i.push(e.data.metadata)}),window.postMessage({event:"NopeCHA.hook"}),e.before(e=>{try{var t,n,r;"POST"===(o=e).method&&o.url.startsWith("https://hcaptcha.com/checkcaptcha/")&&(t=JSON.parse(e.body),s(n=JSON.parse(t.motionData),a(r=function(e){var n={md:[],mm:[],mu:[]};for(const o of e)for(const a of Object.keys(n)){const s=0===n[a].length?0:n[a][n[a].length-1][2];var t=o[a].map(e=>[Math.ceil(e[0]),Math.ceil(e[1]),Math.ceil(e[2]+s)]);n[a].push(...t)}for(const i of Object.keys(n)){var r=[];let e=null;for(const u of n[i])null!==e&&r.push(u[2]-e),e=u[2];let t=0;0e+t)/r.length),n[i+"-mp"]=t}return n}(i),n.st)),s(n.topLevel,a(r,n.topLevel.st,n.st)),t.motionData=JSON.stringify(n),e.body=JSON.stringify(t),i=[])}catch(e){}var o})})(); diff --git a/third-party/nopecha-chrome-extension/hcaptcha_language.js b/third-party/nopecha-chrome-extension/hcaptcha_language.js new file mode 100644 index 0000000..9f07d0d --- /dev/null +++ b/third-party/nopecha-chrome-extension/hcaptcha_language.js @@ -0,0 +1 @@ +(()=>{let e;function t(){var e=navigator.language.split("-")[0];for(const r of document.querySelectorAll('script[src*="hcaptcha.com/1/api.js"]')){var t=new URL(r.src);"en"!==(t.searchParams.get("hl")||e)&&(t.searchParams.set("hl","en"),r.src=t.toString())}}e=new MutationObserver(t),setTimeout(()=>{t(),e.observe(document.head,{childList:!0})},0)})(); diff --git a/third-party/nopecha-chrome-extension/icon/128.png b/third-party/nopecha-chrome-extension/icon/128.png new file mode 100644 index 0000000..6b3469a Binary files /dev/null and b/third-party/nopecha-chrome-extension/icon/128.png differ diff --git a/third-party/nopecha-chrome-extension/icon/128g.png b/third-party/nopecha-chrome-extension/icon/128g.png new file mode 100644 index 0000000..449a08d Binary files /dev/null and b/third-party/nopecha-chrome-extension/icon/128g.png differ diff --git a/third-party/nopecha-chrome-extension/icon/16.png b/third-party/nopecha-chrome-extension/icon/16.png new file mode 100644 index 0000000..39b0214 Binary files /dev/null and b/third-party/nopecha-chrome-extension/icon/16.png differ diff --git a/third-party/nopecha-chrome-extension/icon/16g.png b/third-party/nopecha-chrome-extension/icon/16g.png new file mode 100644 index 0000000..9cfab26 Binary files /dev/null and b/third-party/nopecha-chrome-extension/icon/16g.png differ diff --git a/third-party/nopecha-chrome-extension/icon/32.png b/third-party/nopecha-chrome-extension/icon/32.png new file mode 100644 index 0000000..cc85599 Binary files /dev/null and b/third-party/nopecha-chrome-extension/icon/32.png differ diff --git a/third-party/nopecha-chrome-extension/icon/32g.png b/third-party/nopecha-chrome-extension/icon/32g.png new file mode 100644 index 0000000..a3194ed Binary files /dev/null and b/third-party/nopecha-chrome-extension/icon/32g.png differ diff --git a/third-party/nopecha-chrome-extension/icon/48.png b/third-party/nopecha-chrome-extension/icon/48.png new file mode 100644 index 0000000..43e88dd Binary files /dev/null and b/third-party/nopecha-chrome-extension/icon/48.png differ diff --git a/third-party/nopecha-chrome-extension/icon/48g.png b/third-party/nopecha-chrome-extension/icon/48g.png new file mode 100644 index 0000000..ae5f142 Binary files /dev/null and b/third-party/nopecha-chrome-extension/icon/48g.png differ diff --git a/third-party/nopecha-chrome-extension/locate.js b/third-party/nopecha-chrome-extension/locate.js new file mode 100644 index 0000000..f8b92ea --- /dev/null +++ b/third-party/nopecha-chrome-extension/locate.js @@ -0,0 +1,74 @@ +(async()=>{var t,e;function n(){try{return window.self!==window.top}catch(t){return 1}}t=self,e=()=>(()=>{"use strict";var r,c,t,i={d:(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function l(t){return t&&t instanceof Element}i.r(e),i.d(e,{default:()=>V,getCssSelector:()=>L}),(t=r=r||{}).NONE="none",t.DESCENDANT="descendant",t.CHILD="child",(t=c=c||{}).id="id",t.class="class",t.tag="tag",t.attribute="attribute",t.nthchild="nthchild",t.nthoftype="nthoftype";const h={selectors:[c.id,c.class,c.tag,c.attribute],includeTag:!1,whitelist:[],blacklist:[],combineWithinSelector:!0,combineBetweenSelectors:!0,root:null,maxCombinations:Number.POSITIVE_INFINITY,maxCandidates:Number.POSITIVE_INFINITY};function o(t){return t instanceof RegExp}function n(t){return["string","function"].includes(typeof t)||o(t)}function u(t){return Array.isArray(t)?t.filter(n):[]}function s(t){var e=[Node.DOCUMENT_NODE,Node.DOCUMENT_FRAGMENT_NODE,Node.ELEMENT_NODE];return t instanceof Node&&e.includes(t.nodeType)}function p(t,e){return s(t)?(t.contains(e),t):s(t=e.getRootNode({composed:!1}))?(document,t):e.ownerDocument.querySelector(":root")}function f(t){return"number"==typeof t?t:Number.POSITIVE_INFINITY}function m(t=[]){var[t=[],...e]=t;return 0===e.length?t:e.reduce((t,e)=>t.filter(t=>e.includes(t)),t)}function g(t){return[].concat(...t)}function E(t){const n=t.map(e=>{if(o(e))return t=>e.test(t);if("function"==typeof e)return t=>{t=e(t);return"boolean"==typeof t&&t};if("string"!=typeof e)return()=>!1;{const n=new RegExp("^"+e.replace(/[|\\{}()[\]^$+?.]/g,"\\$&").replace(/\*/g,".+")+"$");return t=>n.test(t)}});return e=>n.some(t=>t(e))}function _(t,e,n){const i=Array.from(p(n,t[0]).querySelectorAll(e));return i.length===t.length&&t.every(t=>i.includes(t))}function b(t,e){e=null!=e?e:t.ownerDocument.querySelector(":root");var n=[];let i=t;for(;l(i)&&i!==e;)n.push(i),i=i.parentElement;return n}const a={[r.NONE]:{type:r.NONE,value:""},[r.DESCENDANT]:{type:r.DESCENDANT,value:" > "},[r.CHILD]:{type:r.CHILD,value:" "}},d=new RegExp(["^$","\\s"].join("|")),A=new RegExp(["^$"].join("|")),$=[c.nthoftype,c.tag,c.id,c.class,c.attribute,c.nthchild],y=E(["class","id","ng-*"]);function x({nodeName:t}){return`[${t}]`}function S({nodeName:t,nodeValue:e}){return`[${t}='${T(e)}']`}function w(n){var t=Array.from(n.attributes).filter(t=>{var[t,e]=[t.nodeName,n];return e=e.tagName.toLowerCase(),!(["input","option"].includes(e)&&"value"===t||y(t))});return[...t.map(x),...t.map(S)]}function N(t){return(t.getAttribute("class")||"").trim().split(/\s+/).filter(t=>!A.test(t)).map(t=>"."+T(t))}function v(t){var e=t.getAttribute("id")||"",n="#"+T(e),i=t.getRootNode({composed:!1});return!d.test(e)&&_([t],n,i)?[n]:[]}function C(t){var e=t.parentNode;if(e){e=Array.from(e.childNodes).filter(l).indexOf(t);if(-1t.tagName.toLowerCase()===e).indexOf(t);if(-1e[t])),r=function(t=[],e){var n=t.length;if(0===n)return[];var i=[...t];i[n-1]+=1;for(let t=n-1;0<=t;t--)if(i[t]>e){if(0===t)return I(n+1);i[t-1]++,i[t]=i[t-1]+1}return e*+,./;=?@^`~\\]/;function T(t=""){var e;return null!=(e=null==(e=null===CSS||void 0===CSS?void 0:CSS.escape)?void 0:e.call(CSS,t))?e:([e=""]=[t],e.split("").map(t=>":"===t?`\\${R} `:D.test(t)?"\\"+t:escape(t).replace(/%/g,"\\")).join(""))}const j={tag:P,id:function(t){return 0===t.length||1{return e[t=t]?e[t].join(""):""}).join("")}function J(t,e,n="",i){var r,o,s,a,d;i.root,s=function(a,n){const{blacklist:t,whitelist:e,combineWithinSelector:d,maxCombinations:c}=n,l=E(t),h=E(e);return function(){var{selectors:t,includeTag:e}=n,t=[].concat(t);return e&&!t.includes("tag")&&t.push("tag"),t}().reduce((t,e)=>{o=a,s=e;var n,i,r,o,s=(null!=(s=j[s])?s:()=>[])(o),s=([o=[],i,r]=[s,l,h],o.filter(t=>r(t)||!i(t))),s=([o=[],n]=[s,h],o.sort((t,e)=>{t=n(t),e=n(e);return t&&!e?-1:!t&&e?1:0}));return t[e]=d?k(s,{maxResults:c}):s.map(t=>[t]),t},{})}(t,o=i),a=s,d=o,s=g(function(){var{selectors:t,combineBetweenSelectors:e,includeTag:n,maxCandidates:i}=d,e=e?k(t,{maxResults:i}):t.map(t=>[t]);return n?e.map(B):e}().map(t=>{{var n=a;const i={};return t.forEach(t=>{var e=n[t];0{i=t.flatMap(e=>0===i.length?[{[n]:e}]:i.map(t=>Object.assign(Object.assign({},t),{[n]:e})))}),i}(i).map(U)}}).filter(t=>0r+" "+t),...o.map(t=>r+" > "+t)]))if(_(t,e,i.root))return e;return null}function z(t){return{value:t,include:!1}}function G({selectors:e,operator:t}){let n=[...$],i=(e[c.tag]&&e[c.nthoftype]&&(n=n.filter(t=>t!==c.tag)),"");return n.forEach(t=>{(e[t]||[]).forEach(({value:t,include:e})=>{e&&(i+=t)})}),t.value+i}function F(t){return[":root",...b(t).reverse().map(t=>{t=function(n,t,e=r.NONE){const i={};return t.forEach(t=>{var e;Reflect.set(i,t,(e=n,t=t,H[t](e).map(z)))}),{element:n,operator:a[e],selectors:i}}(t,[c.nthchild],r.DESCENDANT);return t.selectors.nthchild.forEach(t=>{t.include=!0}),t}).map(G)].join("")}function L(t,e={}){const o=function(t){t=(Array.isArray(t)?t:[t]).filter(l);return[...new Set(t)]}(t),s=([t,e={}]=[o[0],e],e=Object.assign(Object.assign({},h),e),{selectors:(n=e.selectors,Array.isArray(n)?n.filter(t=>{return e=c,t=t,Object.values(e).includes(t);var e}):[]),whitelist:u(e.whitelist),blacklist:u(e.blacklist),root:p(e.root,t),combineWithinSelector:!!e.combineWithinSelector,combineBetweenSelectors:!!e.combineBetweenSelectors,includeTag:!!e.includeTag,maxCombinations:f(e.maxCombinations),maxCandidates:f(e.maxCandidates)});var n;let a="",d=s.root;function i(){var[t,e,n="",i]=[o,d,a,s];if(0!==t.length){var r,e=[1b(t,r))).map(t=>[t]))];for(const t of e){const e=J(t,0,n,i);if(e)return{foundElements:t,selector:e}}}return null}let r=i();for(;r;){const{foundElements:t,selector:c}=r;if(_(o,c,s.root))return c;d=t[0],a=c,r=i()}return(1L(t,s)):o.map(F)).join(", ")}const V=L;return e})(),"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CssSelectorGenerator=e():t.CssSelectorGenerator=e();class r{constructor(t,e=!1){this.NAMESPACE="__NOPECHA__",this.MARK_RADIUS=5,this.window_id=Util.generate_id(8),this.locate=t,this.draw_mark=e,this.update_timer,this.css_selector,this.$last,this.initialize_style(),this.initialize_elements()}initialize_style(){var t=[`#${this.NAMESPACE}_wrapper { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: transparent; + pointer-events: none; + z-index: 10000000; + }`,`.${this.NAMESPACE}_textbox { + display: flex; + flex-direction: row; + flex-wrap: wrap; + + position: absolute; + left: 0; + right: 0; + + background-color: rgba(0, 0, 0, 1); + color: #fff; + font: normal 12px/12px Helvetica, sans-serif; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3); + border: 1px solid #fff; + overflow: hidden; + }`,`.${this.NAMESPACE}_textbox.${this.NAMESPACE}_header { + top: 0; + }`,`.${this.NAMESPACE}_textbox.${this.NAMESPACE}_header > div { + padding: 4px 8px; + }`,`.${this.NAMESPACE}_textbox.${this.NAMESPACE}_header > div:first-child { + flex-grow: 1; + }`,`.${this.NAMESPACE}_textbox.${this.NAMESPACE}_footer { + bottom: 0; + }`,`.${this.NAMESPACE}_textbox.${this.NAMESPACE}_footer > div { + padding: 4px 8px; + }`,`.${this.NAMESPACE}_textbox.${this.NAMESPACE}_footer > div:first-child { + flex-grow: 1; + }`,`.${this.NAMESPACE}_highlight { + position: absolute; + opacity: 0.4; + }`,`.${this.NAMESPACE}_highlight.${this.NAMESPACE}_margin { + background-color: rgb(230, 165, 18); + }`,`.${this.NAMESPACE}_highlight.${this.NAMESPACE}_border { + background-color: rgb(255, 204, 121); + }`,`.${this.NAMESPACE}_highlight.${this.NAMESPACE}_padding { + background-color: rgb(50, 255, 50); + }`,`.${this.NAMESPACE}_highlight.${this.NAMESPACE}_content { + background-color: rgb(0, 153, 201); + }`,`.${this.NAMESPACE}_mark { + position: absolute; + top: 0; + left: 0; + right: 0; + + width: ${parseInt(2*this.MARK_RADIUS)}px; + height: ${parseInt(2*this.MARK_RADIUS)}px; + background-color: #f44; + border-radius: 50%; + z-index: 2; + }`];n()||t.push(`.${this.NAMESPACE}_shadow { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(0, 0, 0, 0.2); + pointer-events: none; + z-index: 1; + }`),this.$style=document.createElement("style"),this.$style.type="text/css",this.$style.styleSheet?this.$style.styleSheet.cssText=t.join("\n"):this.$style.innerHTML=t.join("\n"),document.getElementsByTagName("head")[0].appendChild(this.$style)}initialize_elements(){var t;this.$wrapper=document.createElement("div"),this.$wrapper.id=this.NAMESPACE+"_wrapper",document.body.append(this.$wrapper),this.$shadow=document.createElement("div"),this.$shadow.classList.add(this.NAMESPACE+"_shadow"),this.$wrapper.append(this.$shadow),this.$margin_box=document.createElement("div"),this.$margin_box.classList.add(this.NAMESPACE+"_highlight",this.NAMESPACE+"_margin"),this.$wrapper.append(this.$margin_box),this.$border_box=document.createElement("div"),this.$border_box.classList.add(this.NAMESPACE+"_highlight",this.NAMESPACE+"_border"),this.$wrapper.append(this.$border_box),this.$padding_box=document.createElement("div"),this.$padding_box.classList.add(this.NAMESPACE+"_highlight",this.NAMESPACE+"_padding"),this.$wrapper.append(this.$padding_box),this.$content_box=document.createElement("div"),this.$content_box.classList.add(this.NAMESPACE+"_highlight",this.NAMESPACE+"_content"),this.$wrapper.append(this.$content_box),n()||(this.$header=document.createElement("div"),this.$header.classList.add(this.NAMESPACE+"_textbox",this.NAMESPACE+"_header"),t="textcaptcha_image_selector"===this.locate?"Image":"Input",this.$header.innerHTML=` +
+
Click on the CAPTCHA ${t} element to generate a CSS selector.
+
Press ESC to cancel.
+
+
NopeCHA
+ `,this.$wrapper.append(this.$header),this.$footer=document.createElement("div"),this.$footer.classList.add(this.NAMESPACE+"_textbox",this.NAMESPACE+"_footer"),this.$wrapper.append(this.$footer)),this.draw_mark&&(this.$mark=document.createElement("div"),this.$mark.classList.add(this.NAMESPACE+"_mark"),this.$wrapper.append(this.$mark))}clip(t){var e={top:Math.max(0,t.top),left:Math.max(0,t.left),width:t.width+t.left>window.innerWidth?window.innerWidth-t.left:t.width,height:t.height+t.top>window.innerHeight?window.innerHeight-t.top:t.height};return t.top<0&&(e.height+=t.top),t.left<0&&(e.width+=t.left),e.width<0&&(e.width=0),e.height<0&&(e.height=0),e}computed_style(t,e){let n=window.getComputedStyle(t).getPropertyValue(e);for(const i in n=n.match(/[\-]?[\d\.]+px/g))n[i]=parseFloat(n[i].replace("px",""));return 1===n.length&&n.push(n[0],n[0],n[0]),2===n.length&&n.push(n[0],n[1]),3===n.length&&n.push(n[1]),n}add_dim(t,e){for(const n of e)t.top-=n[0],t.left-=n[3],t.width+=n[1]+n[3],t.height+=n[0]+n[2];return t}sub_dim(t,e){for(const n of e)t.top+=n[0],t.left+=n[3],t.width-=n[1]+n[3],t.height-=n[0]+n[2];return t}set_dim(t,e){e=this.clip(e);t.style.top=e.top+"px",t.style.left=e.left+"px",t.style.width=e.width+"px",t.style.height=e.height+"px"}get_center(t){t=t.getBoundingClientRect();return{x:t.left+t.width/2,y:t.top+t.height/2}}get_css(){return window.CssSelectorGenerator.getCssSelector(this.$t)}clear(){this.$t=null;var t={top:0,left:0,width:0,height:0};this.set_dim(this.$margin_box,t),this.set_dim(this.$border_box,t),this.set_dim(this.$padding_box,t),this.set_dim(this.$content_box,t),this.draw_mark&&(this.$mark.style.top="0px",this.$mark.style.left="0px")}update(a,t=0){const d=this;d.$last&&d.$last===a||(a&&(d.$t=a),d.$t&&(clearTimeout(d.update_timer),d.update_timer=setTimeout(()=>{var t,e,n,i,r,o,s;d.$t?.getBoundingClientRect&&(r=d.$t.getBoundingClientRect(),o=d.computed_style(d.$t,"margin"),s=d.computed_style(d.$t,"border-width"),t=d.computed_style(d.$t,"padding"),r={top:r.top,left:r.left,width:r.width,height:r.height},e=JSON.parse(JSON.stringify(r)),n=JSON.parse(JSON.stringify(r)),i=JSON.parse(JSON.stringify(r)),r=JSON.parse(JSON.stringify(r)),d.add_dim(e,[o]),d.sub_dim(i,[s]),d.sub_dim(r,[s,t]),d.set_dim(d.$margin_box,e),d.set_dim(d.$border_box,n),d.set_dim(d.$padding_box,i),d.set_dim(d.$content_box,r),o=d.get_css(d.$t),d.update_css_selector(d.window_id,o),BG.exec("Relay.send",{data:{action:"update_locate",window_id:d.window_id,css_selector:o}}),d.draw_mark)&&(s=d.get_center(a),d.$mark.style.top=parseInt(s.y-d.MARK_RADIUS)+"px",d.$mark.style.left=parseInt(s.x-d.MARK_RADIUS)+"px")},t)))}update_css_selector(t,e){this.window_id!==t&&this.clear(),n()||(this.$footer.innerHTML=`
${e}
`)}terminate(){clearTimeout(this.update_timer),this.$style.remove(),this.$wrapper.remove()}}let o=null;function s(t){t=t.target,t=o.get_css(t);BG.exec("Settings.set",{id:o.locate,value:t}),l(!0)}function a(t){t=t.target;o.update(t)}function d(t){o.update()}function c(t){t=t||window.event;let e=!1;(e="key"in t?"Escape"===t.key||"Esc"===t.key:27===t.keyCode)&&l(!0)}function l(t){try{document.body.removeEventListener("click",s),document.body.removeEventListener("mousemove",a),document.body.removeEventListener("mousewheel",d),document.body.removeEventListener("keydown",c),o.terminate(),o=null}catch(t){}t&&BG.exec("Relay.send",{data:{action:"stop_locate"}})}chrome.runtime.onMessage.addListener((t,e,n)=>{var i;"start_locate"===t.action?(i=t.locate,o=new r(i),document.body.addEventListener("click",s),document.body.addEventListener("mousemove",a),document.body.addEventListener("mousewheel",d),document.body.addEventListener("keydown",c)):"stop_locate"===t.action?l(!1):"update_locate"===t.action&&o.update_css_selector(t.window_id,t.css_selector)})})(); diff --git a/third-party/nopecha-chrome-extension/manifest.json b/third-party/nopecha-chrome-extension/manifest.json new file mode 100644 index 0000000..5e0fbe8 --- /dev/null +++ b/third-party/nopecha-chrome-extension/manifest.json @@ -0,0 +1,3 @@ +{ +"update_url": "https://clients2.google.com/service/update2/crx", +"name": "NopeCHA: CAPTCHA Solver", "version": "0.3.3", "description": "Automatically solve reCAPTCHA, hCaptcha, FunCAPTCHA, AWS WAF, and text CAPTCHA using AI.", "permissions": ["declarativeNetRequest", "storage", "scripting", "contextMenus"], "content_scripts": [{"matches": [""], "js": ["utils.js", "content.js"], "run_at": "document_start", "all_frames": true, "match_about_blank": true}, {"matches": ["*://nopecha.com/setup"], "js": ["setup.js"], "run_at": "document_end", "all_frames": true, "match_about_blank": false}, {"matches": ["*://*.hcaptcha.com/captcha/*"], "js": ["hcaptcha.js"], "run_at": "document_end", "all_frames": true, "match_about_blank": false}, {"matches": ["*://*.hcaptcha.com/captcha/*"], "js": ["hcaptcha_fast.js"], "run_at": "document_start", "all_frames": true, "match_about_blank": false}, {"matches": [""], "js": ["hcaptcha_language.js"], "run_at": "document_end", "all_frames": true, "match_about_blank": false}, {"matches": [""], "js": ["recaptcha.js", "recaptcha_speech.js"], "run_at": "document_end", "all_frames": true, "match_about_blank": false}, {"matches": ["*://*.google.com/recaptcha/*", "*://*.recaptcha.net/recaptcha/*", "*://recaptcha.net/recaptcha/*"], "js": ["recaptcha_fast.js"], "run_at": "document_start", "all_frames": true, "match_about_blank": false}, {"matches": ["*://*.arkoselabs.com/fc/*", "*://*.funcaptcha.com/fc/*"], "js": ["funcaptcha.js", "funcaptcha_scrape.js"], "run_at": "document_end", "all_frames": true, "match_about_blank": true}, {"matches": ["*://*.arkoselabs.com/fc/*", "*://*.funcaptcha.com/fc/*"], "js": ["funcaptcha_fast.js"], "run_at": "document_start", "all_frames": true, "match_about_blank": true}, {"matches": ["*://nopecha.com/demo/funcaptcha"], "js": ["funcaptcha_demo.js"], "run_at": "document_end", "all_frames": false, "match_about_blank": false}, {"matches": [""], "js": ["awscaptcha.js"], "run_at": "document_end", "all_frames": true, "match_about_blank": false}, {"matches": [""], "js": ["textcaptcha.js", "locate.js"], "run_at": "document_end", "all_frames": true, "match_about_blank": true}], "icons": {"16": "icon/16.png", "32": "icon/32.png", "48": "icon/48.png", "128": "icon/128.png"}, "manifest_version": 3, "action": {"default_title": "NopeCHA: CAPTCHA Solver", "default_icon": "icon/16.png", "default_popup": "popup.html"}, "background": {"service_worker": "background.js", "type": "module"}, "host_permissions": [""]} \ No newline at end of file diff --git a/third-party/nopecha-chrome-extension/popup.css b/third-party/nopecha-chrome-extension/popup.css new file mode 100644 index 0000000..f3286d4 --- /dev/null +++ b/third-party/nopecha-chrome-extension/popup.css @@ -0,0 +1,801 @@ +@font-face { + font-family: 'plex-sans'; + font-style: normal; + font-weight: 700; + src: url('font/plex-sans-bold.woff2') format('woff2'), url('font/plex-sans-bold.woff') format('woff'); +} + +@font-face { + font-family: 'plex-sans'; + font-style: normal; + font-weight: 400; + src: url('font/plex-sans-regular.woff2') format('woff2'), url('font/plex-sans-regular.woff') format('woff'); +} + +* { + font-family: 'plex-sans'; + box-sizing: border-box; + outline: none; +} +html { + width: 340px; +} +body { + width: 324px; +} +html, body { + background: #1a2432; + color: #fff; + line-height: 1.15; + text-size-adjust: 100%; +} +div { + display: block; +} +a { + text-decoration: none; +} +button, input, optgroup, select, textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0px; +} +button, select { + text-transform: none; +} +button, input { + overflow: visible; +} +input { + writing-mode: horizontal-tb !important; + font-style: ; + font-variant-ligatures: ; + font-variant-caps: ; + font-variant-numeric: ; + font-variant-east-asian: ; + font-weight: ; + font-stretch: ; + font-size: ; + font-family: ; + text-rendering: auto; + color: fieldtext; + letter-spacing: normal; + word-spacing: normal; + line-height: normal; + text-transform: none; + text-indent: 0px; + text-shadow: none; + display: inline-block; + text-align: start; + appearance: auto; + -webkit-rtl-ordering: logical; + cursor: text; + background-color: field; + margin: 0em; + padding: 1px 2px; + border-width: 2px; + border-style: inset; + border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133)); + border-image: initial; +} +.text_input { + background-color: transparent; + padding: 8px 8px 8px 16px; + color: rgb(255, 255, 255); + outline: none; + border: none; + width: 100%; + font-size: 14px; +} +.text_input.small { + width: 30%; +} +.text_input.text_right { + text-align: right; +} +.hidden { + display: none !important; +} +.hiddenleft { + transform: translateX(-100%) translateZ(0px); +} +.red { + color: #ff6961 !important; +} + +/* Remove arrows from number input */ +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} +input[type=number] { + -moz-appearance: textfield; +} + +/* SCROLLBAR */ + +::-webkit-scrollbar { + width: 6px; + right: 2px; + bottom: 2px; + top: 2px; + border-radius: 3px; +} +::-webkit-scrollbar-track { + background: transparent; +} +::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.2); +} + +/* LOADING OVERLAY */ + +#loading_overlay { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: #222; + z-index: 10; +} +#loading_overlay .loading_text { + margin-top: 8px; + font-size: 14px; + text-align: center; +} +#loading_overlay .loading_text.timeout > div { + opacity: 0; + animation: fadein 10s linear forwards; +} +#loading_overlay .loading_text.timeout > div:nth-child(1) { + animation-delay: 2000ms; +} +#loading_overlay .loading_text.timeout > div:nth-child(2) { + animation-delay: 4000ms; +} +#loading_overlay .loading_text.timeout > div:nth-child(3) { + animation-delay: 6000ms; +} +@keyframes fadein { + 0% {opacity: 0;} + 50% {opacity: 0;} + 100% {opacity: 1;} +} + +/* MISC */ +.clickable { + cursor: pointer !important; +} +.clickable:hover { + opacity: 0.8 !important; +} + +/* APP */ + +#app_frame { + display: flex; + flex-direction: column; + overflow: hidden; + transition: height ease 0.2s, min-height ease 0.2s; + min-height: 237px !important; +} + +/* HEADER */ + +.header { + box-sizing: border-box; + padding: 16px; + display: flex; + place-content: space-between; + font-weight: 400; +} +.header.spacedright { + margin-right: 32px; +} +.nav_icon { + border: none; + cursor: pointer; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + background: rgba(2, 13, 28, 0.05); + border-radius: 50%; + width: 32px; + height: 32px; + position: relative; + transition: all 0.3s ease 0s; + fill: rgba(255, 255, 255, 1); + background: rgba(255, 255, 255, 0.1) !important; +} +.nav_icon:hover { + opacity: 0.9; +} +.nav_icon:disabled, +.nav_icon:disabled:hover { + background: none !important; + cursor: unset; + opacity: 0.9; +} +.header_label_container { + box-sizing: border-box; + margin-right: 0px; + display: flex; + flex: 1 1 0%; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; +} +.header_label { + box-sizing: border-box; + font-size: 24px; + font-weight: bold; + display: flex; + color: rgb(255, 255, 255); +} + +/* PLAN */ + +.plan_info_box { + position: relative; + width: 100%; + height: 100%; +} +.plan_info_container { + display: flex; + box-sizing: border-box; + position: relative; +} +.plan_info { + box-sizing: border-box; + width: 100%; + padding: 0px 16px 16px; + display: flex; +} +.plan_label { + box-sizing: border-box; + font-weight: bold; + font-size: 14px; + color: rgb(255, 255, 255); +} +.plan_value { + box-sizing: border-box; + margin-left: auto; + display: flex; +} +.plan_button { + display: flex; + background-color: transparent; + color: rgba(255, 255, 255, 0.9); + width: auto; + padding: 0px; + border: none; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + transition: color 0.3s ease 0s, transform 0.1s ease-out 0s, opacity 0.3s ease 0s; +} +.plan_button.link { + color: #0a95ff; +} +.plan_button.link, +.plan_button.link:hover, +.plan_button_label { + box-sizing: border-box; + font-size: 14px; +} + +/* WARNING */ + +.warning_box { + display: flex; + flex-direction: column; + justify-content: center; + background: #1a2432; + position: absolute; + top: 0; + bottom: 8px; + left: 4px; + right: 4px; + border: 1px solid #FCD62E; + border-radius: 0.25rem; + padding: 0.5rem; + margin: 0 4px; + z-index: 1; +} +.warning_box * { + color: #fff; + font-size: 14px; + text-align: center; +} + +/* KEY */ + +.key_label { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + width: 100%; +} +.key_label > .instructions { + font-weight: normal; + line-height: 16px; + margin-left: 6px; + color: #fff; + font-size: 10px; +} +.settings_text[data-settings="key"] { + background: #1a2432; + position: absolute; + width: calc(100% - 32px); + transition: all ease 0.1s; + z-index: 1; +} +/* .edit_key { + line-height: 16px; + margin-right: 6px; + color: #fff; + font-size: 10px; +} */ +.edit_icon { + z-index: 2; +} + +/* MENU */ + +.menu { + box-sizing: border-box; + padding-left: 16px; +} +.menu_item_container { + border-top: none; + border-right: none; + border-left: none; + border-image: initial; + cursor: pointer; + display: flex; + -webkit-box-align: center; + align-items: center; + background-color: transparent; + width: 100%; + padding: 16px; + margin-top: 2px; + border-bottom: 2px solid rgba(255, 255, 255, 0.05); + color: rgba(255, 255, 255, 0.5); + transition: color 0.5s ease 0s, border 0.5s ease 0s; + -webkit-box-pack: justify !important; + justify-content: space-between !important; +} +.menu_item_container:hover { + color: rgb(255, 255, 255); +} +button.menu_item_container { + padding-left: 0px !important; +} +.button_label_container { + box-sizing: border-box; + -webkit-box-align: center; + align-items: center; + display: flex; +} +.button_label_container svg { + fill: rgb(255, 255, 255); +} +.button_label { + box-sizing: border-box; + margin-left: 16px; + font-size: 14px; + font-weight: bold; +} +.menu_item_arrow { + fill: rgb(255, 255, 255); + height: 16px; + width: 16px; +} + +/* #export { + color: rgba(255, 255, 255, 0.5); + font-size: 1.2em; + cursor: pointer; + transition: color 0.5s ease 0s, border 0.5s ease 0s; +} +#export:hover { + color: rgb(255, 255, 255); +} */ + +/* TAB */ + +.bbflex { + box-sizing: border-box; + display: flex; + -webkit-box-align: center; + align-items: center; +} +.scrolling_container { + box-sizing: border-box; + margin-top: 8px; + margin-left: 16px; + margin-right: 16px; + padding-bottom: 16px; +} +.settings_item_container { + box-sizing: border-box; + margin-bottom: 8px; + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 8px; + box-sizing: border-box; +} +.settings_item_container > a { + color: rgba(255, 255, 255, 0.5); + text-decoration: none; + transition: color 0.5s ease 0s, border 0.5s ease 0s; +} +.settings_item { + width: 100%; + background-color: rgba(255, 255, 255, 0.08); + min-height: 48px; + padding: 14px 16px 0px; + border-radius: 8px; +} +.settings_item > div { + -webkit-box-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + align-items: center; +} +.settings_item_label { + font-size: 14px; + font-weight: 600; + color: rgb(255, 255, 255); + padding-left: 16px; + height: 20px; + -webkit-box-align: center; + align-items: center; +} +.settings_toggle { + height: 20px; + max-width: 36px; + min-width: 36px; + border-radius: 10px; + padding: 2px; + transition: background-color 0.3s ease 0s; + opacity: 1; + cursor: pointer; +} +.settings_toggle > div { + width: 16px; + height: 16px; + border-radius: 50%; + transform: translate(16px); + transition: transform 0.3s ease 0s, background-color 0.3s ease 0s; +} +.settings_toggle.on { + background-color: rgb(0, 106, 255); +} +.settings_toggle.off { + background-color: rgb(255, 255, 255); +} +.settings_toggle.on > div { + background-color: rgb(255, 255, 255); + transform: translate(16px); +} +.settings_toggle.off > div { + background-color: rgb(2, 13, 28); + transform: translate(0px); +} +.settings_description_container { + padding: 10px 16px 8px; + -webkit-box-pack: justify; + justify-content: space-between; +} +.settings_description { + font-size: 12px; + color: rgba(255, 255, 255, 0.5); +} +.settings_button { + color: rgba(255, 255, 255, 0.5); + font-size: 14px; + gap: 16px; +} +.settings_button > div { + cursor: pointer; + transition: all 0.3s ease 0s; +} +.settings_button > div:hover { + color: rgb(255, 255, 255); +} +.settings_dropdown_selected { + color: rgba(255, 255, 255, 0.5); + -webkit-box-align: center; + align-items: center; + font-size: 14px; + cursor: pointer; + white-space: nowrap; +} +.settings_dropdown_selected > div { + box-sizing: border-box; + margin-right: 8px; +} +.settings_dropdown_options { + position: relative; + transition: visibility 0.3s ease 0s, opacity 0.3s ease 0s; + opacity: 0; + visibility: hidden; +} +.settings_dropdown_options > div { + position: absolute; + background-color: rgb(255, 255, 255); + border-radius: 4px; + right: 0px; + top: 50%; + transform: translateY(-50%); + border: 1px solid rgba(0, 0, 0, 0.15); + width: auto; + min-width: 60px; + white-space: nowrap; + box-shadow: rgb(0 0 0 / 15%) 0px 2px 4px 0px; + box-sizing: border-box; + padding: 4px; +} +.settings_dropdown_selected:hover > .settings_dropdown_options { + opacity: 1; + visibility: visible; +} +.settings_dropdown_options > div > div { + color: rgba(0, 0, 0, 0.5); + font-weight: 700; + border-radius: 4px; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; + line-height: normal; + font-size: 12px; + height: 23px; + cursor: pointer; + padding: 0px 4px; +} +.settings_dropdown_options > div > div:hover { + background-color: rgba(0, 0, 0, 0.08); +} +.settings_dropdown_options > div > div.selected { + color: rgb(0, 106, 255); +} + +/* FOOTER */ + +.footer { + display: flex; + flex-direction: row; + padding: 8px; + margin-top: 8px; + font-size: 10px; +} +.footer * { + color: rgba(255, 255, 255, 0.8); +} +.footer > *:nth-child(1) { + flex-grow: 1; +} + +/* LOADING ANIM */ + +.loading { + display: inline-block; + position: relative; + width: 32px; + height: 16px; +} +.loading div { + position: absolute; + top: 5px; + width: 6px; + height: 6px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.8); + animation-timing-function: cubic-bezier(0, 1, 1, 0); +} +.loading div:nth-child(1) { + left: 4px; + animation: loading1 0.6s infinite; +} +.loading div:nth-child(2) { + left: 4px; + animation: loading2 0.6s infinite; +} +.loading div:nth-child(3) { + left: 16px; + animation: loading2 0.6s infinite; +} +.loading div:nth-child(4) { + left: 28px; + animation: loading3 0.6s infinite; +} +@keyframes loading1 { + 0% { + transform: scale(0); + } + 100% { + transform: scale(1); + } +} +@keyframes loading3 { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0); + } +} +@keyframes loading2 { + 0% { + transform: translate(0, 0); + } + 100% { + transform: translate(12px, 0); + } +} + +/* POWER ANIM */ + +#power .btn { + width: 32px; + height: 32px; + transition: transform 0.3s ease 0s; +} +#power .btn.off { + transform: rotate(-180deg); +} +#power .btn_outline { + position: absolute; + z-index: 2; + height: 100%; +} +#power .btn_outline.spinning { + animation: 1s linear 0s infinite normal none running spinning; +} +@keyframes spinning { + 0% {transform: rotate(0deg);} + 100% {transform: rotate(360deg);} +} + +/* GLOW ANIM */ + +.hover_glow { + border: none; + outline: none; + cursor: pointer; + position: relative; + z-index: 0; + border-radius: 50%; +} +.hover_glow:before { + content: ''; + background: linear-gradient(45deg, #ff0000, #ff7300, #fffb00, #48ff00, #00ffd5, #002bff, #7a00ff, #ff00c8, #ff0000); + position: absolute; + top: -2px; + left:-2px; + background-size: 400%; + z-index: -1; + filter: blur(5px); + width: calc(100% + 4px); + height: calc(100% + 4px); + animation: glowing 20s linear infinite; + opacity: 0; + transition: opacity .3s ease-in-out; + border-radius: 50%; +} +.hover_glow:active:after { + background: transparent; +} +.hover_glow:hover:before { + opacity: 1; +} +.hover_glow:after { + z-index: -1; + content: ''; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + border-radius: 50%; +} +.hover_glow.static:before { + opacity: 1 !important; +} +@keyframes glowing { + 0% {background-position: 0 0;} + 50% {background-position: 400% 0;} + 100% {background-position: 0 0;} +} + + +/* BLACKLIST */ + +.settings_item_header { + box-sizing: border-box; + padding-top: 4px; + padding-bottom: 8px; + font-size: 12px; + background-color: rgb(26, 36, 50); + width: 100%; + letter-spacing: 2px; + font-weight: bold; + color: rgba(255, 255, 255, 0.5); + text-transform: uppercase; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + position: relative; + top: 12px; + z-index: 1; +} +.settings_item_container.list_item { + border-radius: 0; + border: none; + border-bottom: 2px solid rgba(255, 255, 255, 0.05); + padding-top: 16px; + padding-bottom: 16px; + margin-bottom: 0px; +} +.list_item_row { + box-sizing: border-box; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: justify; + justify-content: space-between; + width: 100%; + display: flex; +} +#current_page_host { + box-sizing: border-box; + font-size: 14px; + font-weight: bold; + color: rgb(255, 255, 255); + width: fit-content; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 220px; +} +.settings_text.text_input.list_input { + flex-grow: 1; + padding-left: 0; +} +.list_item_button { + border: none; + cursor: pointer; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + background-color: transparent; + padding: 0px; + transition: background-color 0.3s ease 0s, color 0.3s ease 0s, transform 0.1s ease-out 0s, opacity 0.3s ease 0s; + opacity: 0.5; + height: 32px; + width: 32px; + margin-right: -4px; +} +.list_item_button:hover { + opacity: 1.0; +} +.list_item_button:disabled, +.list_item_button:disabled:hover { + opacity: 0.3; + cursor: unset; +} + diff --git a/third-party/nopecha-chrome-extension/popup.html b/third-party/nopecha-chrome-extension/popup.html new file mode 100644 index 0000000..f1e8b87 --- /dev/null +++ b/third-party/nopecha-chrome-extension/popup.html @@ -0,0 +1,873 @@ + + + + + + + +
+ + + +
Loading
+
+
This is taking longer than usual.
+
Please close this window and try again.
+
If the problem persists, contact us on Discord
+
+
+ + + +
+ + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + + + +
+ +
+ +
+
+
Subscription Key
+
(Click to enter)
+
+
+ +
+
+
+ +
+ +
+ + +
+
+
Free Plan
+ +
+
+ +
+
+
Credits
+ +
+
+ +
+
+
Refills
+ +
+
+
+ + + + +
+ + + + + + + +
+ + + + + + + diff --git a/third-party/nopecha-chrome-extension/popup.js b/third-party/nopecha-chrome-extension/popup.js new file mode 100644 index 0000000..8eb710d --- /dev/null +++ b/third-party/nopecha-chrome-extension/popup.js @@ -0,0 +1 @@ +let plan=null,checking_server_plan=!1,rendering_server_plan=!1;function sleep(t){return new Promise(e=>setTimeout(t))}function get_loading_html(){return'
'}function number_with_comma(e){return(e=e||0).toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}async function check_plan(){var e=await BG.exec("Settings.get");e&&!checking_server_plan&&(checking_server_plan=!0,(plan=(plan=await BG.exec("Server.get_plan",{key:e.key})).error?{error:!0,plan:plan.message,credit:0,quota:0,duration:null,lastreset:null,current_period_start:1,current_period_end:1}:plan).subscription=["Starter","Basic","Professional","Enterprise"].includes(plan.plan),plan.invalid=!1,["Banned IP","Invalid key","Rate limit reached"].includes(plan.plan)?plan.invalid=!0:plan.plan=plan.plan+" Plan",plan.expired=!1,plan.subscription&&(e=Date.now()/1e3,plan.current_period_end-e<0)&&(plan.expired=!0,plan.credit=0,plan.quota=0),checking_server_plan=!1,document.querySelector("#loading_overlay").classList.add("hidden"))}async function render_plan(){var t=await BG.exec("Settings.get");if(t&&plan&&!rendering_server_plan){rendering_server_plan=!0;var t=document.querySelector("#plan"),n=document.querySelector("#credit"),a=document.querySelector("#refills"),s=document.querySelector("#ipbanned_warning"),d=Date.now()/1e3;let e=null;plan.lastreset&&plan.duration&&(e=Math.floor(Math.max(0,plan.duration-(d-plan.lastreset)))),t.innerHTML=plan.plan,plan.invalid||plan.error?t.classList.add("red"):t.classList.remove("red"),"Banned IP"===plan.plan?s.classList.remove("hidden"):s.classList.add("hidden"),n.innerHTML=number_with_comma(plan.credit)+" / "+number_with_comma(plan.quota),0===plan.credit?n.classList.add("red"):n.classList.remove("red"),plan.expired?(a.innerHTML="Expired",a.classList.add("red")):(plan.duration<0?(a.innerHTML="No refills",a.classList.add("red")):(e?(d=Time.seconds_as_hms(e),a.innerHTML=""+d):a.innerHTML=get_loading_html(),a.classList.remove("red")),1===plan.lastreset?(a.innerHTML="Not activated",a.classList.add("red")):0{clearTimeout(s),t.classList.add("hidden"),n.classList.add("hidden"),a.classList.contains("off")?(a.classList.remove("off"),t.classList.remove("hidden"),await BG.exec("Settings.set",{id:"enabled",value:!0}),await BG.exec("Icon.set",{status:"on"}),s=setTimeout(()=>{t.classList.add("hidden"),n.classList.remove("hidden")},1e3)):(await BG.exec("Settings.set",{id:"enabled",value:!1}),await BG.exec("Icon.set",{status:"off"}),a.classList.add("off"))});const d=document.querySelector('.settings_text[data-settings="key"]'),r=document.querySelector(".edit_icon"),l=document.querySelector(".key_label");function c(){d.classList.contains("hiddenleft")?(d.classList.remove("hiddenleft"),d.focus(),r.classList.remove("hidden"),l.classList.add("hidden")):(d.classList.add("hiddenleft"),r.classList.add("hidden"),l.classList.remove("hidden"))}document.querySelector("#edit_key").addEventListener("click",()=>{c(),check_plan()}),d.addEventListener("keydown",e=>{"Enter"===(e=e||window.event).key&&(c(),check_plan(),0{for(const e of document.querySelectorAll(".tab"))e.classList.add("hidden");document.querySelector(`[data-tab="${y.dataset.tabtarget}"]`).classList.remove("hidden")});function o(){document.querySelector(".tab:not(.hidden)").querySelector(".back")?.click()}document.addEventListener("mousedown",e=>{0<(8&(e=e||window.event).buttons)&&o()}),document.addEventListener("keydown",e=>{"Backspace"!==(e=e||window.event).key||e.target instanceof HTMLInputElement||o()});for(const[f,h]of Object.entries(i)){for(const g of document.querySelectorAll(`.settings_toggle[data-settings="${f}"]`))g.classList.remove("on","off"),g.classList.add(h?"on":"off"),g.addEventListener("click",async()=>{var e=g.classList.contains("off");await BG.exec("Settings.set",{id:f,value:e}),g.classList.remove("on","off"),g.classList.add(e?"on":"off")});for(const S of document.querySelectorAll(`.settings_dropdown[data-settings="${f}"]`))S.dataset.value===h&&(S.classList.add("selected"),document.querySelector(S.dataset.displays).innerHTML=S.innerHTML),S.addEventListener("click",async()=>{document.querySelector(`.settings_dropdown.selected[data-settings="${f}"]`)?.classList?.remove("selected");var e=S.dataset.value;await BG.exec("Settings.set",{id:f,value:e}),S.classList.add("selected"),document.querySelector(S.dataset.displays).innerHTML=S.innerHTML});for(const w of document.querySelectorAll(`.settings_text[data-settings="${f}"]`))w.value=h,w.addEventListener("input",async()=>{var e=w.value;await BG.exec("Settings.set",{id:f,value:e})})}for(const q of document.querySelectorAll(".locate"))q.addEventListener("click",async()=>{var e=q.dataset.key;await BG.exec("Relay.send",{data:{action:"start_locate",locate:e}}),window.close()});const u=document.querySelector("#disabled_hosts");async function p(e=!0){var t=new Set;for(const n of i.disabled_hosts)t.add(n.trim());i.disabled_hosts=[...t],await BG.exec("Settings.set",{id:"disabled_hosts",value:i.disabled_hosts}),e&&await v()}async function v(){u.innerHTML="";var e=document.querySelector("#template > #disabled_hosts_item");let t=null;for(const a in i.disabled_hosts){var n=i.disabled_hosts[a]?.trim();if(n){const s=e.cloneNode(!0),d=(s.id=null,s.querySelector("input.hostname"));d.value=n,d.addEventListener("input",()=>{clearTimeout(t),i.disabled_hosts[a]=d.value,t=setTimeout(async()=>{await p(!1)},200)}),s.querySelector(".remove").addEventListener("click",()=>{var e=i.disabled_hosts.indexOf(d.value);-1!==e&&(i.disabled_hosts.splice(e,1),p(!1)),s.remove()}),u.append(s)}}}!async function(){var e=await BG.exec("Tab.active");const t=(e.url||"Unknown Host").replace(/^(.*:)\/\/([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$/,"$2");document.querySelector("#current_page_host").innerHTML=t;let n=!0;e.url&&!i.disabled_hosts.includes(i.disabled_hosts)||(n=!1),e=document.querySelector("#add_current_page_host"),n?e.addEventListener("click",async()=>{i.disabled_hosts.push(t),await p()}):e.disabled=!0}(),v(),document.querySelector("#export").addEventListener("click",async()=>{var e=await BG.exec("Settings.get"),e=SettingsManager.export(e);window.open(e,"_blank")});var m="Version "+chrome.runtime.getManifest().version;for(const b of document.querySelectorAll(".footer")){var _=document.createElement("div"),L=(_.innerHTML=m,document.createElement("div"));L.innerHTML="2022 NopeCHA",b.append(_),b.append(L)}}async function main(){await init_ui(),await check_plan(),await render_plan(),setInterval(render_plan,500)}document.addEventListener("DOMContentLoaded",main); diff --git a/third-party/nopecha-chrome-extension/recaptcha.js b/third-party/nopecha-chrome-extension/recaptcha.js new file mode 100644 index 0000000..47cac37 --- /dev/null +++ b/third-party/nopecha-chrome-extension/recaptcha.js @@ -0,0 +1 @@ +(async()=>{function e(){var e="true"===document.querySelector(".recaptcha-checkbox")?.getAttribute("aria-checked"),t=document.querySelector("#recaptcha-verify-button")?.disabled;return e||t}function d(r=15e3){return new Promise(async e=>{for(var t=Time.time();;){var a=document.querySelectorAll(".rc-imageselect-tile"),c=document.querySelectorAll(".rc-imageselect-dynamic-selected");if(0r)return e(!1);await Time.sleep(100)}})}let p=null;function a(e=500){return new Promise(m=>{let h=!1;const f=setInterval(async()=>{if(!h){h=!0;var c=document.querySelector(".rc-imageselect-instructions")?.innerText?.split("\n"),r=await async function(e){let t=null;return(t=1{let i=null,t=!1,n=!1;function s(e){let t=e;for(;t&&!t.classList?.contains("rc-imageselect-tile");)t=t.parentNode;return t}function a(e,t,n=!1){!e||!n&&i===e||(!0===t&&e.classList.contains("rc-imageselect-tileselected")||!1===t&&!e.classList.contains("rc-imageselect-tileselected"))&&e.click()}document.addEventListener("mousedown",e=>{e=s(e?.target);e&&(n=e.classList.contains("rc-imageselect-tileselected")?t=!0:!(t=!0),i=e)}),document.addEventListener("mouseup",e=>{t=!1,i=null}),document.addEventListener("mousemove",e=>{e=s(e?.target);t&&(i!==e&&null!==i&&a(i,n,!0),a(e,n))});window.addEventListener("load",()=>{var e=document.body.appendChild(document.createElement("style")).sheet;e.insertRule(".rc-imageselect-table-33, .rc-imageselect-table-42, .rc-imageselect-table-44 {transition-duration: 0.5s !important}",0),e.insertRule(".rc-imageselect-tile {transition-duration: 2s !important}",1),e.insertRule(".rc-imageselect-dynamic-selected {transition-duration: 1s !important}",2),e.insertRule(".rc-imageselect-progress {transition-duration: 0.5s !important}",3),e.insertRule(".rc-image-tile-overlay {transition-duration: 0.5s !important}",4),e.insertRule("#rc-imageselect img {pointer-events: none !important}",5)})})(); diff --git a/third-party/nopecha-chrome-extension/recaptcha_speech.js b/third-party/nopecha-chrome-extension/recaptcha_speech.js new file mode 100644 index 0000000..fd09f38 --- /dev/null +++ b/third-party/nopecha-chrome-extension/recaptcha_speech.js @@ -0,0 +1 @@ +(async()=>{function e(){var e,t;if(!i())return e="true"===document.querySelector(".recaptcha-checkbox")?.getAttribute("aria-checked"),t=document.querySelector("#recaptcha-verify-button")?.disabled,e||t}function i(){return"Try again later"===document.querySelector(".rc-doscaptcha-header")?.innerText}async function t(){!0!==await BG.exec("Cache.get",{name:"recaptcha_widget_visible",tab_specific:!0})||e()||(await Time.sleep(500),document.querySelector("#recaptcha-anchor")?.click())}async function a(t){var a=await BG.exec("Cache.get",{name:"recaptcha_image_visible",tab_specific:!0});if(!0===a&&!e()&&!i()){a=document.querySelector(".rc-audiochallenge-tdownload-link")?.href,a=(fetch(a),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 c=Time.time(),a=await Net.fetch("https://engageub.pythonanywhere.com",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"input="+encodeURIComponent(a)+"&lang="+e});document.querySelector("#audio-response").value=a;a=parseInt(t.recaptcha_solve_delay_time)||1e3,t=t.recaptcha_solve_delay?a-(Time.time()-c):0;0{function e(){try{function t(t){return`

${t}

`}var e=[];for(const n of arguments)e.push(t(n));e.push(t('Join us on Discord')),document.body.innerHTML=e.join("
")}catch(t){}}try{var t,n;document.location.hash?(e("Importing settings..."),await BG.exec("Settings.get"),t=SettingsManager.import(document.location.hash),await BG.exec("Settings.update",{settings:t}),e(`Visiting this URL will import your NopeCHA settings. +${n}`,`Successfully imported settings. +`+JSON.stringify(t,null,4))):e("Invalid URL.\nPlease set the URL hash and reload the page.","Example: https://nopecha.com/setup#TESTKEY123")}catch(t){e("Failed to import settings.\nPlease verify that your URL is formed properly.")}})(); diff --git a/third-party/nopecha-chrome-extension/textcaptcha.js b/third-party/nopecha-chrome-extension/textcaptcha.js new file mode 100644 index 0000000..15f22eb --- /dev/null +++ b/third-party/nopecha-chrome-extension/textcaptcha.js @@ -0,0 +1 @@ +(async()=>{async function r(e){function c(a){return new Promise(e=>{const t=new Image;t.onload=()=>e(t),t.src=function(e){let t=e.style.backgroundImage;return t&&((e=t.trim().match(/(?!^)".*?"/g))&&0!==e.length||(t=null),t=e[0].replaceAll('"',"")),t}(a)})}try{return(await async function(e){var t=document.querySelector(e);if(t instanceof HTMLCanvasElement)return t;let a;if(a=t instanceof HTMLImageElement?t:await c(t))return(t=document.createElement("canvas")).width=a.naturalWidth,t.height=a.naturalHeight,t.getContext("2d").drawImage(a,0,0),t;throw Error("failed to get image element for "+e)}(e)).toDataURL("image/jpeg").split(";base64,")[1]}catch(e){return null}}let l=null;async function e(){var e,t,a,c,n=(e=500,await new Promise(t=>{let a=!1;const c=setInterval(async()=>{if(!a){a=!0;var e=await BG.exec("Settings.get");if(e.textcaptcha_auto_solve){e=await r(e.textcaptcha_image_selector);if(e&&l!==e)return l=e,clearInterval(c),a=!1,t({image_data:e})}a=!1}},e)}))["image_data"],i=await BG.exec("Settings.get");i.enabled&&i.textcaptcha_auto_solve&&(c=Time.time(),{job_id:t,data:n}=await NopeCHA.post({captcha_type:IS_DEVELOPMENT?"textcaptcha_dev":"textcaptcha",image_data:[n],key:i.key}),n)&&(a=(a=parseInt(i.textcaptcha_solve_delay_time))||100,0<(a=i.textcaptcha_solve_delay?a-(Time.time()-c):0)&&await Time.sleep(a),n)&&0 { + let getBackgroundPage = globalThis?.chrome?.extension?.getBackgroundPage; + if (getBackgroundPage){ + return getBackgroundPage() === window ? RunningAs.BACKGROUND : RunningAs.POPUP; + } + return globalThis?.chrome?.runtime?.onMessage ? RunningAs.CONTENT : RunningAs.WEB; +})(); + + +function deep_copy(obj) { + return JSON.parse(JSON.stringify(obj)); +} + + +class Util { + static CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + static pad_left(s, char, n) { + while (`${s}`.length < n) { + s = `${char}${s}`; + } + return s; + } + + static capitalize(s) { + return s.charAt(0).toUpperCase() + s.slice(1); + } + + static parse_int(s, fallback) { + if (!s) { + s = fallback; + } + return parseInt(s); + } + + static parse_bool(s, fallback) { + if (s === 'true') { + s = true; + } + else if (s === 'false') { + s = false; + } + else { + s = fallback; + } + return s; + } + + static parse_string(s, fallback) { + if (!s) { + s = fallback; + } + return s; + } + + static parse_json(s, fallback) { + if (!s) { + s = fallback; + } + else { + s = JSON.parse(s); + } + return s; + } + + static generate_id(n) { + let result = ''; + for (let i = 0; i < n; i++) { + result += Util.CHARS.charAt(Math.floor(Math.random() * Util.CHARS.length)); + } + return result; + } +} + + +class Time { + static time() { + if (!Date.now) { + Date.now = () => new Date().getTime(); + } + return Date.now(); + } + + static date() { + return new Date(); + } + + static sleep(i=1000) { + return new Promise(resolve => setTimeout(resolve, i)); + } + + static async random_sleep(min, max) { + const duration = Math.floor(Math.random() * (max - min) + min); + return await Time.sleep(duration); + } + + static seconds_as_hms(t) { + t = Math.max(0, t); + const hours = Util.pad_left(Math.floor(t / 3600), '0', 2); + t %= 3600; + const minutes = Util.pad_left(Math.floor(t / 60), '0', 2); + const seconds = Util.pad_left(Math.floor(t % 60), '0', 2); + return `${hours}:${minutes}:${seconds}`; + } + + static string(d=null) { + if (!d) { + d = Time.date(); + } + const month = Util.pad_left(d.getMonth() + 1, '0', 2); + const date = Util.pad_left(d.getDate(), '0', 2); + const year = d.getFullYear(); + const hours = Util.pad_left(d.getHours() % 12, '0', 2); + const minutes = Util.pad_left(d.getMinutes(), '0', 2); + const seconds = Util.pad_left(d.getSeconds(), '0', 2); + const period = d.getHours() >= 12 ? 'PM' : 'AM'; + return `${month}/${date}/${year} ${hours}:${minutes}:${seconds} ${period}`; + } +} + + +class SettingsManager { + static DEFAULT = { + version: 15, + key: '', + + enabled: true, + disabled_hosts: [], + + hcaptcha_auto_open: true, + hcaptcha_auto_solve: true, + hcaptcha_solve_delay: true, + hcaptcha_solve_delay_time: 3000, + + recaptcha_auto_open: true, + recaptcha_auto_solve: true, + recaptcha_solve_delay: true, + recaptcha_solve_delay_time: 2000, + recaptcha_solve_method: 'Image', + + funcaptcha_auto_open: true, + funcaptcha_auto_solve: true, + funcaptcha_solve_delay: true, + funcaptcha_solve_delay_time: 1000, + + awscaptcha_auto_open: true, + awscaptcha_auto_solve: true, + awscaptcha_solve_delay: true, + awscaptcha_solve_delay_time: 1000, + + textcaptcha_auto_solve: true, + textcaptcha_solve_delay: true, + textcaptcha_solve_delay_time: 100, + textcaptcha_image_selector: '', + textcaptcha_input_selector: '', + }; + + static ENCODE_FIELDS = { + enabled: {parse: Util.parse_bool, encode: encodeURIComponent}, + disabled_hosts: {parse: Util.parse_json, encode: e => encodeURIComponent(JSON.stringify(e))}, + + hcaptcha_auto_open: {parse: Util.parse_bool, encode: encodeURIComponent}, + hcaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + hcaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + hcaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + + recaptcha_auto_open: {parse: Util.parse_bool, encode: encodeURIComponent}, + recaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + recaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + recaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + recaptcha_solve_method: {parse: Util.parse_string, encode: encodeURIComponent}, + + funcaptcha_auto_open: {parse: Util.parse_bool, encode: encodeURIComponent}, + funcaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + funcaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + funcaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + + awscaptcha_auto_open: {parse: Util.parse_bool, encode: encodeURIComponent}, + awscaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + awscaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + awscaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + + textcaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + textcaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + textcaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + textcaptcha_image_selector: {parse: Util.parse_string, encode: encodeURIComponent}, + textcaptcha_input_selector: {parse: Util.parse_string, encode: encodeURIComponent}, + }; + + static IMPORT_URL = 'https://nopecha.com/setup'; + static DELIMITER = '|'; + + static export(settings) { + if (!settings.key) { + return false; + } + + const fields = [settings.key]; + for (const k in SettingsManager.ENCODE_FIELDS) { + fields.push(`${k}=${SettingsManager.ENCODE_FIELDS[k].encode(settings[k])}`); + } + + const encoded_hash = `#${fields.join(SettingsManager.DELIMITER)}`; + + return `${SettingsManager.IMPORT_URL}${encoded_hash}`; + } + + static import(encoded_hash) { + const settings = {}; + + // Split by delimiter + const fields = encoded_hash.split(SettingsManager.DELIMITER); + if (fields.length === 0) { + return settings; + } + + // Parse key + const key = fields.shift(); + if (key.length <= 1) { + console.error('invalid key for settings', key); + return settings; + } + settings.key = key.substring(1); + + // Parse additional fields + for (const field of fields) { + const kv = field.split('='); + const k = kv.shift(); + const v_raw = kv.join('='); + + if (!(k in SettingsManager.ENCODE_FIELDS)) { + console.error('invalid field for settings', field); + continue; + } + + const v = decodeURIComponent(v_raw); + console.log('v', v); + settings[k] = SettingsManager.ENCODE_FIELDS[k].parse(v, SettingsManager.DEFAULT[k]); + } + + return settings; + } +} diff --git a/third-party/nopecha-chrome-extension/utils.mjs b/third-party/nopecha-chrome-extension/utils.mjs new file mode 100644 index 0000000..d7bfee0 --- /dev/null +++ b/third-party/nopecha-chrome-extension/utils.mjs @@ -0,0 +1,270 @@ +'use strict'; + + +/** + * Set to true for the following behavior: + * - Request server to recognize using bleeding-edge models + * - Reload FunCAPTCHA on verification + */ +export const IS_DEVELOPMENT = false; + + +/** + * Trying to be an Enum but javascript doesn't have enums + */ +export class RunningAs { + // Background script running on-demand + static BACKGROUND = 'BACKGROUND'; + // Popup specified in manifest as "action" + static POPUP = 'POPUP'; + // Content script running in page + static CONTENT = 'CONTENT'; + // (somehow) Standalone run of script running in webpage + static WEB = 'WEB'; +} +Object.freeze(RunningAs); + + +export const runningAt = (() => { + let getBackgroundPage = globalThis?.chrome?.extension?.getBackgroundPage; + if (getBackgroundPage){ + return getBackgroundPage() === window ? RunningAs.BACKGROUND : RunningAs.POPUP; + } + return globalThis?.chrome?.runtime?.onMessage ? RunningAs.CONTENT : RunningAs.WEB; +})(); + + +export function deep_copy(obj) { + return JSON.parse(JSON.stringify(obj)); +} + + +export class Util { + static CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + static pad_left(s, char, n) { + while (`${s}`.length < n) { + s = `${char}${s}`; + } + return s; + } + + static capitalize(s) { + return s.charAt(0).toUpperCase() + s.slice(1); + } + + static parse_int(s, fallback) { + if (!s) { + s = fallback; + } + return parseInt(s); + } + + static parse_bool(s, fallback) { + if (s === 'true') { + s = true; + } + else if (s === 'false') { + s = false; + } + else { + s = fallback; + } + return s; + } + + static parse_string(s, fallback) { + if (!s) { + s = fallback; + } + return s; + } + + static parse_json(s, fallback) { + if (!s) { + s = fallback; + } + else { + s = JSON.parse(s); + } + return s; + } + + static generate_id(n) { + let result = ''; + for (let i = 0; i < n; i++) { + result += Util.CHARS.charAt(Math.floor(Math.random() * Util.CHARS.length)); + } + return result; + } +} + + +export class Time { + static time() { + if (!Date.now) { + Date.now = () => new Date().getTime(); + } + return Date.now(); + } + + static date() { + return new Date(); + } + + static sleep(i=1000) { + return new Promise(resolve => setTimeout(resolve, i)); + } + + static async random_sleep(min, max) { + const duration = Math.floor(Math.random() * (max - min) + min); + return await Time.sleep(duration); + } + + static seconds_as_hms(t) { + t = Math.max(0, t); + const hours = Util.pad_left(Math.floor(t / 3600), '0', 2); + t %= 3600; + const minutes = Util.pad_left(Math.floor(t / 60), '0', 2); + const seconds = Util.pad_left(Math.floor(t % 60), '0', 2); + return `${hours}:${minutes}:${seconds}`; + } + + static string(d=null) { + if (!d) { + d = Time.date(); + } + const month = Util.pad_left(d.getMonth() + 1, '0', 2); + const date = Util.pad_left(d.getDate(), '0', 2); + const year = d.getFullYear(); + const hours = Util.pad_left(d.getHours() % 12, '0', 2); + const minutes = Util.pad_left(d.getMinutes(), '0', 2); + const seconds = Util.pad_left(d.getSeconds(), '0', 2); + const period = d.getHours() >= 12 ? 'PM' : 'AM'; + return `${month}/${date}/${year} ${hours}:${minutes}:${seconds} ${period}`; + } +} + + +export class SettingsManager { + static DEFAULT = { + version: 15, + key: '', + + enabled: true, + disabled_hosts: [], + + hcaptcha_auto_open: true, + hcaptcha_auto_solve: true, + hcaptcha_solve_delay: true, + hcaptcha_solve_delay_time: 3000, + + recaptcha_auto_open: true, + recaptcha_auto_solve: true, + recaptcha_solve_delay: true, + recaptcha_solve_delay_time: 2000, + recaptcha_solve_method: 'Image', + + funcaptcha_auto_open: true, + funcaptcha_auto_solve: true, + funcaptcha_solve_delay: true, + funcaptcha_solve_delay_time: 1000, + + awscaptcha_auto_open: true, + awscaptcha_auto_solve: true, + awscaptcha_solve_delay: true, + awscaptcha_solve_delay_time: 1000, + + textcaptcha_auto_solve: true, + textcaptcha_solve_delay: true, + textcaptcha_solve_delay_time: 100, + textcaptcha_image_selector: '', + textcaptcha_input_selector: '', + }; + + static ENCODE_FIELDS = { + enabled: {parse: Util.parse_bool, encode: encodeURIComponent}, + disabled_hosts: {parse: Util.parse_json, encode: e => encodeURIComponent(JSON.stringify(e))}, + + hcaptcha_auto_open: {parse: Util.parse_bool, encode: encodeURIComponent}, + hcaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + hcaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + hcaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + + recaptcha_auto_open: {parse: Util.parse_bool, encode: encodeURIComponent}, + recaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + recaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + recaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + recaptcha_solve_method: {parse: Util.parse_string, encode: encodeURIComponent}, + + funcaptcha_auto_open: {parse: Util.parse_bool, encode: encodeURIComponent}, + funcaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + funcaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + funcaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + + awscaptcha_auto_open: {parse: Util.parse_bool, encode: encodeURIComponent}, + awscaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + awscaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + awscaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + + textcaptcha_auto_solve: {parse: Util.parse_bool, encode: encodeURIComponent}, + textcaptcha_solve_delay: {parse: Util.parse_bool, encode: encodeURIComponent}, + textcaptcha_solve_delay_time: {parse: Util.parse_int, encode: encodeURIComponent}, + textcaptcha_image_selector: {parse: Util.parse_string, encode: encodeURIComponent}, + textcaptcha_input_selector: {parse: Util.parse_string, encode: encodeURIComponent}, + }; + + static IMPORT_URL = 'https://nopecha.com/setup'; + static DELIMITER = '|'; + + static export(settings) { + if (!settings.key) { + return false; + } + + const fields = [settings.key]; + for (const k in SettingsManager.ENCODE_FIELDS) { + fields.push(`${k}=${SettingsManager.ENCODE_FIELDS[k].encode(settings[k])}`); + } + + const encoded_hash = `#${fields.join(SettingsManager.DELIMITER)}`; + + return `${SettingsManager.IMPORT_URL}${encoded_hash}`; + } + + static import(encoded_hash) { + const settings = {}; + + // Split by delimiter + const fields = encoded_hash.split(SettingsManager.DELIMITER); + if (fields.length === 0) { + return settings; + } + + // Parse key + const key = fields.shift(); + if (key.length <= 1) { + console.error('invalid key for settings', key); + return settings; + } + settings.key = key.substring(1); + + // Parse additional fields + for (const field of fields) { + const kv = field.split('='); + const k = kv.shift(); + const v_raw = kv.join('='); + + if (!(k in SettingsManager.ENCODE_FIELDS)) { + console.error('invalid field for settings', field); + continue; + } + + const v = decodeURIComponent(v_raw); + console.log('v', v); + settings[k] = SettingsManager.ENCODE_FIELDS[k].parse(v, SettingsManager.DEFAULT[k]); + } + + return settings; + } +}