吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10800|回复: 115
上一主题 下一主题
收起左侧

[原创工具] python 验证码识别工具web版(有源文件)

    [复制链接]
跳转到指定楼层
楼主
Pwaerm 发表于 2022-11-22 20:10 回帖奖励
本帖最后由 Pwaerm 于 2022-11-22 23:06 编辑

看了 fm32 神的验证码神器,移步: 验证码识别2.0(更新:支持Chrome浏览器插件调用。永不失效) - 『原创发布区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
DDDDOCR确实很神奇 (我以前用的 muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha))

我来做一个web版,可用于各种程序的对接  访问方式:http://127.0.0.1:2300  。
也可以监视剪贴板,自动识别并把结果写入剪贴板。

今天各种搜索,终于打包成功了。所有文件(py程序,界面文件,打包配置文件,打包批处理 以及打包好的exe可直接使用)打包下载:
链接:https://pan.baidu.com/s/1_JC_oEwTxYjyX6gWe1rzeA
提取码:hhxx

  
源码:

[Asm] 纯文本查看 复制代码
import sys, os, io
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QIcon, QPixmap
import ddddocr
from http.server import HTTPServer, BaseHTTPRequestHandler
import urllib
import json
from threading import Thread
import base64
from PIL import Image
import pyperclip


class HttpHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(
            str("请以POST方式发送图片数据    {img:'图像的base64编码'}\r\n返回格式   {\"status\": 1, \"msg\":\"识别成功\", \"code\": \"验证码内容\"}"
                ).encode())

    def do_POST(self):
        args = self.rfile.read(int(
            self.headers['content-length'])).decode("utf-8")
        self._response(self.path, args)

    def _response(self, path, args):
        # 组装参数为字典
        if args:
            args = urllib.parse.parse_qs(args).items()
            args = dict([(k, v[0]) for k, v in args])
        else:
            args = {}
        # 设置响应结果
        # print(args)
        if args.get("img") is not None:
            text = window.showImage(base64.b64decode(args["img"]))
            result = {"status": 1, "msg": "识别成功", "code": text}
        else:
            result = {
                "status": 0,
                "msg": "数据格式有误,请以POST方式发送 {img:'图像的base64编码'}",
                "code": ""
            }

        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps(result).encode())


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setFixedSize(300, 200)
        loadUi(os.path.dirname(__file__) + "/ocr_web.ui", self)
        #self.sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
        self.ocr = ddddocr.DdddOcr()
        self.btn.clicked.connect(self.startHttp)

    def showImage(self, _imageBytes, _clipboard):
        #print(_imageBytes)
        text = self.ocr.classification(_imageBytes)
        self.codeText.setText(text)
        print(text)
        pixmap = QPixmap()
        pixmap.loadFromData(_imageBytes)
        pixmap = pixmap.scaled(150, 60)
        self.image.setPixmap(pixmap)
        if _clipboard == "clipboard":
            #clipboard.setText(text)
            pyperclip.copy(text)  # 相当如写入到剪切板
        return text

    def startHttp(self):
        port = int(self.inputLabel.text())
        if port < 60 or port > 65535:
            port = 2300
        self.btn.setEnabled(False)
        self.btn.setText("服务已启动")
        Thread(target=openServer, args=(port, )).start()


def openServer(_port):
    print(_port)
    httpd = HTTPServer(('', _port), HttpHandler)
    httpd.serve_forever()


def image2byte(image):
    # 创建一个字节流管道
    img_bytes = io.BytesIO()
    #把PNG格式转换成的四通道转成RGB的三通道,然后再保存成jpg格式
    image = image.convert("RGB")
    # 将图片数据存入字节流管道, format可以按照具体文件的格式填写
    image.save(img_bytes, format="JPEG")
    # 从字节流管道中获取二进制
    image_bytes = img_bytes.getvalue()
    return image_bytes


# 当剪切板变动会执行该方法
def clipboardChange():
    if window.cpCheckBox.checkState() == 2:
        data = clipboard.mimeData()
        # 获取剪切板内容格式
        print(data.formats())
        # 如果是文本格式,把内容打印出来
        if ('application/x-qt-image' in data.formats()):
            window.showImage(image2byte(Image.fromqimage(clipboard.pixmap())),
                             "clipboard")
        else:
            print("text:" + data.text())


app = QApplication(sys.argv)
clipboard = app.clipboard()
# 监听剪切板变动
clipboard.dataChanged.connect(clipboardChange)
clipboard.setText("pwm")
window = MainWindow()
window.setWindowTitle("P娃儿猫验证码识别v1.0")
window.setWindowIcon(QIcon(os.path.dirname(__file__) + '/Pwaerm.ico'))
window.show()
sys.exit(app.exec_())


免费评分

参与人数 30吾爱币 +37 热心值 +29 收起 理由
aabbcc123123 + 1 + 1 谢谢@Thanks!
yuwen8883 + 1 + 1 谢谢@Thanks!
chenke7352 + 1 + 1 我很赞同!
一个清欢猫 + 1 + 1 谢谢@Thanks!
TTBigCat + 1 + 1 谢谢@Thanks!
sunozil + 1 + 1 我很赞同!
yuanshuzhen + 1 + 1 我很赞同!
DreamTT + 1 + 1 谢谢@Thanks!
xhtdtk + 2 + 1 谢谢@Thanks!
musict + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
mogoyu + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
asche + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
frankrx41 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
moon3414 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
Healer-zx + 1 + 1 谢谢@Thanks!
whoami233 + 1 + 1 谢谢@Thanks!
yihan01 + 1 + 1 我很赞同!
围路人甲城 + 1 + 1 谢谢@Thanks!
lp17863564 + 1 谢谢@Thanks!
duokebei + 1 + 1 我很赞同!
ccczm + 1 + 1 非常感谢
bestmusic + 1 + 1 谢谢@Thanks!
crownyouyou + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fm32 + 2 + 1 好思路!
会飞的花 + 1 谢谢@Thanks!
朕懂 + 1 + 1 谢谢@Thanks!
阴凉 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
sunlit + 1 + 1 谢谢@Thanks!
emiya1120 + 1 + 1 谢谢@Thanks!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

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

推荐
 楼主| Pwaerm 发表于 2022-12-13 12:34 |楼主
围路人甲城 发表于 2022-12-13 11:28
那你试试这个网站吧,
其实哪个网站无所谓,我就是想知道该怎么针对不同的网站改代码

前面就已经发过例子的
每个网站只是验证码图片的ID 和输入验证码的文本框的ID 不同
jyxxh.emis.edu.cn  对应的ID 为  "authimage", "rand"


JS举例
[Asm] 纯文本查看 复制代码
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,", "");
}
function getImgCodeFormApi(_img) {
    console.log("提交后台识别");
    $("#button").text("验证码识别中...");
    var _code = "本地未开启P娃儿猫验证码识别工具的web服务。";
    try {
        $.ajax({
            type: "post",
            url: "http://127.0.0.1:2300",
            timeout: 2 * 1000,
            async: false,
            data: {
                img: getImgBase64(_img)
            },
            success: function (data) {
                //alert(JSON.stringify(data));            
                console.log(data);
                _code = data.code;
            },
            error: function (_d) {
                alert(_code);
                $("#button").text(_code);
            }
        });
    } catch (e) {

    }
    return _code;
}
//给验证码图片添加侦听,并在加载完成时识别,然后将识别结果填充到 验证码 输入文本框中
function addImagelistener(_imgId = "验证码图片ID", _inputId = "输入验证码的文本框ID") {
    console.log($("#" + _imgId));
    if (!$("#" + _imgId).attr("data_listener")) {
        $("#" + _imgId).attr("data_listener", 1);
        $("#" + _imgId).load(function () {
            $("#" + _inputId).val(getImgCodeFormApi($("#" + _imgId)[0]));
        })
        $("#" + _imgId).load();
    }
}
function init() {
    var _l = location.href;
    //教育信息化
    if (_l.indexOf("jyxxh.emis.edu.cn") != -1) {
        addImagelistener("authimage", "rand");
        return;
    }
    if (_l.indexOf("https://iam.pt.ouchn.cn/am/UI/Login") != -1) {
        addImagelistener("kaptchaImage", "validateCode");
        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();
}
console.log("52PJ_TEST SCRIPT INIT");


所有文件下载(插件安装后直接可用):
链接:https://pan.baidu.com/s/15XGO_DljbQ0shnJqGCqtSg
提取码:hhxx

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
zhenyiyang + 1 + 1 我很赞同!

查看全部评分

推荐
 楼主| Pwaerm 发表于 2022-11-24 21:31 |楼主
霹雳游侠 发表于 2022-11-24 20:54
完全看不懂,开了个寂寞,什么反应都没,只能说你弄的软件不是给大部分人用的,拿出来炫耀的

这有什么好炫耀的,都是网上照别人的教程抄写的。

验证码识别本身多数用于机器人,普通人确实几乎没什么用处,去输入验证码还要开个软件,用这功夫自己输入都成功了。
我录了个屏,监视剪贴版功能,复制验证码图片,就可以直接粘贴识别出来的验证码结果。






如果开启web服务器,可以在js中通过如下方式对接:

[Asm] 纯文本查看 复制代码
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,", "");
}
function getImgCodeFormApi(_img) {
    console.log("提交后台识别");
    var _code = "未能识别";
    try {
        $.ajax({
            type: "post",
            url: "http://127.0.0.1:2300",
            timeout: 2 * 1000,
            async: false,
            data: {
                img: getImgBase64(_img)
            },
            success: function (data) {
                //alert(JSON.stringify(data));            
                console.log(data);
                _code = data.code;
            }
        });
    } catch (e) {

    }
    return _code;
}

免费评分

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

查看全部评分

推荐
ccczm 发表于 2023-8-15 12:04
沙发
89684828 发表于 2022-11-23 19:38
感谢楼主分享,支持一下!
3#
awxzw 发表于 2022-11-23 20:26
感谢分享,支持一下!
4#
dsduanduan 发表于 2022-11-24 08:09
感谢楼主分享!!!
5#
kkffaa 发表于 2022-11-24 08:39
学习下谢谢了
6#
bandishui 发表于 2022-11-24 09:25
认真学习, 谢谢分享
7#
michaelcheng077 发表于 2022-11-24 10:23
感谢楼主分享,支持一下
8#
furseal 发表于 2022-11-24 10:53
感谢分享原创作品,待晚些我拿rust搞个试试
9#
会飞的花 发表于 2022-11-24 11:51
很实用 感谢分享!
10#
yks1985 发表于 2022-11-24 12:41
学习了。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-21 23:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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