├── README.md └── SurfingHawking.user.js /README.md: -------------------------------------------------------------------------------- 1 | # SurfingHawking / 冲浪霍金 2 | Automatically handle Cloudflare CAPTCHA challenges for seamless browsing experience 3 | 4 | 自动帮你点击 CF 验证页面的小按钮 5 | 6 | # How to install / 如何安装 7 | Click [here](https://github.com/Anankke/SurfingHawking/raw/master/SurfingHawking.user.js) / 点击[这里](https://github.com/Anankke/SurfingHawking/raw/master/SurfingHawking.user.js) 8 | -------------------------------------------------------------------------------- /SurfingHawking.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name SurfingHawking 3 | // @namespace Anankke 4 | // @match *://*/* 5 | // @version 0.0.1 6 | // @grant none 7 | // @run-at document-start 8 | // @author github.com @Anankke 9 | // @icon https://www.google.com/s2/favicons?sz=48&domain=cloudflare.com 10 | // @icon64 https://www.google.com/s2/favicons?sz=64&domain=cloudflare.com 11 | // @description Automatically handle Cloudflare CAPTCHA challenges for seamless browsing experience 12 | // ==/UserScript== 13 | 14 | async function waitForElement (selector, timeout = 30000, interval = 200) { 15 | return new Promise((resolve) => { 16 | const startTime = Date.now() 17 | const checkElement = () => { 18 | const element = document.querySelector(selector) 19 | if (element) { 20 | resolve(element) 21 | } else if (Date.now() - startTime < timeout) { 22 | setTimeout(checkElement, interval) 23 | } else { 24 | resolve(null) 25 | } 26 | } 27 | checkElement() 28 | }) 29 | } 30 | 31 | async function clickElement (selector) { 32 | const element = await waitForElement(selector) 33 | if (element && typeof element.click === 'function') { 34 | element.click() 35 | return true 36 | } 37 | return false 38 | } 39 | 40 | async function verifyYouAreHuman () { 41 | const rayId = document.querySelector('div.ray-id') 42 | const herfDOM = document.querySelector( 43 | 'a[href*=\'cloudflare.com\'][target=\'_blank\']') 44 | if (rayId && herfDOM) { 45 | await clickElement('input[value=\'Verify you are human\'][type=\'button\']') 46 | return 47 | } 48 | 49 | if (window.location.host === 'challenges.cloudflare.com' && 50 | document.querySelector('#success') && document.querySelector('#fail') && 51 | document.querySelector('#expired')) { 52 | await clickElement('input[type=\'checkbox\']') 53 | await clickElement('span.mark') 54 | return 55 | } 56 | 57 | if (document.querySelector('div.logo')) { 58 | await clickElement('input[value=\'Verify you are human\'][type=\'button\']') 59 | } 60 | } 61 | 62 | document.addEventListener('DOMContentLoaded', verifyYouAreHuman) 63 | --------------------------------------------------------------------------------