Typescript helpers

Special click, import and execute tesseract and opencv, alert blocking

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Typescript helpers
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Special click, import and execute tesseract and opencv, alert blocking
// @author       Andrewblood
// @match        *://*/*
// @icon         https://coinfinity.top/favicon.ico
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    window.alert = function() {
        // Nichts tun, um den Alert zu blockieren
    };

    window.confirm = function() {
        // Nichts tun, um den Alert zu blockieren
    };

    window.anonymous = function() {
        // Nichts tun, um den Alert zu blockieren
    };



// @grant        window.focus
// @grant        window.close
// @grant        unsafeWindow

    // Funktion für das Schließen der Tabs
    var oldFunction = unsafeWindow.open;
    var lastOpenedWindow = null; // Variable zur Speicherung des zuletzt geöffneten Fensters

    function closeAdFunction(url, target) {
        // Setze den Namen des Fensters
        var windowName = (target && target !== "_blank") ? target : "popUpWindow";

        // Öffne das Fenster und speichere die Referenz
        lastOpenedWindow = oldFunction(url, windowName);
        return lastOpenedWindow;
    }

    unsafeWindow.open = closeAdFunction;

    // Schließe das letzte geöffnete Fenster, wenn die Seite verlassen wird
    unsafeWindow.onbeforeunload = function() {
        if (lastOpenedWindow) {
            lastOpenedWindow.close(); // Schließe das Fenster
            lastOpenedWindow = null; // Setze die Referenz zurück
        }
    };



    // Functions for REAL Click
    function triggerMouseEvent(elm, eventType) {
        let clickEvent = document.createEvent('MouseEvents');
        clickEvent.initEvent(eventType, true, true);
        elm.dispatchEvent(clickEvent);
    }

    function alternativeClick(elm) {
        triggerMouseEvent(elm, "mouseover");
        triggerMouseEvent(elm, "mousedown");
        triggerMouseEvent(elm, "mouseup");
        triggerMouseEvent(elm, "click");
    }

    function specialClick(selector) {
        var interval001 = setInterval(function() {
            // Wähle den Button anhand des Selektors
            var button = document.querySelector(selector);
            // Wähle das CAPTCHA-Element und das Response-Element
            var captchaElement = document.querySelector(".captcha-modal, .g-recaptcha, .h-captcha");
            var captchaResponse = document.querySelector("#g-recaptcha-response, #g-recaptcha-response, #fform > center > div > div > input[type=hidden]");

            // Überprüfe, ob das CAPTCHA-Element vorhanden ist
            if (captchaElement) {
                // Falls das CAPTCHA ausgefüllt ist und der Button sichtbar und aktiv ist, klicke den Button
                if (captchaResponse && captchaResponse.value.length > 0 && button && button.offsetHeight > 0 && !button.hasAttribute('disabled')) {
                    alternativeClick(button);
                    console.log("Element is clicked.");
                    clearInterval(interval001);
                }
            } else {
                // Falls kein CAPTCHA vorhanden ist, überprüfe nur die Sichtbarkeit des Buttons
                if (button && button.offsetHeight > 0 && !button.hasAttribute('disabled')) {
                    alternativeClick(button);
                    console.log("Element is clicked.");
                    clearInterval(interval001);
                }
            }
        }, 500);
    }

    function searchFirstButtonWithInnerText(text) {
        let interval = setInterval(function() {
            let buttons = document.querySelectorAll('button');

            for (let button of buttons) {
                if (button.innerText.includes(text) && !button.hasAttribute('disabled') && button.offsetHeight > 0) {
                    setTimeout(function () {
                        alternativeClick(button);
                        console.log("Element is clicked.");
                        clearInterval(interval);
                    }, 1000);
                    break;
                }
            }
        }, 500);
    }



    // Mouse move on random position
    function getRandomNumber(min, max) {
        return Math.floor(Math.random() * (max - min) + min);
    }

    function randomDisplayNumber() {
        var screenWidth = window.innerWidth;
        var screenHeight = window.innerHeight;

        var randomX = getRandomNumber(0, screenWidth);
        var randomY = getRandomNumber(0, screenHeight);

        return { x: randomX, y: randomY };
    }

    function moveMouseTo(x, y) {
        var event = new MouseEvent('mousemove', {
            bubbles: true,
            cancelable: true,
            view: document.defaultView,
            clientX: x,
            clientY: y
        });
        document.dispatchEvent(event);
    }

    // Codde for Mouse move function
    var randomPosition = randomDisplayNumber();
    moveMouseTo(randomPosition.x, randomPosition.y);



    // @require      https://cdnjs.cloudflare.com/ajax/libs/tesseract.js/5.0.5/tesseract.min.js
    // @require      https://cdnjs.cloudflare.com/ajax/libs/tesseract.js/5.0.5/worker.min.js

    // 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
                    originalImgElement.src = imgElement.src; // Zeige das Originalbild an
                    processImage(imgElement); // Lade und bearbeite das Bild
                } else {
                }
            }, 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', // Sprache einstellen, hier: Englisch
                {
                    logger: m => console.log("Tesseract Log:", m),
                    psm: 7,
                    oem: 3,
                    tessedit_char_whitelist: "0123456789",
                    tessedit_traineddata: 'eng', // Ändere den Pfad zu deiner trainierten Datenbank, z.B. 'C:/Users/User/Desktop/Projekte/Luckybird Chat Bot/output_model/tec'
                }
            ).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, '');

                console.log('Regonized Numbers:' + filteredText)

                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);

})();