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

news2024/11/14 17:19:42

在这里插入图片描述

计算型验证码

算术验证码,也叫计算型验证码, 计算型验证码其实是一种特殊的字符型验证码,只不过在它的基础上增加了数字运算。
  计算型验证码在将人类视觉和计算机视觉的差异作为区分用户和电脑的依据的同时,还加上了逻辑运算,从而来增加机器识别的难度。
    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);
					else
						imgCode = 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.coloradmin.cn/o/2154041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构_1.1、数据结构的基本概念

1、基本概念 数据&#xff1a;是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一个整体进行考虑和处理…

Java高级Day48-JDBC-API和JDBC-Utils

127.JDBC API 128.JDBC-Utils public class JDBCUtils {//这是一个工具类&#xff0c;完成mysql的连接和关闭资源//顶柜相关的属性&#xff08;4个&#xff09;&#xff0c;因为只需要一份&#xff0c;因此做成staticprivate static String user;//用户名private static Stri…

【速成Redis】04 Redis 概念扫盲:事务、持久化、主从复制、哨兵模式

前言&#xff1a; 前三篇如下&#xff1a; 【速成Redis】01 Redis简介及windows上如何安装redis-CSDN博客 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客 【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、…

python有main函数吗

python和C/Java不一样&#xff0c;没有主函数一说&#xff0c;也就是说python语句执行不是从所谓的主函数main开始的。 当运行单个python文件时&#xff0c;如运行a.py&#xff0c;这个时候a的一个属性__name__是__main__。 当调用某个python文件时&#xff0c;如b.py调用a.p…

基于微信小程序的童装商城的设计与实现+ssm(lw+演示+源码+运行)

童装商城小程序 摘 要 随着移动应用技术的发展&#xff0c;越来越多的用户借助于移动手机、电脑完成生活中的事务&#xff0c;许多的传统行业也更加重视与互联网的结合&#xff0c;由于城镇人口的增加&#xff0c;人们去商场购物总是排着长长的队伍&#xff0c;对于时间紧的人…

数据类型转换中存在的问题分析

本文档包含内容有&#xff1a; 数据类型转换中的隐式类型转换存在的风险&#xff1b; 整型提升存在的风险 标准算数转换存在的风险数据类型转换中存在的数据类型范围溢出风险&#xff1b;数据类型转换中存在的数据精度问题&#xff08;数据截断&#xff09;。 隐式类型转换&a…

此框架你到底了解多少???

1.简述对Spring中IOC/DI的理解 IOC&#xff1a;控制反转&#xff0c;将创建和管理的对象的任务交给外部的Spring容器 DI&#xff1a;依赖注入&#xff0c;对象之间存在依赖关系&#xff0c;创建对象时&#xff0c;对其依赖的对应直接进行赋值 2.有哪些依赖注入的方式 基于注…

【计算机网络】详解UDP套接字网络字节序IP地址端口号

一、网络字节序 我们已经知道, 内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出; 接收主机把从网络上接到…

软考中级软设背诵内容

冯诺依曼结构、哈佛结构 冯诺依曼结构: 程序指令和数据都采用二进制表示 程序指令和数据在同一个存储器中混合 程序的功能都由中央处理器&#xff08;CPU&#xff09;执行指令来实现 程序的执行工作由指令进行自动控制 SRAM、DRAM 与DRAM相比&#xff0c;SRAM集成率低、功…

页面布局实现-左侧横向滑动展示隐藏数据,右侧固定展示操作按钮。可上下滑动联动

效果图 1.布局排版 <LinearLayoutandroid:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical"android:padding"1dp"><LinearLayoutandroid:id"id/lltList"android:lay…

Java:Clonable 接口和拷贝

一 Clonable 接口 在 Java SE 中&#xff0c;Cloneable 是一个标记接口&#xff08;Marker Interface&#xff09;&#xff0c;它位于 java.lang 包中。这个接口的主要目的是标识实现该接口的类能够被合法地克隆&#xff08;即可以调用 Object 类中的 clone() 方法&#xff09…

Electron应用程序打包后运行报错cannot find module ‘@vue/cli-service‘

本项目打包运行后报错问题的解决办法&#xff0c;类似于其他cannot find module XXX’的报错&#xff0c;也基本可以解决 文章目录 electron应用程序打包后运行报错排查问题解决办法 electron应用程序打包后运行报错 错误如下&#xff1a; 提示找不到该模块 排查问题 本项…

互联网广告产品基础知识

一 计价与效果 广告产品如何估算收入&#xff1f; 一种是从需求侧计算&#xff1a;按照广告主数量进行拟合&#xff1b;一种是从供给侧计算&#xff1a;按照曝光量和千次曝光单价进行拟合。 需求侧 从需求侧&#xff0c;也就是广告主侧&#xff0c;来计算广告产品的总收入&…

Linux命令:用于创建新的用户组的命令行工具groupadd 详解

目录 一、概述 二、组标识符GID 1、定义 &#xff08;1&#xff09;标识符 &#xff08;2&#xff09;与UID的关系 2、GID的作用 &#xff08;1&#xff09;用户组管理 &#xff08;2&#xff09;文件权限控制 &#xff08;3&#xff09;用户权限管理 &#xff08;4&…

threejs性能优化之gltf文件压缩threejs性能优化之glb文件压缩

在使用Three.js进行3D图形开发时&#xff0c;GLTF&#xff08;GL Transmission Format&#xff09;文件因其高效性和灵活性而广受欢迎。然而&#xff0c;随着模型复杂度的增加&#xff0c;GLTF文件的大小也会显著增加&#xff0c;这可能会对加载时间和渲染性能产生负面影响。为…

插入与冒泡排序(C++)

\一、插入排序 1 简介 插入排序&#xff0c;也称为直接插入排序&#xff0c;其排序思想和我们平时打扑克牌时排序类似。 2 算法步骤 将第一个元素看作已排序序列&#xff0c;第二个到最后一个看作未排序序列。 第二个元素&#xff0c;与之前已排序号的序列进行对比&#x…

【我的 PWN 学习手札】tcache stash with fastbin double free —— tcache key 绕过

参考看雪课程&#xff1a;PWN 探索篇 前言 tcache key 的引入使得 tcache dup 利用出现了困难。除了简单利用 UAF 覆写 key 或者House Of Karui 之外&#xff0c;还可以利用 ptmalloc 中的其他机制进行绕过。 一、Tcache Stash with Fastbin Double Free 之前是 double free …

软考中级软件设计师——知识产权学习记录

软考中级软件设计师——知识产权 著作权人身权著作财产权著作权侵权行为 计算机软件著作权基本知识计算机软件著作权侵权 专利地域性与专利权申请基本知识专利权侵权 职务作品委托开发商业秘密权基本知识商业秘密侵权 商标权与商标注册基本知识商标权侵权 著作权 著作权也称为…

Spring的任务调度

Spring的任务调度 1.概述 Spring框架为任务调度提供了专门的解决方案。在Spring框架的org.springframework.scheduling包中&#xff0c;通过对JDK 的ScheduledExecutorService接口的实例进行封装&#xff0c;对外提供了一些注解和接口&#xff0c;为开发者处理定时任务提供了…

网安面试会问到的:http的长连接和短连接

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…