当前位置: 首页 > news >正文

【巧用ddddocr破解算术运算验证码的经典示范】

在这里插入图片描述

计算型验证码

算术验证码,也叫计算型验证码, 计算型验证码其实是一种特殊的字符型验证码,只不过在它的基础上增加了数字运算。
  计算型验证码在将人类视觉和计算机视觉的差异作为区分用户和电脑的依据的同时,还加上了逻辑运算,从而来增加机器识别的难度。
    Python 提供了专门的库用于破解计算性验证码——Ddddocr

破解方式

Ddddocr 其实是一种 OCR,可以将图形识别后得到字符串,字符串中带有运算符

第一步:安装​

pip install ddddocr

第二步:​从网站抓取图片,如下图类型

在这里插入图片描述

第三步:切割图片,将数字和运算符的位置分别截取

分割图片并调用 ddddOcr 解析相应的字符串

// 2 获取图形验证码Thread.sleep(1 * 1000);String imgCode = null, base64Str;byte[] imgByte = null;BufferedImage fullBI;String logic = "";WebElement imgElement = driver.findElement(By.className("pic-check"));boolean isPlus = false;byte[] logicByte = null, n1Byte, n2Byte;long t = System.currentTimeMillis();for (int i = 0; i < 6; i++) {t = System.currentTimeMillis();base64Str = imgElement.getAttribute("src");imgByte = (base64Str != null) ? GetImage.imgStrToByte(base64Str) : null;fullBI = ImageIO.read(new ByteArrayInputStream(imgByte));n1Byte = picCut(fullBI, 80, 22);n2Byte = picCut(fullBI, 138, 22);logicByte = picCut(fullBI, 99, 40);String n1 = DigitFormat.getDigit(ddddOcr.getImgCode(n1Byte));String n2 = DigitFormat.getDigit(ddddOcr.getImgCode(n2Byte));logic = ddddOcr.getImgCode(logicByte);isPlus = logic != null && (logic.contains("加") || logic.contains("如") || logicSet.contains(logic));if (logic != null && logic.length() > 0) {if (isPlus)imgCode = logic(n1, "plus", n2);elseimgCode = logic(n1, logic, n2);} else {imgCode = null;ddddOcr.saveFile("Ddky/", "OP_" + t, logicByte);}System.out.println("n1=" + n1 + ",logic=" + logic + ",n2=" + n2);if (imgCode != null && imgCode.length() > 0)break;imgElement.click();Thread.sleep(1 * 1000);}

在这里插入图片描述
在这里插入图片描述

由于 ddddOcr 对识别出的加减汉字存在识别为其它字符串的概率,故采用两中方式可以纠正,
1 在初期可以对识别出的字符串进行纠正,优点是无需训练即可达到 95%的识别率,缺点是需要增加纠正字典表
2 在1的基础上, 对汉字运算符号进行训练, 训练可以去掉纠正表

public static final Set<String> logicSet = new HashSet<String>() {private static final long serialVersionUID = -4054136023490781886L;{add("b");add("d");add("g");add("m");add("M");add("u");add("风");add("挪");add("如");add("帆");add("挑");add("加");add("业");add("邮");add("此");add("爪");add("却");add("加m");add("规");add("耻");add("州");add("期");add("机");add("址");add("抓");add("抑");add("邯");add("虾");add("川");add("划");add("娜");}};

第四步:​编写程序,对识别得到的字符串进行运算

算术运算部分

/*** 算术运算* @param n1* @param logic* @param n2* @return*/private String logic(String n1, String logic, String n2) {if (n1 != null && n1.length() > 0 && n2 != null && n2.length() > 0) {Integer r;if (logic.equals("plus")) {r = Integer.parseInt(n1) + Integer.parseInt(n2);} else {r = Integer.parseInt(n1) - Integer.parseInt(n2);}return String.valueOf(r);}return null;}

测试结果,

在没有训练的基础上,对识别出的结果进行纠正,成功率可以达到 97% , 后期我们有空再进行训练后提供测试的情况


http://www.mrgr.cn/news/33064.html

相关文章:

  • MySQL查询执行(六):join查询
  • Kafka参数了解
  • Java开发人员从零学习ArkTs笔记(二)-函数与类
  • Linux故障排查中常用的命令
  • MySQL数据库常用命令大全(完整版——表格形式)
  • 论文阅读《机器人状态估计中的李群》
  • 【OS】AUTOSAR OsStack监控原理
  • CMake中的PUBLIC、PRIVATE 和 INTERFACE用法
  • 楼宇自动巡检小车设计
  • 借10万块,年化利息明明是3.8%,为啥就变成了2.07%?
  • 【软考】传输层协议TCP与UDP
  • C++智能指针入门教程(C++11)
  • OpenGL渲染管线(Rendering Pipeline)介绍
  • proteus仿真学习(1)
  • 【笔记】1.3 塑性变形
  • PAT甲级-1086 Tree Traversals Again
  • Apipost IDEA插件新升级,Apipost Helper上架IDEA插件市场
  • 基于SpringBoot+Vue的高校门禁管理系统
  • 万字长文——ConvNeXt(2022CVPR),卷积网络的顶峰之作,在Transformer盛行的当下,卷积网络还能再战!
  • C++——求3*3矩阵主对角元素之和。
  • unity3d入门教程八-飞机大战
  • 基于协同过滤算法的商品推荐系统
  • 索引设计的5个原则
  • TCP四大拥塞控制算法总结
  • windows安装Anaconda教程
  • springboot注册和注入组件方式概览