[Premium] Captcha Solver

90% succes rate on Firefaucet and Viefaucet helper

// ==UserScript==
// @name         [Premium] Captcha Solver
// @namespace    https://greasyfork.org/users/1162863
// @version      1.2
// @description  90% succes rate on Firefaucet and Viefaucet helper
// @author       Andrewblood
// @icon         https://coinfinity.top/favicon.ico

// @match        *://*.coinfinity.top/faucetlist*

// @match        *://*.firefaucet.win/viewptc*
// @match        *://*.viefaucet.com/*

// @grant        GM_addStyle
// @grant        window.focus
// @license      Copyright Andrewblood
// ==/UserScript==

(function() {
    'use strict';



    var CaptchaSolverStatus = document.createElement('div');
    document.body.appendChild(CaptchaSolverStatus);

    CaptchaSolverStatus.classList.add('captchasolver-status');
    GM_addStyle(`
                .captchasolver-status {
                position: fixed;
                font-size: 20px !important;
                top: 140px !important;
                right: 20px;
                z-index: 9999;
                pointer-events: none;
                }
                `);

    function setCaptchaSolverStatus(html, color) {
        if (color === 'green') {
            CaptchaSolverStatus.style.color = 'green';
        } else if (color === 'red') {
            CaptchaSolverStatus.style.color = 'red';
        } else {
            CaptchaSolverStatus.style.color = 'black';
        }
        CaptchaSolverStatus.innerHTML = html;
    }

    setCaptchaSolverStatus('<p><b>Captcha Solver:</b> Activated.</p>', 'green');


    if (window.location.href.includes('coinfinity.top/faucetlist')) {

        setTimeout(function() {
            if (!document.querySelector(".faucetmonitor-status")) {
                var FaucetMonitorStatus = document.createElement('div');
                GM_addStyle(`
                .faucetmonitor-status {
                position: fixed;
                font-size: 20px !important;
                top: 50px !important;
                right: 20px;
                z-index: 9999;
                }
                `);
                document.body.appendChild(FaucetMonitorStatus);
                FaucetMonitorStatus.classList.add('faucetmonitor-status');
                function setFaucetMonitorStatus(html, color) {
                    if (color === 'green') {
                        FaucetMonitorStatus.style.color = 'green';
                    } else if (color === 'red') {
                        FaucetMonitorStatus.style.color = 'red';
                    } else {
                        FaucetMonitorStatus.style.color = 'black';
                    }
                    FaucetMonitorStatus.innerHTML = html;
                }
                setFaucetMonitorStatus('<p><b>Faucet Monitor:</b> Deactivated. <a href="https://greasyfork.org/scripts/485334-premium-faucet-monitor" target="_blank">Install Here</a>.</p>', 'red');
            }

            if (!document.querySelector(".shortlinkmaker-status")) {
                var ShortlinkMakerStatus = document.createElement('div');
                document.body.appendChild(ShortlinkMakerStatus);

                ShortlinkMakerStatus.classList.add('shortlinkmaker-status');
                GM_addStyle(`
                .shortlinkmaker-status {
                position: fixed;
                font-size: 20px !important;
                top: 110px !important;
                right: 20px;
                z-index: 9999;
                }
                `);

                function setShortlinkMakerStatus(html, color) {
                    if (color === 'green') {
                        ShortlinkMakerStatus.style.color = 'green';
                    } else if (color === 'red') {
                        ShortlinkMakerStatus.style.color = 'red';
                    } else {
                        ShortlinkMakerStatus.style.color = 'black';
                    }
                    ShortlinkMakerStatus.innerHTML = html;
                }

                setShortlinkMakerStatus('<p><b>Shortlink Maker:</b> Deactivated. <a href="https://greasyfork.org/scripts/489437-premium-shortlink-maker" target="_blank">Install Here</a>.</p>', 'red');
            }
        }, 1000 * 3);





        var isCaptchaSolverOverlayOpened = false;
        var CaptchaSolverButton = createCaptchaSolverButton('Captcha Solver');

        function createCaptchaSolverButton(text) {
            var CaptchaSolverButton = document.createElement('button');
            CaptchaSolverButton.innerHTML = text;
            CaptchaSolverButton.classList.add('captchasolver-button');
            CaptchaSolverButton.addEventListener('click', function() {
                if (!isCaptchaSolverOverlayOpened) {
                    openCaptchaSolverOverlay();
                    isCaptchaSolverOverlayOpened = true;
                }
            });
            return CaptchaSolverButton;
        }

        function openCaptchaSolverOverlay() {
            var CaptchaSolverOverlay = createCaptchaSolverOverlay();
            var CaptchaSolverOverlayContent = createCaptchaSolverOverlayContent();
            CaptchaSolverOverlay.appendChild(CaptchaSolverOverlayContent);
            document.body.appendChild(CaptchaSolverOverlay);
            CaptchaSolverOverlay.addEventListener('click', function(event) {
                if (event.target === CaptchaSolverOverlay) {
                    CaptchaSolverOverlay.remove();
                    isCaptchaSolverOverlayOpened = false;
                }
            });
        }

        function createCaptchaSolverOverlay() {
            var CaptchaSolverOverlay = document.createElement('div');
            CaptchaSolverOverlay.classList.add('captchasolver-overlay');
            return CaptchaSolverOverlay;
        }

        function createCaptchaSolverOverlayContent() {
            var CaptchaSolverOverlayContent = document.createElement('div');
            CaptchaSolverOverlayContent.classList.add('captchasolver-overlay-content');
            CaptchaSolverOverlayContent.innerHTML = `
            <h2>Download Captcha Solver</h2>
			<ul>
				<li><b>HCaptcha + ReCaptcha:</b> NoCoding Data Scraper and CAPTCHA Solver - <a href="https://chromewebstore.google.com/search/minirpa.net" target="_blank">Install Here</a></li>
				<li><b>Antibot Words:</b> AB Links Solver - <a href="https://greasyfork.org/de/scripts/459453-ab-links-solver" target="_blank">Install Here</a></li>
				<li><b>Cf-Turnstile:</b> Autopass Cloudflare CAPTCHA - <a href="https://greasyfork.org/de/scripts/464785-autopass-cloudflare-captcha" target="_blank">Install Here</a></li>
			</ul>
            `;
            return CaptchaSolverOverlayContent;
        }

        document.body.appendChild(CaptchaSolverButton);

        GM_addStyle(`
            .captchasolver-button {
                position: fixed;
                bottom: 20px;
                left: calc(65%);
                transform: translateX(50%);
                padding: 10px;
                background: blue;
                color: white;
                border: none;
                border-radius: 5px;
                cursor: pointer;
                z-index: 9999;
            }

            .captchasolver-overlay {
                position: fixed;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                background: rgba(0, 0, 0, 0.7);
                z-index: 9998;
                display: flex;
                align-items: center;
                justify-content: center;
            }

            .captchasolver-overlay-content {
                width: 95%;
                height: 80%;
                background: white;
                padding: 20px;
                overflow: auto;
                text-align: center;
            }
        `);
    }





    if (window.location.href.includes("firefaucet.win/viewptc")) {

        GM_addStyle(`
    .imageOverlay {
        position: fixed;
        z-index: 9999;
        padding: 10px;
        border-radius: 5px;
    }
    .imageOverlay.original {
        top: 200px;
        right: 10px;
        background-color: rgba(0, 0, 0, 0.8);
        color: white;
    }
    .imageOverlay.processed {
        top: 300px;
        right: 10px;
        background-color: rgba(0, 0, 0, 0.8);
        color: white;
    }
    .imageOverlay img {
        max-width: 200px;
        max-height: 200px;
        width: auto;
        height: auto;
    }
`);

        // Create the original overlay div and add it to the document
        const originalOverlayDiv = document.createElement('div');
        originalOverlayDiv.classList.add('imageOverlay', 'original');
        document.body.appendChild(originalOverlayDiv);

        // Create the processed overlay div and add it to the document
        const processedOverlayDiv = document.createElement('div');
        processedOverlayDiv.classList.add('imageOverlay', 'processed');
        document.body.appendChild(processedOverlayDiv);

        // Create img elements for the original and processed images
        const originalImgElement = document.createElement('img');
        const processedImgElement = document.createElement('img');
        originalOverlayDiv.appendChild(originalImgElement);
        processedOverlayDiv.appendChild(processedImgElement);

        // Load Tesseract.js script
        var tesseractScript = document.createElement('script');
        tesseractScript.src = 'https://cdnjs.cloudflare.com/ajax/libs/tesseract.js/5.0.4/tesseract.min.js';
        tesseractScript.onload = function() {

            // Load Tesseract worker
            var workerScript = document.createElement('script');
            workerScript.src = 'https://cdnjs.cloudflare.com/ajax/libs/tesseract.js/5.0.4/worker.min.js';
            workerScript.onload = function() {
                console.log("Tesseract.js loaded");

                // OpenCV script
                var opencvScript = document.createElement('script');
                opencvScript.src = 'https://docs.opencv.org/4.5.5/opencv.js';
                opencvScript.onload = function() {
                    console.log("OpenCV.js loaded");

                    // Funktion zum Polling bis das Element sichtbar ist
                    function waitForElement(selector, callback) {
                        const element = document.querySelector(selector);
                        if (element && element.offsetHeight > 1) {
                            callback(element);
                        } else {
                            setTimeout(() => waitForElement(selector, callback), 1000);
                        }
                    }

                    // Funktion zum Laden und Bearbeiten des Bildes
                    function loadAndProcessImage() {

                        // Überwachungsfunktion, die in bestimmten Intervallen prüft, ob das Bild vorhanden ist
                        let interval = setInterval(function() {
                            let imgElement = document.querySelector("#description > img");
                            if (imgElement) {
                                clearInterval(interval); // Stoppe das Intervall, wenn das Bild vorhanden ist
                                setCaptchaSolverStatus('<p><b>Captcha Solver:</b> Picture found and start to edit the image...</p>', 'green')
                                originalImgElement.src = imgElement.src; // Zeige das Originalbild an
                                processImage(imgElement); // Lade und bearbeite das Bild
                            } else {
                                setCaptchaSolverStatus('<p><b>Captcha Solver:</b> Wait for picture...</p>', 'green')
                            }
                        }, 1000); // Überprüfe alle 1 Sekunde, ob das Bild vorhanden ist
                    }

                    // Funktion zum Laden und Bearbeiten des Bildes
                    function processImage(imgElement) {
                        let src = cv.imread(imgElement);

                        // Schritt 0: Vergrößere das Bild
                        let resized = new cv.Mat();
                        let dsize = new cv.Size(src.cols * 4, src.rows * 4); // Verdreifache die Größe des Bildes
                        cv.resize(src, resized, dsize, 0, 0, cv.INTER_LINEAR);

                        let dst = new cv.Mat();
                        let M = cv.Mat.ones(5, 5, cv.CV_8U);
                        let anchor = new cv.Point(-1, -1);

                        // Schritt 1: Ändere die Schriftfarbe auf Weiß und den Hintergrund auf Schwarz
                        cv.cvtColor(resized, dst, cv.COLOR_RGB2GRAY);
                        cv.threshold(dst, dst, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU);

                        // Schritt 2: Verwende Morphologie-Operationen, um das Bild zu bearbeiten
                        cv.dilate(dst, dst, M, anchor, 2, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());
                        //        cv.erode(dst, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());

                        // Schritt 3: Konvertiere das bearbeitete Bild zurück in ein DOM-Element
                        let canvas = document.createElement('canvas');
                        cv.imshow(canvas, dst);
                        let manipulatedImageSrc = canvas.toDataURL();

                        // Füge das bearbeitete Bild dem Overlay-DIV hinzu
                        processedImgElement.src = manipulatedImageSrc;

                        // Texterkennung mit Tesseract.js
                        Tesseract.recognize(
                            manipulatedImageSrc,
                            'eng',
                            {
                                logger: m => console.log("Tesseract Log:", m),
                                psm: 7,
                                oem: 3,
                                tessedit_char_whitelist: "0123456789"
                            }
                        ).then(({ data: { text } }) => {
                            console.log("Text from teseract:", text);

                            // Filtere nur Zahlen von 0 bis 9 aus dem erkannten Text
                            const filteredText = text.replace(/[^0-9]/g, '');

                            setCaptchaSolverStatus('<p><b>Captcha Solver:</b> Regonized Numbers <b>' + filteredText + '</b></p>', 'green')

                            var textField = document.querySelector("#description > input.captcha-input");

                            // Überprüfe, ob die Länge des Textes korrekt ist
                            if (filteredText.length === 4) {
                                textField.value = filteredText;

                            } else {
                                location.reload();
                            }
                        });

                        // Bereinige Ressourcen
                        src.delete();
                        dst.delete();
                        M.delete();
                        resized.delete();
                    }

                    // Starte das Laden und Bearbeiten des Bildes
                    loadAndProcessImage();
                };
                document.head.appendChild(opencvScript);
            };
            document.head.appendChild(workerScript);
        };
        document.head.appendChild(tesseractScript);
    }







    if (window.location.href.includes("viefaucet.com")){



/*


        GM_addStyle(`
    .imageOverlay {
        position: fixed;
        z-index: 9999;
        padding: 10px;
        border-radius: 5px;
    }
    .imageOverlay.original {
        top: 200px;
        right: 10px;
        background-color: rgba(0, 0, 0, 0.8);
        color: white;
    }
    .imageOverlay.processed {
        top: 450px;
        right: 10px;
        background-color: rgba(0, 0, 0, 0.8);
        color: white;
    }
    .imageOverlay img {
        max-width: 200px;
        max-height: 200px;
        width: auto;
        height: auto;
    }
`);

        // Create the original overlay div and add it to the document
        const originalOverlayDiv = document.createElement('div');
        originalOverlayDiv.classList.add('imageOverlay', 'original');
        document.body.appendChild(originalOverlayDiv);

        // Create the processed overlay div and add it to the document
        const processedOverlayDiv = document.createElement('div');
        processedOverlayDiv.classList.add('imageOverlay', 'processed');
        document.body.appendChild(processedOverlayDiv);

        // Create img elements for the original and processed images
        const originalImgElement = document.createElement('img');
        const processedImgElement = document.createElement('img');
        originalOverlayDiv.appendChild(originalImgElement);
        processedOverlayDiv.appendChild(processedImgElement);

        // Load Tesseract.js script
        var tesseractScript = document.createElement('script');
        tesseractScript.src = 'https://cdnjs.cloudflare.com/ajax/libs/tesseract.js/5.0.4/tesseract.min.js';
        tesseractScript.onload = function() {

            // Load Tesseract worker
            var workerScript = document.createElement('script');
            workerScript.src = 'https://cdnjs.cloudflare.com/ajax/libs/tesseract.js/5.0.4/worker.min.js';
            workerScript.onload = function() {
                console.log("Tesseract.js loaded");

                // OpenCV script
                var opencvScript = document.createElement('script');
                opencvScript.src = 'https://docs.opencv.org/4.5.5/opencv.js';
                opencvScript.onload = function() {
                    console.log("OpenCV.js loaded");

                    // Funktion zum Polling bis das Element sichtbar ist
                    function waitForElement(selector, callback) {
                        const element = document.querySelector(selector);
                        if (element && element.offsetHeight > 1) {
                            callback(element);
                        } else {
                            setTimeout(() => waitForElement(selector, callback), 1000);
                        }
                    }

                    // Funktion zum Laden und Bearbeiten des Bildes
                    function loadAndProcessImage() {

                        // Überwachungsfunktion, die in bestimmten Intervallen prüft, ob das Bild vorhanden ist
                        let interval = setInterval(function() {
                            let imgElement = document.querySelector(".captcha-image");
                            if (imgElement) {
                                clearInterval(interval); // Stoppe das Intervall, wenn das Bild vorhanden ist
                                setCaptchaSolverStatus('<p><b>Captcha Solver:</b> Picture found and start to edit the image.</p>', 'green')
                                originalImgElement.src = imgElement.src; // Zeige das Originalbild an
                                processImage(imgElement); // Lade und bearbeite das Bild
                            } else {
                                setCaptchaSolverStatus('<p><b>Captcha Solver:</b> Wait for picture.</p>', 'green')
                            }
                        }, 1000); // Überprüfe alle 1 Sekunde, ob das Bild vorhanden ist
                    }

                    // Funktion zum Laden und Bearbeiten des Bildes
                    function processImage(imgElement) {
                        let src = cv.imread(imgElement);

                        // Schritt 0: Vergrößere das Bild
                        let resized = new cv.Mat();
                        let dsize = new cv.Size(src.cols * 4, src.rows * 4); // Verdreifache die Größe des Bildes
                        cv.resize(src, resized, dsize, 0, 0, cv.INTER_LINEAR);

                        let dst = new cv.Mat();
                        let M = cv.Mat.ones(5, 5, cv.CV_8U);
                        let anchor = new cv.Point(-1, -1);

                        // Schritt 1: Ändere die Schriftfarbe auf schwarz und den Hintergrund auf weiss
                        cv.cvtColor(resized, dst, cv.COLOR_RGB2GRAY);
                        cv.threshold(dst, dst, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU);

                        // Schritt 2: Verwende Morphologie-Operationen, um das Bild zu bearbeiten
//                        cv.dilate(dst, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());
//                        cv.erode(dst, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());

                        // Schritt 3: Konvertiere das bearbeitete Bild zurück in ein DOM-Element
                        let canvas = document.createElement('canvas');
                        cv.imshow(canvas, dst);
                        let manipulatedImageSrc = canvas.toDataURL();

                        // Füge das bearbeitete Bild dem Overlay-DIV hinzu
                        processedImgElement.src = manipulatedImageSrc;

                        // Bereinige Ressourcen
                        src.delete();
                        dst.delete();
                        M.delete();
                        resized.delete();
                    }

                    // Starte das Laden und Bearbeiten des Bildes
                    loadAndProcessImage();
                };
                document.head.appendChild(opencvScript);
            };
            document.head.appendChild(workerScript);
        };
        document.head.appendChild(tesseractScript);


*/





        function VieCaptcha() {
            const targetElementSelector = '.check-box';
            const targetElement = document.querySelector(targetElementSelector);
            if (targetElement) {
                window.focus();
                setCaptchaSolverStatus('<p><b>Captcha Solver:</b> Captcha found please click the picture.</p>', 'green')
                targetElement.click();
            }
            const dotElement = document.querySelector('div.dot');
            if (dotElement) {
                const buttons = document.querySelectorAll('button');
                buttons.forEach(button => {
                    if (button.textContent.includes('Verify')) {
                        button.click();
                    }
                });
            }
        }
        setInterval(VieCaptcha, 1000);
    }



})();