Greasy Fork镜像 还支持 简体中文。

自动提取政和验证码

Find an img with src containing "api-uaa/v1/validate/code", get Base64, and send it for captcha code

目前為 2024-09-05 提交的版本,檢視 最新版本

// ==UserScript==
// @name         自动提取政和验证码
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Find an img with src containing "api-uaa/v1/validate/code", get Base64, and send it for captcha code
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @license           Apache-2.0
// ==/UserScript==
(function() {
    'use strict';

    // 在页面加载完成后执行脚本
    window.addEventListener('load',
    function() {
        console.log("页面已加载,开始自动提取验证码");

        // 查找所有 img 标签
        var imgElements = document.getElementsByTagName('img');

        // 遍历所有 img 标签
        for (let imgElement of imgElements) {
            // 检查 img 标签的 src 属性是否包含指定的 URL 部分
            if (imgElement.src.includes('api-uaa/v1/validate/code')) {
                console.log("图片地址:", imgElement.src);
                // 创建一个 canvas 元素
                var canvas = document.createElement('canvas');
                var context = canvas.getContext('2d');

                // 确保 canvas 的尺寸与图片相同
                canvas.width = imgElement.naturalWidth;
                canvas.height = imgElement.naturalHeight;

                // 图片加载完成后将其绘制到 canvas 上
                imgElement.onload = async function() {
                    imgElement.setAttribute('crossOrigin', 'anonymous');
                    context.drawImage(imgElement, 0, 0);
                    // 这里不指定格式,自动使用图片的原格式
                    const imgBase64 = canvas.toDataURL();
                    console.log("图片imgBase64:", imgBase64);
                    //.replace(/^data:image\/(png|jpg|gif);base64,/, '');
                    // 调用获取验证码的函数
                    await getCaptchaCode(imgBase64, imgElement);
                };

                // 如果图片已经加载完成,立即处理
                if (imgElement.complete) {
                    imgElement.onload();
                }

                // 找到匹配的图片后退出循环
                break;
            }
        }
    });

    // 定义获取验证码的函数
    async function getCaptchaCode(imageBase64, imgElement) {
        try {
            var formData = new FormData();
            formData.append("image", imageBase64);
            GM_xmlhttpRequest({
                method: "POST",
                url: "https://ocr.173173173.top:8443/ocr",
                headers: {
                    "accept": "application/json",
                    "User-Agent": navigator.userAgent
                },
                data: formData,
                onload: function(response) {
                    const jsonResponse = JSON.parse(response.responseText);

                    // 检查 code 是否为 200
                    if (jsonResponse.code === 200) {
                        var inputElement = findClosestInput(imgElement);
                        if (inputElement) {
                            inputElement.value = jsonResponse.data; // 使用 data 字段的值
                            // 手动触发 input 事件,以便页面检测到输入的变化
                            var event = new Event('input', { bubbles: true });
                            inputElement.dispatchEvent(event);

                            // 如果还有其他事件检测输入,可以一并触发
                            var changeEvent = new Event('change', { bubbles: true });
                            inputElement.dispatchEvent(changeEvent);
                            console.log('Captcha code filled into input:', jsonResponse.data);
                        } else {
                            console.log('No input element found in parent elements.');
                        }
                    } else {
                        console.error('API returned an error:', jsonResponse.message);
                    }
                },
                onerror: function(error) {
                    console.error('Error:', error);
                }
            });
        } catch(error) {
            console.error("Failed to get captcha code:", error);
        }
    }

    // 定义从 img 元素开始逐级向上查找最近的 input 元素的函数
    function findClosestInput(element) {
        while (element) {
            element = element.parentElement;
            if (!element) break;
            var inputs = element.getElementsByTagName('input');
            if (inputs.length > 0) {
                return inputs[inputs.length - 1]; // 返回找到的最后一个 input 元素
            }
        }
        return null;
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址