吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5846|回复: 35
收起左侧

[原创工具] 52pj专发,JS插件识别图片验证的几种方式 canvas blob 以及跨域图片

[复制链接]
Pwaerm 发表于 2023-1-28 16:52
本帖最后由 Pwaerm 于 2023-1-28 16:56 编辑

平常写得最多的就是浏览器插件了,经常刷网页版的抖音,但隔这么久就会出现验证码(有滑块和文字点选)
今天尝试折腾一个自动完成验证的插件,但遇到了跨域图片不能直接获得base64数据的问题。
这里把心得分享一下。

文件中涉及的识别工具码码地址:

折腾系列之油猴鼠标伴侣,有源文件【python打包的EXE】 - 『原创发布区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

最新版下载地址:
https://pan.baidu.com/s/1IiSvK8DuftEqeaXI9fZIyg?pwd=j1dm 提取码:j1dm

工具使用说明:
post方式向http://127.0.0.1:2000提交数据
{type:"ocrCode",img:图形base64}      识别文字字母等
{type:"detection",img:图形base64}         识别点选文字范围
{type:"slide",targetImg:滑块base64,backgroundImg:背景base64}        识别滑块
{type:"clickImage",key:"窗口关键字",img:按钮base64}         点击图形按钮
{type:"passKey",key:按键}                   模拟键盘按键
{type:"activityWindow",window:"要激活的窗口标题关键字",key:按键【可选】}          激活窗口并按键
{type:"click"}               点击鼠标
{type:"clickPoint",x:X坐标,y:Y坐标}        指定坐标点击鼠标
{type:"move",x:X坐标,y:Y坐标}               移动鼠标
{type:"moveAndClick",x:X坐标,y:Y坐标}                       移动鼠标到指定坐标再点击
{type:"write",text:"要输入的内容"}           模拟键盘输入文字


必须 三张图:
image.png


image.png

image.png


第一种:通常获取图片数据直接用canvas drawImage简单直接快速。

但在部分网站中是禁止使用canvas的,所以我就用

第二种:  使用 XMLHttpRequest异步(注意只能异步)读取blob数据转base64。

但如果图片是跨域的,第一、二种都会失效

第三种(支持跨域): 在浏览器插件的background.js中使用 XMLHttpRequest读取图片然后传给inject_script.js 。也可以用于其它数据的读取。

以下代码示例,过抖音验证(文字点选类识别率较低,需要训练模型然后更新到识别程序中才能完善)。

[Asm] 纯文本查看 复制代码
//识别验证码
function ocrFormApi(_data) {
    var _code = "本地未开启P娃儿猫验证码识别工具的web服务。";
    try {
        console.log("提交后台识别中...");
        $.ajax({
            type: "POST",
            url: "http://127.0.0.1:2000/",
            timeout: 2 * 1000,
            async: false,
            data: _data,
            success: function (data) {
                _code = data;
            },
            error: function (_d) {
                _code = "识别错误";
            }
        });
    } catch (e) {

    }
    return _code;
}
//滑块操作(滑块元素ID,要滑动的距离)
function mockVerify(_imgId, _distance) {
    var btn = document.querySelector("#" + _imgId);
    var mousedown = document.createEvent('MouseEvents');
    var rect = btn.getBoundingClientRect();
    var x = rect.x;
    var y = rect.y;
    mousedown.initMouseEvent('mousedown', true, true, window, 0,
        x, y, x, y, false, false, false, false, 0, null);
    btn.dispatchEvent(mousedown);

    var dx = 0;
    var dy = 0;
    var interval = setInterval(function () {
        var mousemove = document.createEvent('MouseEvents');
        var _x = x + dx;
        var _y = y + dy;
        mousemove.initMouseEvent('mousemove', true, true, window, 0,
            _x, _y, _x, _y, false, false, false, false, 0, null);
        btn.dispatchEvent(mousemove);
        console.log("MOVE");
        btn.dispatchEvent(mousemove);
        if (_x - x >= _distance) {
            clearInterval(interval);
            var mouseup = document.createEvent('MouseEvents');
            mouseup.initMouseEvent('mouseup', true, true, window, 0,
                _x, _y, _x, _y, false, false, false, false, 0, null);
            btn.dispatchEvent(mouseup);
            console.log("END");
        }
        else {
            dx += Math.ceil(Math.random() * 50);

        }
    }, 60);
}
//传入图像元素通过canvas转换
function getImgBase64(_img) {
    var canvas = document.createElement("canvas");
    canvas.width = _img.naturalWidth;
    canvas.height = _img.naturalHeight;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(_img, 0, 0);
    return canvas.toDataURL("image/png").replace("data:image/png;base64,", "");
}
//传入图片地址(不能跨域),通过blob转换(只能异步)
function getImgBase64ByUrl(_url, _success) {
    var xhr = new XMLHttpRequest();
    xhr.responseType = "blob";
    xhr.open("POST", _url, true);
    xhr.onload = function (data, textStatus, request) {// 请求完成处理函数
        if (this.status === 200) {
            var _blob = this.response;// 获取返回值
            let _f = new FileReader();
            _f.onload = function (_e) {
                console.log(_e.target.result);
                _success(_e.target.result);
            }
            _f.readAsDataURL(_blob);
        } else {
            console.log(this.status);
        }
    };
    xhr.send();
}
function checkCodeOut() {
    if ($("#captcha-verify-image:visible").length) {
        //获取跨域图片数据(把  getImgBase64ByUrl 中的方法放到插件的background中,因为background没有跨域问题)
        window.sendMessage({ type: "getDataFromUrl", data: { url: $("#captcha-verify-image:visible").attr("src"), blob: 1, type: "GET" } }, function (_base64) {
            var _backgroundImg = _base64.replace("data:image/jpeg;base64,", "");
            //点选文字
            if ($("#verify-bar-code:visible").length) {
                window.sendMessage({ type: "getDataFromUrl", data: { url: $("#verify-bar-code:visible").attr("src"), blob: 1, type: "GET" } }, function (_base64) {
                    var _targetImg = _base64.replace("data:image/jpeg;base64,", "");
                    //识别出要求点选的文字
                    var _data = ocrFormApi({ type: "ocrCode", img: _targetImg });
                    //_data = JSON.parse(_data);
                    var _txt = _data.code;
                    //识别背景图上的文字及对应坐标
                    _data = ocrFormApi({ type: "detection", img: _backgroundImg });
                    console.log(_data)
                    _data = _data.code;
                    for (var _i = 0; _i < _txt.length; _i++) {
                        if (_data[_txt.charAt(_i)]) {
                            console.log("“" + _txt.charAt(_i) + "”字点击范围:", _data[_txt.charAt(_i)])
                        } else {
                            console.log("“" + _txt.charAt(_i) + "”字范围未能识别成功,请刷新。");
                            $(".secsdk_captcha_refresh--text").click();
                        }
                    }
                });
            }
            //滑块
            if ($(".captcha_verify_img_slide:visible").length) {
                window.sendMessage({ type: "getDataFromUrl", data: { url: $(".captcha_verify_img_slide:visible").attr("src"), blob: 1, type: "GET" } }, function (_base64) {
                    var _targetImg = _base64.replace("data:image/jpeg;base64,", "");
                    var _data = ocrFormApi("slide", { type: "slide", targetImg: _targetImg, backgroundImg: _backgroundImg });
                    console.log("滑块需要操作的数据:", _data);
                    $(".captcha_verify_img_slide:visible").attr("id", "52pj_slide");
                    mockVerify("52pj_slide", _data.x);
                });
            }
        });
        return;
    }
    setTimeout(checkCodeOut, 1000);
}
function init() {
    var _l = location.href;
    if (_l.indexOf("www.douyin.com") != -1) {
        checkCodeOut();
        return;
    }
    return;
}
if (typeof $ == 'undefined') {
    var s = document.createElement("script");
    s.onload = init;
    s.src = "https://cdn.bootcss.com/jquery/2.1.4/jquery.min.js";
    document.getElementsByTagName("HEAD")[0].appendChild(s);
} else {
    init();
}


免费评分

参与人数 10吾爱币 +15 热心值 +10 收起 理由
谁人定我去或留 + 1 + 1 我很赞同!
xxbuer + 1 + 1 热心回复!
Ravens + 1 我很赞同!
rx_y2000 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
chao8709 + 1 + 1 我很赞同!
没事好好 + 1 + 1 热心回复!
无厘头大 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
石斧开天 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Healer-zx + 1 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

石斧开天 发表于 2023-1-29 14:41
感谢楼主分享实用软件
人人为我,我为人人
为了方便大家下载,上传到了蓝奏,希望能帮大家省点时间

外链: https://wwi.lanzoup.com/b051f835i 密码: bscd

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Pwaerm + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| Pwaerm 发表于 2023-1-28 17:01
wan520340 发表于 2023-1-28 17:00
是利用python运行为本地服务嚣,js向该服务嚣请求进行识别吧

是的,识别部分在python程序里面,  前面发过帖子,使用的ddddocr库。

这里主要讲 获取网页中的图片数据。
wan520340 发表于 2023-1-28 17:00
是利用python运行为本地服务嚣,js向该服务嚣请求进行识别吧
ciker_li 发表于 2023-1-28 17:01
大佬厉害
夏夜吉他 发表于 2023-1-28 19:55
支持原创!
lancou 发表于 2023-1-28 21:10

感觉非常有用,感谢了
ok667 发表于 2023-1-28 22:26
大佬厉害
jin333 发表于 2023-1-30 09:18
感谢分享!不明觉厉
没事好好 发表于 2023-1-30 11:54
666666有用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表