[Premium] H-Captcha Solver by Andrewblood

Use the 2Captcha service to successfully complete the H-Captcha

在您安裝前,Greasy Fork希望您了解本腳本包含“負面功能”,可能幫助腳本的作者獲利,而不能給你帶來任何收益。

作者從這份腳本獲得佣金, 例如透過重寫連結或提供優惠券代碼以加入推薦或附屬代碼 腳本的作者解釋: Referral-Link is in this Script integrated.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         [Premium] H-Captcha Solver by Andrewblood
// @namespace    https://greasyfork.org/users/1162863
// @version      1.0.3
// @description  Use the 2Captcha service to successfully complete the H-Captcha
// @author       Andrewblood
// @match        *://*/*
// @exclude      *challenges.cloudflare.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=coinfinity.top
// @noframes
// @grant        GM_xmlhttpRequest
// @antifeature  referral-link     Referral-Link is in this Script integrated.
// @license      Copyright Andrewblood
// ==/UserScript==
/*

!!! You need balance on https://2captcha.com/?from=19960724 and the price is 2,99$ for 1000 h-captchas !!!

1) Please open a new Account at https://2captcha.com/?from=19960724
2) Deposit your choosen amounnt of money. (I have 10$ every 3 months)
3) Insert your API key from the Dashboard at the beginning of this script source/code.
4) If one site I don't have added the sitekey you can write a comment or add it under "sitekeys" manualy

You can find the sitekey of your domain when you press F12 in chrome browser for console and then press CRTL+F for searching elements.
Then you must only type/search for "site_key" or "sitekey" and look that it stand hcaptcha before the sitekey. (extract only the key)

*/
(function() {
    'use strict';

    // Number of questions to 2Captcha when the captcha is solved
    var maxAttempts = 60;

    // Wait time in milliseconds between questions
    var delay = 2000;

    // Your API Key from 2captcha.com (balance is needed)
    var apiKey = 'YOUR_API_KEY_HERE';

    var sitekeys = {
        'autofaucet.dutchycorp.space': '277d934d-3bdc-49bd-90bb-a73f9e0eef0d',
        "dutchycorp.space/shp2": "dcce507b-3d06-4cf7-a1b4-35d6b7fa4cd0",
        'dutchycorp.ovh': 'dcce507b-3d06-4cf7-a1b4-35d6b7fa4cd0',
        'playonpc.online': '215ae94b-b7f2-4cc6-9af0-ee259eca5ad1',
        "quins.us": "215ae94b-b7f2-4cc6-9af0-ee259eca5ad1",
        "gally.shop": "215ae94b-b7f2-4cc6-9af0-ee259eca5ad1",
        'wordcounter.icu': 'fbd3c1c5-bfa3-4f8f-a70f-cb612e3bb044',
        'adshnk.com': '7dee8357-7cd2-41d7-8b48-158f96365173',
        // "surflink.tech": "9ed65efe-ab27-4439-8d4a-edb52e6c796b",
        "shortit.pw": "da32ea56-c2ae-4b42-aa52-31fcfe240408",
        "dekhe.click": "2f9e938c-2526-45eb-8361-6b9a47caf978",
    };

    var titles = [
        'Just a moment', // Englisch
        '稍等片刻', // Chinesisch
        'Een ogenblik', // Holländisch
        'Un instant', // Französisch
        'Nur einen Moment', // Deutsch
        'Un momento', // Italienisch
        'Um momento', // Portugiesisch
        'Bir an', // Türkisch
        "Fly"
    ];
    if (titles.some(title => document.title.includes(title))) {
        console.log('Cloudflare Challenger page recognised. H-Captcha Solver Script is not executed.');
    } else if (apiKey == "YOUR_API_KEY_HERE") {
        console.log('Please enter a valid API key in the H-Captcha Solver Script.');
    } else {

        createTextElement();

        showMessage("H-Captcha Solver by Andrewblood is turned on and no captcha was found on this page.", "blue");

        const interval001 = setInterval(() => {
            const captchaElement = document.querySelector('#captchaShortlink, .h-captcha, .g-recaptcha-antibot');
            const captchaResponse = document.querySelector('[name="h-captcha-response"]');

            if (captchaElement) {
                clearInterval(interval001);
                showMessage('H-Captcha detected and look in script for a saved sitekey!', "green");

                // Aktuelle URL abrufen
                const currentURL = window.location.href;

                // Funktion, um den Sitekey basierend auf der URL zu finden
                const findSiteKey = () => {
                    for (const urlPart in sitekeys) {
                        if (currentURL.includes(urlPart)) {
                            return sitekeys[urlPart];
                        }
                    }
                    return null;
                };

                const sitekey = findSiteKey();

                if (sitekey) {
                    showMessage('H-Captcha and Sitekey found: Starting the resolving process.', "green");
                    getCaptchaResponse(sitekey)
                        .then(response => {
                        if (response && response.token) {
                            const captchaResponse = document.querySelector('[name="h-captcha-response"]');
                            if (captchaResponse) {
                                captchaResponse.value = response.token;
                                showMessage('Captcha successfully solved!', "green");
                                const invisibleButton = document.querySelector("#invisibleCaptchaShortlink");
                                if (invisibleButton) invisibleButton.removeAttribute("disabled");
                            } else {
                                showMessage('Captcha response element not found in the DOM.', "red");
                            }
                        } else {
                            showMessage('Failed to solve captcha', "red");
                            window.location.reload();
                        }
                    })
                        .catch(err =>console.log('Error fetching captcha response:', err));
                } else {
                    showMessage('Sitekey from this page is not saved in the script.', "red");
                }
            }
        }, 500);

        var textElement;
        function createTextElement() {
            textElement = document.createElement("div");
            textElement.style.position = "fixed";
            textElement.style.bottom = "0";
            textElement.style.left = "50%";
            textElement.style.transform = "translateX(-50%)";
            textElement.style.color = "blue";
            textElement.style.fontSize = "12px";
            textElement.style.zIndex = "9999";
            textElement.style.fontFamily = "Arial, sans-serif";
            textElement.style.textAlign = "center";
            textElement.style.display = "none";
            textElement.style.cursor = "pointer";

            textElement.addEventListener("click", function () {
                window.open("https://2captcha.com/?from=19960724", "_blank");
            });

            document.body.appendChild(textElement);
        }

        function showMessage(newText, color) {
            if (!textElement) {
                createTextElement();
            }
            textElement.innerText = newText;
            textElement.style.color = color;
            textElement.style.display = "block";
        };

        async function getCaptchaResponse(sitekey) {
            const requestUrl = `https://2captcha.com/in.php?key=${apiKey}&method=hcaptcha&sitekey=${sitekey}&pageurl=${window.location.href}`;

            return new Promise((resolve, reject) => {
                GM_xmlhttpRequest({
                    method: 'GET',
                    url: requestUrl,
                    onload: function(response) {
                        if (response.responseText.startsWith('OK|')) {
                            const captchaId = response.responseText.split('|')[1];
                            // print('Captcha ID:', captchaId);
                            pollCaptchaSolution(apiKey, captchaId).then(resolve).catch(reject);
                        } else {
                            console.log('Error sending captcha request:', response.responseText);
                            reject(response.responseText);
                        }
                    },
                    onerror: function(err) {
                        console.log('Error in GM_xmlhttpRequest:', err);
                        reject(err);
                    }
                });
            });
        }

        async function pollCaptchaSolution(apiKey, captchaId) {
            const resultUrl = `https://2captcha.com/res.php?key=${apiKey}&action=get&id=${captchaId}`;

            for (let attempt = 0; attempt < maxAttempts; attempt++) {
                await new Promise(resolve => setTimeout(resolve, delay));

                // Verwende GM_xmlhttpRequest anstelle von fetch
                const response = await new Promise((resolve, reject) => {
                    GM_xmlhttpRequest({
                        method: 'GET',
                        url: resultUrl,
                        onload: function(response) {
                            resolve(response.responseText);
                        },
                        onerror: function(err) {
                            console.log('Error in GM_xmlhttpRequest:', err);
                            reject(err);
                        }
                    });
                });

                if (response === 'CAPCHA_NOT_READY') {
                    showMessage('The captcha has been sent to 2Captcha and we are now waiting for the completed captcha as a response.', "green");
                    continue;
                }

                if (response.startsWith('OK|')) {
                    return { token: response.split('|')[1] };
                }

                console.log('Error fetching captcha solution:', response);
                return null;
            }

            showMessage('Captcha solution timed out', "red");
            return null;
        }
    }
})();