QQ验证码识别源代码

合集下载

仿腾讯QQ的用户登录窗口中的图形验证码和在线用户计数的实现示例

仿腾讯QQ的用户登录窗口中的图形验证码和在线用户计数的实现示例

仿腾讯QQ的用户登录窗口中的图形验证码和在线用户计数的实现示例1.1.1仿腾讯QQ的用户登录窗口中的图形验证码1、添加一个实现验证码功能的JavaBean组件类(1)类名称为VerifyCodeBean,包名称为com.px1987.oasystem.util(2)编程该JavaBean2、再添加一个在页面中产生验证码JPEG图像功能的调度Servlet组件(1)新建一个Servlet组件(2)类名称为ShowVerifyCodeImage,包名称为com.px1987.oasystem.imsystem.servlet(3)设置该Servlet的url-pattern为:/showVerifyCodeImage.action(4)将产生出下面的Servlet组件(5)编程该Servlet组件(6)部署该Servlet组件<servlet><servlet-name>ShowVerifyCodeImage</servlet-name><servlet-class>com.px1987.oasystem.imsystem.servlet.ShowVerifyCodeImage</servlet-class> </servlet><servlet-mapping><servlet-name>ShowVerifyCodeImage</servlet-name><url-pattern>/showVerifyCodeImage.action</url-pattern></servlet-mapping>3、在客户端的HttpClientUserInfoRequestResponseImple类获得服务器端程序产生的验证码(1)getVerifyCodeImage方法的代码示例(2)执行IM客户端程序时,将能够看到下面的效果1.1.2仿腾讯QQ的在线用户实时统计计数的实现示例1、在线计数的OnLineCounter类(1)类名称为OnLineCounter,包名称为com.px1987.oasystem.util(2)编程该类2、执行IM客户端程序时,将能够看到下面的在线用户计数的功能实现效果。

注册登陆界面验证码的作用及代码实现

注册登陆界面验证码的作用及代码实现

注册登陆界⾯验证码的作⽤及代码实现简介:验证码的作⽤:主要是为了有效防⽌机器恶意注册,对某⼀个特定已注册⽤户⽤特定程序暴⼒破解⽅式进⾏不断的登陆尝试。

验证码是现在很多⽹站注册/登录时必填的,虽然对⽤户可能有点⿇烦,但是对⽹站/社区来说这个功能还是很有必要,也很重要,不少⽹站为了防⽌⽤户利⽤机器⼈⾃动注册、登录、灌⽔,都采⽤了验证码技术。

所谓验证码,就是将⼀串随机产⽣的数字或符号,⽣成⼀幅图⽚,图⽚⾥加上⼀些⼲扰象素(防⽌OCR),由⽤户⾁眼识别其中的验证码信息,输⼊表单提交⽹站验证,验证成功后才能使⽤某项功能。

在这⾥想要提醒⼤家要保护⾃⼰的密码,尽量使⽤混杂了数字、字母、符号在内的6位以上密码,不要使⽤诸如1234之类的简单密码或者与⽤户名相同、类似的密码。

任何时候在任何地⽅都不要随意设置密码,保护你⾃⼰的密码也是保护你⾃⼰,免得你的账号给⼈盗⽤给⾃⼰带来不必要的⿇烦。

常见的验证码:1.四位数字,随机的⼀数字字符串,最原始的验证码,验证作⽤⼏乎为零。

2.⽹站⽤户登录⽤的是GIF格式,⽬前常⽤的随机数字图⽚验证码。

图⽚上的字符⽐较中规中矩,验证作⽤⽐上⼀个好。

没有基本图形图像学知识的⼈,不可破!可惜读取它的程序,在CSDN使⽤它的第⼀天,好像就在论坛⾥发布了。

3.QQ⽹站⽤户登录⽤的是PNG格式,图⽚⽤的随机数字+随机⼤写英⽂字母,整个构图有点张扬,每刷新⼀次,每个字符还会变位置呢!有时候出来的图⽚,⼈眼都识别不了,厉害啊…4.MS的申请时候的是, 随机数字+随机⼤写英⽂字母+随机⼲扰像素+随机位置。

5.的Gmail注册时候的是JPG格式,随机英⽂字母+随机颜⾊+随机位置+随机长度。

6,其他各⼤论坛的是XBM格式,内容随机。

实现代码:⽣成验证码图⽚(dlimage.jsp):1 <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>2 2 <%!Color getRandColor(int fc, int bc) {//给定范围获得随机颜⾊3 3 Random random = new Random();4 4 if (fc > 255)5 5 fc = 255;6 6 if (bc > 255)7 7 bc = 255;8 8 int r = fc + random.nextInt(bc - fc);9 9 int g = fc + random.nextInt(bc - fc);10 10 int b = fc + random.nextInt(bc - fc);11 11 return new Color(r, g, b);12 12 }%>13 13 <%14 14 //设置页⾯不缓存15 15 response.setHeader("Pragma", "No-cache");16 16 response.setHeader("Cache-Control", "no-cache");17 17 response.setDateHeader("Expires", 0);18 1819 19 // 在内存中创建图象20 20 int width = 75, height = 32;21 21 BufferedImage image = new BufferedImage(width, height,22 22 BufferedImage.TYPE_INT_RGB);23 2324 24 // 获取图形上下⽂25 25 Graphics g = image.getGraphics();26 2627 27 //⽣成随机类28 28 Random random = new Random();29 2930 30 // 设定背景⾊31 31 g.setColor(getRandColor(200, 250));32 32 g.fillRect(0, 0, width, height);33 3334 34 //设定字体35 35 g.setFont(new Font("Times New Roman", Font.BOLD, 18));//18是设置的字体⼤⼩36 3637 37 //画边框38 38 g.setColor(new Color(0, 0, 0));39 39 g.drawRect(0, 0, width - 1, height -1);// 细线围成的边框范围40 4041 41 // 随机产⽣155条⼲扰线,使图象中的认证码不易被其它程序探测到42 42 g.setColor(getRandColor(160, 200));43 43 for (int i = 0; i < 155; i++) {44 44 int x = random.nextInt(width);45 45 int y = random.nextInt(height);46 46 int xl = random.nextInt(12);47 47 int yl = random.nextInt(12);48 48 g.drawLine(x, y, x + xl, y + yl);49 49 }50 5051 51 // 取随机产⽣的认证码(4位数字)52 52 String sRand = "";53 53 for (int i = 0; i < 4; i++) {54 54 String rand = null;55 55 //随机⽣成数字或者字母56 56 if (random.nextInt(10) > 5) {57 57 rand = String.valueOf((char)(random58 58 .nextInt(10) + 48));59 59 } else {60 60 rand = String.valueOf((char)(random61 61 .nextInt(26) + 65));62 62 }63 63 sRand += rand;64 64 // 将认证码显⽰到图象中65 65 g.setColor(new Color(random.nextInt(80), random66 66 .nextInt(80), random.nextInt(80)));67 67 //调⽤函数出来的颜⾊相同,可能是因为种⼦太接近,所以只能直接⽣成68 68 g.drawString(rand, 15 * i + 10, 16);69 69 }70 7071 71 // 将认证码存⼊SESSION72 72 session.setAttribute("rand", sRand);73 7374 74 // 图象⽣效75 75 g.dispose();76 7677 77 // 输出图象到页⾯78 78 ImageIO.write(image, "JPEG", response.getOutputStream());79 79 %>在注册或登陆页⾯中引⽤⽣成的验证码图⽚:<!-- 验证码图⽚的⽣成--><img id="code" src="dlimage.jsp"/><a href="#" onclick="javascript:var dt=new Date();document.getElementById('code').src='dlimage.jsp?dt='+dt;">&nbsp; <img alt="看不清,换⼀张"src="dlimages/1.png"/></a>(*区分字母⼤⼩写)检验验证码输⼊正确与否:<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %><html><head><title>注册出现问题</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><META HTTP-EQUIV="Pragma" CONTENT="no-cache"><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"><META HTTP-EQUIV="Expires" CONTENT="0"></head><body><%String rand = (String)session.getAttribute("rand");<!-系统随机产⽣的验证码-->String input = request.getParameter("rand");<!--⽤户输⼊的验证码--> if (input.equals(rand)){%><!-- 验证码正确的情况下 --><jsp:forward page="dl.jsp"/> <!-- 此处重定向到的页⾯可改为登录成功后可进⼊的页⾯ --><%} else {%>系统产⽣的验证码为: <%= rand %><br/>您输⼊的验证码为: <%= input %><br/><!--验证码错误情况下-->认证失败,请返回登录界⾯,重新输验证码!<br/><a href="dl.jsp">返回登录界⾯</a><%}%></body></html>。

python 登录识别验证码算法-概述说明以及解释

python 登录识别验证码算法-概述说明以及解释

python 登录识别验证码算法-概述说明以及解释1. 引言1.1 概述验证码(Captcha)是一种用于识别用户是否为机器人的技术。

它通常通过在登录、注册或其他需要验证身份的页面上展示一串随机生成的字符或图像,要求用户正确输入或点击相关对象,以证明自己是真实的用户。

验证码的存在旨在防止自动化程序或恶意黑客攻击,保护网站和用户的安全。

在当前互联网的发展背景下,登录系统的验证码已经成为很多网站必备的安全措施之一。

然而,由于验证码的人工智能性质,很多传统的自动化操作和爬虫程序无法绕过验证码的阻拦,从而给网站的自动运营和数据采集带来了一定的困难。

因此,开发一种高效、准确的Python验证码识别算法成为了迫切需求。

本文将着重研究基于Python的验证码识别算法,探究其识别原理和应用方法。

首先,我们将详细介绍验证码的概念和其在用户身份验证中的重要性。

随后,我们将调研现有的验证码识别算法,分析其优缺点和应用场景。

最后,我们将重点讨论基于Python的验证码识别算法的研究,探索其在实际应用中的可行性和效果。

通过本文的阅读,读者将能够全面了解到验证码识别算法在Python 中的实现方式,为解决网站登录阻碍和数据采集问题提供了一种切实可行的解决方案。

同时,本文也可作为对验证码算法感兴趣的读者的参考,为他们进一步深入学习和研究验证码识别领域提供了一个起点。

1.2 文章结构本文主要分为以下几个部分来介绍Python登录识别验证码算法。

第一部分是引言,通过概述、文章结构和目的三个小节来介绍本文要阐述的内容。

第二部分是正文,其中包括验证码的概念和Python登录识别验证码的重要性两个小节。

在验证码的概念部分,将介绍验证码的定义、作用和常见类型等内容,为读者提供对验证码的基本了解。

在Python登录识别验证码的重要性部分,将探讨验证码在登录系统中的重要性,并介绍为何有必要使用Python来实现验证码识别算法。

第三部分是结论,包含现有的验证码识别算法和基于Python的验证码识别算法研究两个小节。

python 本地识别验证码代码

python 本地识别验证码代码

识别验证码通常是一个复杂的过程,因为验证码通常被设计成能够区分计算机程序和人类用户。

然而,有一些验证码可能相对容易通过机器学习或深度学习模型来识别。

下面是一个基本的例子,它使用Python的opencv库来识别验证码。

这个例子仅仅是一个简单的演示,并不能处理所有类型的验证码。

```pythonimport cv2import numpy as np# 读取图片img = cv2.imread('captcha.png', 0)# 二值化处理_, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 查找轮廓contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历轮廓,尝试匹配每个字符for contour in contours:# 计算轮廓的边界框x, y, w, h = cv2.boundingRect(contour)# 提取字符图像char_img = img[y:y+h, x:x+w]# 尝试识别字符# 这里我们只是简单地将其转换为灰度图像并查找边界框gray = cv2.cvtColor(char_img, cv2.COLOR_BGR2GRAY)_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)if len(contours) > 0:# 如果找到轮廓,假设字符是字母或数字char = ''for cnt in contours:if cv2.contourArea(cnt) > 50:char = 'a' + str(len(char))else:char = '0' + str(len(char))print(char)```这个代码假设每个字符都是一个简单的形状,并且可以通过查找轮廓来识别。

SpringBoot实现qq邮箱验证码注册和登录验证功能

SpringBoot实现qq邮箱验证码注册和登录验证功能

SpringBoot实现qq邮箱验证码注册和登录验证功能⽬录1、登录注册思路1.1、思路1.2、整个项⽬结构图2、准备2.1、开启邮箱POP3/SMTP服务2.2、创建⼀个spring boot项⽬的时候,⼀直确认,jdk选择8。

2.3、application.properties配置⽂件2.4、创建数据库3、全部代码类3.1、UserController.java3.2、UserMapper.java3.3、User.java3.4、MailService.java ,重要。

3.5、UserVo.java3.6、UserVoToUser.java3.7、UserMapper.xml4、使⽤postman测试4.1、测试发送邮件4.2、测试注册4.3、测试登录总结1、登录注册思路这是⼀个使⽤spring boot做的⼀个qq邮箱注册和登录的项⽬。

没写前端页⾯,使⽤postman测试。

有截图详细。

1.1、思路注册:通过输⼊的邮箱发送验证码,检验前端传来的验证码是否和后台⽣成的⼀致,若⼀致,将数据写⼊数据库,完成注册;登录:通过输⼊的邮箱查询密码,然后⽐较密码是否⼀致,⼀致就是登录成功。

1.2、整个项⽬结构图2、准备2.1、开启邮箱POP3/SMTP服务登录qq邮箱后,点击左上⽅的设置,选择账户,如下图。

然后⼀直往下滑,看到如下图的POP3/SMTP服务,点击开启,应该会让帮定的⼿机号发个短信,然后会收到⼀个授权码,⼀定要好好保存,在appliction.properties配置中会⽤到。

2.2、创建⼀个spring boot项⽬的时候,⼀直确认,jdk选择8。

下边是pom.xml中<dependencies>标签的全部依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><!--jdbc--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency></dependencies>2.3、application.properties配置⽂件application.properties配置⽂件#邮箱配置#平台地址,这⾥⽤的是qq邮箱,使⽤其他邮箱请更换spring.mail.host = #改成⾃⼰的邮箱ername = xxxxx@#发送短信后它给你的授权码填写到这⾥spring.mail.password = xxxxxx#这东西不⽤改spring.mail.properties.mail.smtp.ssl.enable=true##编码格式spring.mail.default-encoding=UTF-8#数据库相关配置spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/email?useSSL=true&characterEncoding=utf-8&serverTimezone=UTC ername=rootspring.datasource.password=root#配置mappermybatis.mapper-locations=classpath:mapper/*.xml2.4、创建数据库数据库结构如下图创建⼀个数据库emailCREATE DATABASE email;在email数据库创建user表CREATE TABLE `user` (`id` int(20) NOT NULL AUTO_INCREMENT,`username` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,`email` varchar(255) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;3、全部代码类如最上边的项⽬结构图。

2013最新腾讯QQ登陆过程及代码【亲测有效】

2013最新腾讯QQ登陆过程及代码【亲测有效】

最新腾讯QQ登陆JS加密过程及代码/*//加密过程:var Q = jQuery.trim($('#q').val());var U = uin2hex(Q);//QQ号转16进制;(再插入\x)313838383930323134\xvar M = jQuery.trim($('#p').val());//QQ密码var I = hexchar2bin(md5(M));var H = md5(I + U);var V = jQuery.trim($('#v').val());//验证码var G = md5(H + V.toUpperCase());//加密js代码:var hexcase = 1;var b64pad = "";var chrsz = 8;var mode = 32;function md5(A) {return hex_md5(A)}function hex_md5(A) {return binl2hex(core_md5(str2binl(A), A.length * chrsz))}function str_md5(A) {return binl2str(core_md5(str2binl(A), A.length * chrsz))}function hex_hmac_md5(A, B) {return binl2hex(core_hmac_md5(A, B))}function b64_hmac_md5(A, B) {return binl2b64(core_hmac_md5(A, B))}function str_hmac_md5(A, B) {return binl2str(core_hmac_md5(A, B))}function core_md5(K, F) {K[F >> 5] |= 128 << ((F) % 32);K[(((F + 64) >>> 9) << 4) + 14] = F;var J = 1732584193;var I = -271733879;var H = -1732584194;var G = 271733878;for (var C = 0; C < K.length; C += 16) {var E = J;var D = I;var B = H;var A = G;J = md5_ff(J, I, H, G, K[C + 0], 7, -680876936);G = md5_ff(G, J, I, H, K[C + 1], 12, -389564586);H = md5_ff(H, G, J, I, K[C + 2], 17, 606105819);I = md5_ff(I, H, G, J, K[C + 3], 22, -1044525330);J = md5_ff(J, I, H, G, K[C + 4], 7, -176418897);G = md5_ff(G, J, I, H, K[C + 5], 12, 1200080426);H = md5_ff(H, G, J, I, K[C + 6], 17, -1473231341);I = md5_ff(I, H, G, J, K[C + 7], 22, -45705983);J = md5_ff(J, I, H, G, K[C + 8], 7, 1770035416);G = md5_ff(G, J, I, H, K[C + 9], 12, -1958414417);H = md5_ff(H, G, J, I, K[C + 10], 17, -42063);I = md5_ff(I, H, G, J, K[C + 11], 22, -1990404162);J = md5_ff(J, I, H, G, K[C + 12], 7, 1804603682);G = md5_ff(G, J, I, H, K[C + 13], 12, -40341101);H = md5_ff(H, G, J, I, K[C + 14], 17, -1502002290);I = md5_ff(I, H, G, J, K[C + 15], 22, 1236535329);J = md5_gg(J, I, H, G, K[C + 1], 5, -165796510);G = md5_gg(G, J, I, H, K[C + 6], 9, -1069501632);H = md5_gg(H, G, J, I, K[C + 11], 14, 643717713);I = md5_gg(I, H, G, J, K[C + 0], 20, -373897302);J = md5_gg(J, I, H, G, K[C + 5], 5, -701558691);G = md5_gg(G, J, I, H, K[C + 10], 9, 38016083);H = md5_gg(H, G, J, I, K[C + 15], 14, -660478335);I = md5_gg(I, H, G, J, K[C + 4], 20, -405537848);J = md5_gg(J, I, H, G, K[C + 9], 5, 568446438);G = md5_gg(G, J, I, H, K[C + 14], 9, -1019803690);H = md5_gg(H, G, J, I, K[C + 3], 14, -187363961);I = md5_gg(I, H, G, J, K[C + 8], 20, 1163531501);J = md5_gg(J, I, H, G, K[C + 13], 5, -1444681467);G = md5_gg(G, J, I, H, K[C + 2], 9, -51403784);H = md5_gg(H, G, J, I, K[C + 7], 14, 1735328473);I = md5_gg(I, H, G, J, K[C + 12], 20, -1926607734);J = md5_hh(J, I, H, G, K[C + 5], 4, -378558);G = md5_hh(G, J, I, H, K[C + 8], 11, -2022574463);H = md5_hh(H, G, J, I, K[C + 11], 16, 1839030562);I = md5_hh(I, H, G, J, K[C + 14], 23, -35309556);J = md5_hh(J, I, H, G, K[C + 1], 4, -1530992060);G = md5_hh(G, J, I, H, K[C + 4], 11, 1272893353);H = md5_hh(H, G, J, I, K[C + 7], 16, -155497632);I = md5_hh(I, H, G, J, K[C + 10], 23, -1094730640);J = md5_hh(J, I, H, G, K[C + 13], 4, 681279174);G = md5_hh(G, J, I, H, K[C + 0], 11, -358537222);H = md5_hh(H, G, J, I, K[C + 3], 16, -722521979);I = md5_hh(I, H, G, J, K[C + 6], 23, 76029189);J = md5_hh(J, I, H, G, K[C + 9], 4, -640364487);G = md5_hh(G, J, I, H, K[C + 12], 11, -421815835);H = md5_hh(H, G, J, I, K[C + 15], 16, 530742520);I = md5_hh(I, H, G, J, K[C + 2], 23, -995338651);J = md5_ii(J, I, H, G, K[C + 0], 6, -198630844);G = md5_ii(G, J, I, H, K[C + 7], 10, 1126891415);H = md5_ii(H, G, J, I, K[C + 14], 15, -1416354905);I = md5_ii(I, H, G, J, K[C + 5], 21, -57434055);J = md5_ii(J, I, H, G, K[C + 12], 6, 1700485571);G = md5_ii(G, J, I, H, K[C + 3], 10, -1894986606);H = md5_ii(H, G, J, I, K[C + 10], 15, -1051523);I = md5_ii(I, H, G, J, K[C + 1], 21, -2054922799);J = md5_ii(J, I, H, G, K[C + 8], 6, 1873313359);G = md5_ii(G, J, I, H, K[C + 15], 10, -30611744);H = md5_ii(H, G, J, I, K[C + 6], 15, -1560198380);I = md5_ii(I, H, G, J, K[C + 13], 21, 1309151649);J = md5_ii(J, I, H, G, K[C + 4], 6, -145523070);G = md5_ii(G, J, I, H, K[C + 11], 10, -1120210379);H = md5_ii(H, G, J, I, K[C + 2], 15, 718787259);I = md5_ii(I, H, G, J, K[C + 9], 21, -343485551);J = safe_add(J, E);I = safe_add(I, D);H = safe_add(H, B);G = safe_add(G, A)}if (mode == 16) {return Array(I, H)} else {return Array(J, I, H, G)}}function md5_cmn(F, C, B, A, E, D) {return safe_add(bit_rol(safe_add(safe_add(C, F), safe_add(A, D)), E), B) }function md5_ff(C, B, G, F, A, E, D) {return md5_cmn((B & G) | ((~B) & F), C, B, A, E, D)}function md5_gg(C, B, G, F, A, E, D) {return md5_cmn((B & F) | (G & (~F)), C, B, A, E, D)}function md5_hh(C, B, G, F, A, E, D) {return md5_cmn(B ^ G ^ F, C, B, A, E, D)}function md5_ii(C, B, G, F, A, E, D) {return md5_cmn(G ^ (B | (~F)), C, B, A, E, D)}function core_hmac_md5(C, F) {var E = str2binl(C);if (E.length > 16) {E = core_md5(E, C.length * chrsz)}var A = Array(16),D = Array(16);for (var B = 0; B < 16; B++) {A[B] = E[B] ^ 909522486;D[B] = E[B] ^ 1549556828}var G = core_md5(A.concat(str2binl(F)), 512 + F.length * chrsz);return core_md5(D.concat(G), 512 + 128)}function safe_add(A, D) {var C = (A & 65535) + (D & 65535);var B = (A >> 16) + (D >> 16) + (C >> 16);return (B << 16) | (C & 65535)}function bit_rol(A, B) {return (A << B) | (A >>> (32 - B))}function str2binl(D) {var C = Array();var A = (1 << chrsz) - 1;//alert(chrsz);for (var B = 0; B < D.length * chrsz; B += chrsz) {C[B >> 5] |= (D.charCodeAt(B / chrsz) & A) << (B % 32) }//alert(C);return C}function binl2str(C) {var D = "";var A = (1 << chrsz) - 1;for (var B = 0; B < C.length * 32; B += chrsz) {D += String.fromCharCode((C[B >> 5] >>> (B % 32)) & A)}return D}function binl2hex(C) {var B = hexcase ? "0123456789ABCDEF": "0123456789abcdef";var D = "";for (var A = 0; A < C.length * 4; A++) {D += B.charAt((C[A >> 2] >> ((A % 4) * 8 + 4)) & 15) + B.charAt((C[A >> 2] >> ((A % 4) * 8)) & 15)}return D}function binl2b64(D) {var C = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var F = "";for (var B = 0; B < D.length * 4; B += 3) {var E = (((D[B >> 2] >> 8 * (B % 4)) & 255) << 16) | (((D[B + 1 >> 2] >> 8 * ((B + 1) % 4)) & 255) << 8) | ((D[B + 2 >> 2] >> 8 * ((B + 2) % 4)) & 255);for (var A = 0; A < 4; A++) {if (B * 8 + A * 6 > D.length * 32) {F += b64pad} else {F += C.charAt((E >> 6 * (3 - A)) & 63)}}}return F}function hexchar2bin(str) {var arr = [];for (var i = 0; i < str.length; i = i + 2) {arr.push("\\x" + str.substr(i, 2))}arr = arr.join("");//alert(arr);eval("var temp = '" + arr + "'");//alert(temp);return temp;}function uin2hex(str) {var maxLength = 16;str = parseInt(str);var hex = str.toString(16);var len = hex.length;for (var i = len; i < maxLength; i++) {hex = "0" + hex}var arr = [];for (var j = 0; j < maxLength; j += 2) {arr.push("\\x" + hex.substr(j, 2)) }var result = arr.join("");eval('result="' + result + '"');return result}。

python识别验证码——一般的数字加字母验证码识别

python识别验证码——一般的数字加字母验证码识别

python识别验证码——⼀般的数字加字母验证码识别1、验证码的识别是有针对性的,不同的系统、应⽤的验证码区别有⼤有⼩,只要处理好图⽚,利⽤好pytesseract,⼀般的验证码都可以识别2、我在识别验证码的路上⾛了很多弯路,重点应该放在怎么把图⽚处理成这个样⼦,⽅便pytesseract的识别,以提⾼成功率3、原图为:思想过程:①不要盲⽬的去直接⽤代码识别,识别不出来就怀疑代码有问题或者pytesseract不好⽤:先将验证码⽤图⽚处理⼯具处理,⼀步步得到理想图⽚,记住处理过程,将处理后的图⽚直接⽤pytesseract识别,代码如下:# -*- coding: UTF-8 -*-、import Imageimport pytesseractim = Image.open('31.png')aa = pytesseract.image_to_string(out)print aa②确定图⽚可以识别后,开始⽤代码复现你的图⽚处理过程# -*- coding: UTF-8 -*_from PIL import Imagefrom pytesseract import *import PIL.ImageOpsdef initTable(threshold=140):table = []for i in range(256):if i < threshold:table.append(0)else:table.append(1)return tableim = Image.open('31.png')#图⽚的处理过程im = im.convert('L')binaryImage = im.point(initTable(), '1')im1 = binaryImage.convert('L')im2 = PIL.ImageOps.invert(im1)im3 = im2.convert('1')im4 = im3.convert('L')#将图⽚中字符裁剪保留box = (30,10,90,28)region = im4.crop(box)#将图⽚字符放⼤out = region.resize((120,38))asd = pytesseract.image_to_string(out)print asdprint (out.show())先将图⽚转换为L模式然后去噪反转颜⾊将重要部分裁剪放⼤输出结果:。

易语言验证码识别源码

易语言验证码识别源码

易语言验证码识别源码以下是一个使用易语言开发的简单验证码识别源码:```basic//图片预处理procedure preProcess(var img: TImage)varcolor1, color2, color3: int64;i, j: integer;begin//缩小图片img.SetRect(img.Width / 2, img.Height / 2, img.Width, img.Height);img.Save("temp.jpg");img.Clear;img.Load("temp.jpg");//灰度化处理for i := 0 to img.Width - 1 dobeginfor j := 0 to img.Height - 1 dobegincolor1 := img.GetPixel(i, j) and $FF;color2 := (img.GetPixel(i, j) shr 8) and $FF;color3 := (img.GetPixel(i, j) shr 16) and $FF;img.SetPixel(i, j, (color1 + color2 + color3) div 3); end;end;//二值化处理for i := 0 to img.Width - 1 dobeginfor j := 0 to img.Height - 1 dobeginif img.GetPixel(i, j) < 128 thenimg.SetPixel(i, j, 0)elseimg.SetPixel(i, j, 255);end;end;end;//切割验证码图片procedure splitImage(var img: TImage; var imgList: array of TImage)varlineWidth, i, j, k, start, endPos: integer;colStart: boolean;beginlineWidth := 1;colStart := false;start := -1;for i := 0 to img.Width - 1 dobeginfor j := 0 to img.Height - 1 dobeginif img.GetPixel(i, j) = 0 thenbeginlineWidth := 0;colStart := true;break;end;if colStart thenbreak;end;k:=0;for i := lineWidth to img.Width - 1 do beginlineWidth := 0;for j := 0 to img.Height - 1 dobeginif img.GetPixel(i, j) = 255 thenbeginlineWidth := 1;colStart := true;break;end;end;if (lineWidth > 0) thenif (start = -1) thenstart := i - 1;endelse if (colStart and (lineWidth = 0) and (start <> -1)) thenbeginendPos := i + 1;imgList[k].Create(endPos - start, img.Height, pic_gray);for j := 0 to img.Height - 1 dobeginimgList[k].CopyRect(img2, 0, 0, img, start, j, endPos, j + 1);end;inc(k);start := -1;end;end;end;//提取特征码function getFeatureCode(var img: TImage): string varcode: string;count, i, j: integer;begincode := '';count := 0;while count < 4 dobeginfor i := 0 to img.Width - 1 dobeginfor j := 0 to img.Height - 1 dobeginif img.GetPixel(i, j) = 0 thenbeginif i < img.Width - 1 thenimg.SetPixel(i, j, 255);if j < img.Height - 1 thenimg.SetPixel(i, j + 1, 255);code := code + '1';inc(count);break;end;end;if count > 0 thenbreak;end;end;result := code;end;//主程序varimgOriginal, imgPreprocessed: TImage;imgList: array [0..3] of TImage;featureCode: string;beginimgOriginal.Load("captcha.jpg"); // 加载验证码图片//预处理imgPreprocessed.Create(imgOriginal.Width, imgOriginal.Height, pic_gray);imgPreprocessed.CopyRect(imgOriginal, 0, 0, imgOriginal, 0, 0, imgOriginal.Width, imgOriginal.Height);preProcess(imgPreprocessed);//切割验证码splitImage(imgPreprocessed, imgList);//提取特征码featureCode := '';for i := 0 to 3 dobeginfeatureCode := featureCode + getFeatureCode(imgList[i]);end;MessageBox("", "验证码识别结果:" + featureCode);end.```这个源码实现了一个简单的验证码识别程序。

QQ应用程序源代码

QQ应用程序源代码

QQ源代码// MyQQ.cpp: implementation of the MyQQ class. //////////////////////////////////////////////////////////////////// // #include #include#include "winsock2.h"#include "MyQQ.h" #include "md5.h"#ifdef _DEBUG #undef THIS_FILEstatic char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif////////////////////////////////////////////////////////////////////// // Construction/Destruction////////////////////////////////////////////////////////////////////// MyQQ::MyQQ() {s = NULL;LoginToken = NULL; LoginTokenLength = 0; Status = 0; //下线 IsLogin = false; LastID = 0;MessageText = NULL; FriendListHead = NULL; FriendListTail = NULL;send_seq = random() & 0x0000ffff; LastOnline = time(NULL); UDPServerNum = 0; //服务器地址LoginServer = (char *)malloc(16*sizeof(char)); //QQ号 UserID = 0; //密码Password = NULL;//得到初始化密钥,按2004版InitKey = (unsigned char*)malloc(QQ_KEY_LENGTH);int i;for(i = 0; i < 16; i++) InitKey = rand();SessionKey = (unsigned char*)malloc(QQ_KEY_LENGTH); }MyQQ::~MyQQ() {if(LoginServer != NULL) free(LoginServer); if(MyIP != NULL) free(MyIP); if(MessageText != NULL) free(MessageText); if(Password != NULL) free(Pass word); if(InitKey != NULL) free(InitKey); if(PwdKey != NULL) free(PwdKey); if(SessionKey != NULL) free(SessionKey);if(FriendListHead != NULL) {QQFriend *p = FriendListHead->next; while(p != NULL) {free(FriendListHead); FriendListHead = p; p = p->next; }if(FriendListTail != NULL) free(FriendListTail); } }void MyQQ::Login(int pMode) {unsigned char *buf, *cursor, *raw_data, *encrypted_data; int seq_ret;int encrypted_len, bytes;//登录模式:1 为正常登录,2为隐身登录 ,3登录即离开 LoginMode = pMode;if(LoginToken == NULL) {//发送获取登录令牌的包 qq_get_logintoken(); } else {//2004登录包buf = (unsigned char*)malloc(MAX_PACKAGE_LENGTH); //包长65535 raw_data = (unsigned char*)malloc(QQ_LOGIN_DATA_LENGTH); //数据长encrypted_data = (unsigned char*)malloc(QQ_LOGIN_DATA_LENGTH + 16); //加密数据长度多16// 产生密文// 000-015 用PwdKey加密空串MCrypter.qq_crypt(ENCRYPT, (unsigned char*)"", 0, PwdKey, raw_data, &encrypted_le n);//016-051 36字节的固定内容memmove(raw_data + 16, login_16_51, 36);//052-052 登录方式raw_data[52] = (unsigned char)LoginMode;//053-068 16字节固定内容memmove(raw_data + 53, login_53_68, 16);//069 登录令牌长度 int pos = 69;raw_data[pos++] = (unsigned char)LoginTokenLength;//070-? 登录令牌memmove(raw_data + pos, LoginToken, LoginTokenLength);pos += LoginTokenLength;//未知字节0x40raw_data[pos++] = 0x40;//固定字节memmove(raw_data + pos, LOGIN_SEGMENTS, 100);pos += 100;//剩下的字节填零for(; pos < QQ_LOGIN_DATA_LENGTH; pos++) raw_data[pos] = 0x00;//加密MCrypter.qq_crypt(ENCRYPT, raw_data, QQ_LOGIN_DATA_LENGTH, InitKey, encryp ted_data, &encrypted_len);cursor = buf; bytes = 0;bytes += create_packet_head_seq(buf, &cursor, QQ_CMD_LOGIN, true, &seq_ret);bytes += create_packet_dw(buf, &cursor, UserID);bytes += create_packet_data(buf, &cursor, InitKey, QQ_KEY_LENGTH); bytes += c reate_packet_data(buf, &cursor, encrypted_data, encrypted_len); bytes += create_packet_b(b uf, &cursor, QQ_PACKET_TAIL);if (bytes == (cursor - buf)) //包被无误创建 {qq_send_packet(buf, bytes, QQ_CMD_LOGIN); }free(buf);free(raw_data);free(encrypted_data); } }//从包中读取一个字节int MyQQ::read_packet_b(unsigned char * buf, unsigned char ** cursor, int buflen, unsigned ch ar * b) {if(*cursor <= buf + buflen - sizeof(*b)) {*b = **(unsigned char **) cursor; *cursor += sizeof(*b); return sizeof(*b); } elsereturn -1; }//从包中读取一个字int MyQQ::read_packet_w(unsigned char * buf, unsigned char ** cursor, int buflen, short * w) {if(*cursor <= buf + buflen - sizeof(*w)) {*w = ntohs(**(short **) cursor); *cursor += sizeof(*w); return sizeof(*w); } e lsereturn -1; }//处理收到的消息void MyQQ::qq_process_recv_im(unsigned char* buf, int buf_len, short seq) {int len, bytes;unsigned char *data, *cursor; qq_recv_im_header *im_header;len = buf_len;data = (unsigned char *)malloc(len);if (MCrypter.qq_crypt(DECRYPT, buf, buf_len, SessionKey, data, &len)) {if(len < 16) return; elseqq_send_packet_recv_im_ack(seq, data);cursor = data; bytes = 0;im_header = (qq_recv_im_header *)malloc(sizeof(qq_recv_im_header)); bytes += re ad_packet_dw(data, &cursor, len, &(im_header->sender_uid)); bytes += read_packet_dw(dat a, &cursor, len, &(im_header->receiver_uid)); bytes += read_packet_dw(data, &cursor, len, &(im_header->server_im_seq));bytes += read_packet_data(data, &cursor, len, (unsigned char *) & (im_header->sender_ip ), 4);bytes += read_packet_w(data, &cursor, len, &(im_header->sender_port)); bytes += re ad_packet_w(data, &cursor, len, &(im_header->im_type));if (bytes != 20) { // im_header的长度 return;}if (im_header->receiver_uid != UserID) {return; }LastID = im_header->sender_uid;switch (im_header->im_type) {case QQ_RECV_IM_TO_BUDDY:qq_process_recv_normal_im(data, &cursor, len); break;case QQ_RECV_IM_TO_UNKNOWN:qq_process_recv_normal_im(data, &cursor, len); break;case QQ_RECV_IM_GROUP_IM://qq_process_recv_group_im(data, &cursor, len, im_header->sender_uid, gc); break; case QQ_RECV_IM_ADD_TO_GROUP: //qq_process_recv_group_im_been_added(da ta, &cursor, len, im_header->sender_uid, gc); break;case QQ_RECV_IM_DEL_FROM_GROUP://qq_process_recv_group_im_been_removed(data, &cursor, len, im_header->sender_uid, gc); break;case QQ_RECV_IM_APPL Y_ADD_TO_GROUP: //qq_process_recv_group_im_apply _join(data, &cursor, len, im_header->sender_uid, gc); break;case QQ_RECV_IM_APPROVE_APPL Y_ADD_TO_GROUP://qq_process_recv_group_im_been_approved(data, &cursor, len, im_header->sender_uid, gc); break;。

验证码自动识别代码之VB编

验证码自动识别代码之VB编
Dim R As Byte, G As Byte, B As Byte, Gray As Byte, I As Long
With pic1
.AutoRedraw = True
scan0 As Long
reserved As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
Private Declare Function GdiplusStartup Lib "gdiplus" (Token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Sub GdiplusShutdown Lib "gdiplus" (ByVal Token As Long)
If R <> B Then Gray = 255
If Gray > 180 Then Gray = 255 Else Gray = 0
PicBits(I * BytesPerPixel + 1) = Gray
GetObject .Image, Len(PicInfo), PicInfo
BytesPerPixel = PicInfo.bmBitsPixel \ 8
ReDim PicBits(1 To PicInfo.bmWidth * PicInfo.bmHeight * BytesPerPixel)

验证码识别基础方法及源码

验证码识别基础方法及源码

先说说写这个的背景最近有朋友在搞一个东西,已经做的挺不错了,最后想再完美一点,于是乎就提议把这种验证码给K.O.了,于是乎就K.O.了这个验证码。

达到单个图片识别时间小于200ms,500个样本人工统计正确率为95%。

由于本人没有相关经验,是摸着石头过河。

本着经验分享的精神,分享一下整个分析的思路。

在各位大神面前献丑了。

再看看部分识别结果是不是看着很眼熟?处理第一步,去背景噪音和二值化对于这一块,考虑了几种方法。

方法一,统计图片颜色分布,颜色占有率低的判定为背景噪音。

由于背景噪音和前景色区分并不明显,尝试了很多种取景方法都不能很好去除背景噪音,最终放弃了这种方法。

方法二,事后在网上稍微查了下,最近比较流行计算灰度后设定一个阈值进行二值化。

其实所谓的灰度图片原理是根据人眼对色彩敏感度取了权值,这个权值对计算机来说没有什么意义。

稍微想一下就可以发现,这两个过程完全可以合并。

于是乎我一步完成了去背景噪音和二值化。

阈值设置为RGB三分量之和到500。

结果非常令人满意。

处理第二步,制作字符样本样本对于计算机来说是非常重要的,因为计算机很难有逻辑思维,就算有逻辑思维也要经过长期训练才能让你满意。

所以要用事先制作好的样本进行比较。

如果你仔细观察过这些验证码会发现一个bug,几乎大部分的验证码都是使用同样的字体,于是乎就人工制作了一套字体的样本。

由于上一步已经有去除背景噪音的结果,可以直接利用。

制作样本这一步有点简单枯燥,还需要细心。

可能因为你的一个不细心会导致某个符号的识别率偏低。

在这500个样本中,只发现了31个字符。

幸亏是某部门的某人员还考虑到了易错的字符,例如,1和I,0和O等。

要不然这个某部门要背负更多的骂名。

处理第三步,匹配单个匹配用了最简单最原始的二值比较,不过匹配的是匹配率而不是匹配数。

我定义了相关的计分原则。

大原则是“该有的有了加分,该有的没了减分,不该有的有了适度减分,可达区域外的不算分”。

易语言验证码简单识别参考源码

易语言验证码简单识别参考源码
.计次循环首 (6, x) .计次循环首 (原图高, y) .如果 (图片组 [n].取某点颜色 (x - 1, y - 1) = #黑色) 数据组 [n] = 数据组 [n] + “1” .否则 数据组 [n] = 数据组 [n] + “0” .如果结束
.计次循环尾 () .计次循环尾 () 编辑框 1.内容 = 编辑框 1.内容 + “第 ” + 到文本 (n) + “ 位的特征串:” + 数据 组 [n] + #换行符 ' 这一行用来输出当前取得的特征串的文本,以便大家更好的理解 编辑框 2.内容 = 编辑框 2.内容 + 到文本 (比对程序 (数据组 [n])) .计次循环尾 () 图片框 7.图片 = a.取位图数据 ()
a.置某点颜色 (x - 1, y - 1, #白色) .如果结束
.计次循环尾 () .计次循环尾 () ' ------------------------切割 n = 0 ' 初始化变量 x=0 y=0 .计次循环首 (6, n) ' 因为是六块所以要处理六次
图片组 [n].创建 (6, 原图高, a.取位深度 (), #白色) ' 图片组存放变量加入一个宽 6 高 10 的空白图片备用 6 是一个字的实际有颜色的宽度
.子程序 __启动窗口_创建完毕
.子程序 图片框选择, 图片框 .参数 a, 整数型, , 第几个
.如果 (a = 1) 返回 (图片框 1)
.否则 .如果 (a = 2) 返回 (图片框 2) .否则 .如果 (a = 3) 返回 (图片框 3) .否则 .如果 (a = 4) 返回 (图片框 4) .否则 .如果 (a = 5) 返回 (图片框 5) .否则 .如果 (a = 6) 返回 (图片框 6) .否则 .如果 (a = 0) 返回 (图片框 7) .否则 返回 (图片框 7) .如果结束

python验证码识别示例(一)某个网站验证码识别

python验证码识别示例(一)某个网站验证码识别

python验证码识别⽰例(⼀)某个⽹站验证码识别某个招聘⽹站的验证码识别,过程如下⼀:原始验证码:⼆:⾸先对验证码进⾏分析,该验证码的数字颜⾊有变化,这个就是识别这个验证码遇到的⽐较难的问题,解决⽅法是使⽤PIL 中的 getpixel ⽅法进⾏变⾊处理,统⼀把⾮⿊⾊的像素点变成⿊⾊ 变⾊后的图⽚三:通过观察,发现该验证码有折线,需要对图⽚进⾏降噪处理。

降噪后的图⽚四:识别: 这⾥只是简单的使⽤ pytesseract 模块进⾏识别 识别结果如下: 总共⼗⼀个验证码,识别出来了9个,综合识别率是百分之⼋⼗。

总结:验证码识别只是简单调⽤了⼀下Python的第三⽅库,本验证码的识别难点如何给带颜⾊的数字变⾊。

下⾯是代码:⼆值化变⾊:#-*-coding:utf-8-*-from PIL import Imagedef test(path):img=Image.open(path)w,h=img.sizefor x in range(w):for y in range(h):r,g,b=img.getpixel((x,y))if 190<=r<=255 and 170<=g<=255 and 0<=b<=140:img.putpixel((x,y),(0,0,0))if 0<=r<=90 and 210<=g<=255 and 0<=b<=90:img.putpixel((x,y),(0,0,0))img=img.convert('L').point([0]*150+[1]*(256-150),'1')return imgfor i in range(1,13):path = str(i) + '.jpg'im = test(path)path = path.replace('jpg','png')im.save(path)⼆:降噪#-*-coding:utf-8-*-# coding:utf-8import sys, osfrom PIL import Image, ImageDraw# ⼆值数组t2val = {}def twoValue(image, G):for y in xrange(0, image.size[1]):for x in xrange(0, image.size[0]):g = image.getpixel((x, y))if g > G:t2val[(x, y)] = 1else:t2val[(x, y)] = 0# 根据⼀个点A的RGB值,与周围的8个点的RBG值⽐较,设定⼀个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等数⼩于N时,此点为噪点# G: Integer 图像⼆值化阀值# N: Integer 降噪率 0 <N <8# Z: Integer 降噪次数# 输出# 0:降噪成功# 1:降噪失败def clearNoise(image, N, Z):for i in xrange(0, Z):t2val[(0, 0)] = 1t2val[(image.size[0] - 1, image.size[1] - 1)] = 1for x in xrange(1, image.size[0] - 1):for y in xrange(1, image.size[1] - 1):nearDots = 0L = t2val[(x, y)]if L == t2val[(x - 1, y - 1)]:nearDots += 1if L == t2val[(x - 1, y)]:nearDots += 1if L == t2val[(x - 1, y + 1)]:nearDots += 1if L == t2val[(x, y - 1)]:nearDots += 1if L == t2val[(x, y + 1)]:nearDots += 1if L == t2val[(x + 1, y - 1)]:nearDots += 1if L == t2val[(x + 1, y)]:nearDots += 1if L == t2val[(x + 1, y + 1)]:nearDots += 1if nearDots < N:t2val[(x, y)] = 1def saveImage(filename, size):image = Image.new("1", size)draw = ImageDraw.Draw(image)for x in xrange(0, size[0]):for y in xrange(0, size[1]):draw.point((x, y), t2val[(x, y)])image.save(filename)for i in range(1,12):path = str(i) + ".png"image = Image.open(path).convert("L")twoValue(image, 100)clearNoise(image, 3, 2)path1 = str(i) + ".jpeg"saveImage(path1, image.size)三:识别#-*-coding:utf-8-*-from PIL import Imageimport pytesseractdef recognize_captcha(img_path):im = Image.open(img_path)# threshold = 140# table = []# for i in range(256):# if i < threshold:# table.append(0)# else:# table.append(1)## out = im.point(table, '1')num = pytesseract.image_to_string(im)return numif__name__ == '__main__':for i in range(1, 12):img_path = str(i) + ".jpeg"res = recognize_captcha(img_path) strs = res.split("\n")if len(strs) >=1:print (strs[0])。

易语言验证码简单识别参考源码

易语言验证码简单识别参考源码

易语言验证码简单识别参考源码//引入必要的包#include<iostream>#include<opencv2/opencv.hpp>#include<opencv2/ml.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<vector>#include<string>using namespace std;using namespace cv;using namespace cv::ml;//定义一些常用的变量Mat src;Mat src_gray;int thresh = 100;int max_thresh = 255;string pic_path = "E:/yanzhengma/numbers.jpg";//定义文字样本string samples_path = "E:/yanzhengma/"; //样本路径vector<string> samples_name = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; //样本文字int character_num = 10; //字符种类数//定义一个函数,用于储存样本字符,并返回样本数组vector<Mat> loadTrainData//定义存放样本图片的数组vector<Mat> train_images;//循环读取文件夹中的文件for (int i = 0; i < character_num; i++)//定义存放每个字符图片的变量Mat single_image;//把每个字符的每张图片名称拼接出来:开始string single_pic_name;single_pic_name = samples_path + samples_name[i] + "/" + samples_name[i] + "_"; //例如 0_1.jpg//把每个字符的每张图片名称拼接出来:结束//把每个字符的每张图片读取出来:开始for (int j = 0; j < 10; j++)stringstream str;str << j;string str_name;str >> str_name;string image_name = single_pic_name + str_name + ".jpg"; single_image = imread(image_name);//imshow("single_image", single_image);//waitKey(0);if (!single_image.data)cout << "未能正确读取图片" << endl;continue;}//把每个字符的每张图片读取出来:结束//把每个字符的每张图片存入数组:开始train_images.push_back(single_image);//把每个字符的每张图片存入数组:结束}}//返回存放样本图片的数组。

qq获取验证码接口

qq获取验证码接口

qq获取验证码接⼝测试获取验证码import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddr#定义参数my_mail = "2501186626@"#授权码my_pass = "qnxrmxwxlyzoeadc"#定义发送邮件的⽅法def mail(subject,content,mailaddr):#声明邮件对象msg = MIMEText(content,'plain','utf-8')#设置发送⽅对象msg['From'] = formataddr(['在线教育平台',my_mail])#设置收件⽅对象msg['To'] = formataddr(['尊敬的客户',mailaddr])#设置标题msg['Subject'] = subject#设置smtp服务器server = smtplib.SMTP_SSL("",465)#登录邮箱server.login(my_mail,my_pass)#发送邮件server.sendmail(my_mail,[mailaddr],msg.as_string())#关闭smtp链接server.quit()mail('验证码验证服务','您的验证码是6666,有限期为2分钟','164850527@') 获取qq验证码接⼝class Main(APIView):def post(self,request):my_mail=request.data.get('email')mailaddr=my_mailmy_pass = "qnxrmxwxlyzoeadc"subject='验证码验证服务'import randomcontent='%06d' % random.randint(0, 999999) # 随机6位验证码msg = MIMEText(content, 'plain', 'utf-8')# 设置发送⽅对象msg['From'] = formataddr(['在线教育平台', my_mail])# 设置收件⽅对象msg['To'] = formataddr(['尊敬的客户', mailaddr])# 设置标题msg['Subject'] = subject# 设置smtp服务器server = smtplib.SMTP_SSL("", 465)# 登录邮箱server.login(my_mail, my_pass)# 发送邮件server.sendmail(my_mail, [mailaddr], msg.as_string())# 关闭smtp链接server.quit()redis_client = get_redis_connection('default') # 指定设置 redis 库redis_client.setex(my_mail, 60 * 5, content) # 通过键和有效时间存储验证码return Response({'msg':'ok','code':'发送成功',}) setting 配置 redis 数据库CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/1","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient", }}} 获取redis 验证码from django_redis import get_redis_connectionredis_client = get_redis_connection('default') # 指定数据库redis_code=redis_client.get(email) # phone:code # 获取数据if redis_code:redis_code= redis_code.decode()if not code ==redis_code:return Response({'msg':'验证码不正确'})。

Python实现验证码识别

Python实现验证码识别

Python实现验证码识别⼤致介绍 在python爬⾍爬取某些⽹站的验证码的时候可能会遇到验证码识别的问题,现在的验证码⼤多分为四类: 1、计算验证码 2、滑块验证码 3、识图验证码 4、语⾳验证码 这篇博客主要写的就是识图验证码,识别的是简单的验证码,要想让识别率更⾼,识别的更加准确就需要花很多的精⼒去训练⾃⼰的字体库。

识别验证码通常是这⼏个步骤: 1、灰度处理 2、⼆值化 3、去除边框(如果有的话) 4、降噪 5、切割字符或者倾斜度矫正 6、训练字体库 7、识别 这6个步骤中前三个步骤是基本的,4或者5可根据实际情况选择是否需要,并不⼀定切割验证码,识别率就会上升很多有时候还会下降 这篇博客不涉及训练字体库的内容,请⾃⾏搜索。

同样也不讲解基础的语法。

⽤到的⼏个主要的python库: Pillow(python图像处理库)、OpenCV(⾼级图像处理库)、pytesseract(识别库)灰度处理&⼆值化 灰度处理,就是把彩⾊的验证码图⽚转为灰⾊的图⽚。

⼆值化,是将图⽚处理为只有⿊⽩两⾊的图⽚,利于后⾯的图像处理和识别 在OpenCV中有现成的⽅法可以进⾏灰度处理和⼆值化,处理后的效果: 代码:# ⾃适应阀值⼆值化def _get_dynamic_binary_image(filedir, img_name):filename = './out_img/' + img_name.split('.')[0] + '-binary.jpg'img_name = filedir + '/' + img_nameprint('.....' + img_name)im = cv2.imread(img_name)im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #灰值化# ⼆值化th1 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)cv2.imwrite(filename,th1)return th1去除边框 如果验证码有边框,那我们就需要去除边框,去除边框就是遍历像素点,找到四个边框上的所有点,把他们都改为⽩⾊,我这⾥边框是两个像素宽 注意:在⽤OpenCV时,图⽚的矩阵点是反的,就是长和宽是颠倒的 代码:# 去除边框def clear_border(img,img_name):filename = './out_img/' + img_name.split('.')[0] + '-clearBorder.jpg'h, w = img.shape[:2]for y in range(0, w):for x in range(0, h):if y < 2 or y > w - 2:img[x, y] = 255if x < 2 or x > h -2:img[x, y] = 255cv2.imwrite(filename,img)return img降噪 降噪是验证码处理中⽐较重要的⼀个步骤,我这⾥使⽤了点降噪和线降噪 线降噪的思路就是检测这个点相邻的四个点(图中标出的绿⾊点),判断这四个点中是⽩点的个数,如果有两个以上的⽩⾊像素点,那么就认为这个点是⽩⾊的,从⽽去除整个⼲扰线,但是这种⽅法是有限度的,如果⼲扰线特别粗就没有办法去除,只能去除细的⼲扰线 代码:# ⼲扰线降噪def interference_line(img, img_name):filename = './out_img/' + img_name.split('.')[0] + '-interferenceline.jpg'h, w = img.shape[:2]# opencv矩阵点是反的# img[1,2] 1:图⽚的⾼度,2:图⽚的宽度for y in range(1, w - 1):for x in range(1, h - 1):count = 0if img[x, y - 1] > 245:count = count + 1if img[x, y + 1] > 245:count = count + 1if img[x - 1, y] > 245:count = count + 1if img[x + 1, y] > 245:count = count + 1if count > 2:img[x, y] = 255cv2.imwrite(filename,img)return img 点降噪的思路和线降噪的差不多,只是会针对不同的位置检测的点不⼀样,注释写的很清楚了 代码:# 点降噪def interference_point(img,img_name, x = 0, y = 0):"""9邻域框,以当前点为中⼼的⽥字框,⿊点个数:param x::param y::return:"""filename = './out_img/' + img_name.split('.')[0] + '-interferencePoint.jpg'# todo 判断图⽚的长宽度下限cur_pixel = img[x,y]# 当前像素点的值height,width = img.shape[:2]for y in range(0, width - 1):for x in range(0, height - 1):if y == 0: # 第⼀⾏if x == 0: # 左上顶点,4邻域# 中⼼点旁边3个点sum = int(cur_pixel) \+ int(img[x, y + 1]) \if sum <= 2 * 245:img[x, y] = 0elif x == height - 1: # 右上顶点 sum = int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x - 1, y]) \+ int(img[x - 1, y + 1])if sum <= 2 * 245:img[x, y] = 0else: # 最上⾮顶点,6邻域sum = int(img[x - 1, y]) \+ int(img[x - 1, y + 1]) \+ int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x + 1, y]) \+ int(img[x + 1, y + 1])if sum <= 3 * 245:img[x, y] = 0elif y == width - 1: # 最下⾯⼀⾏ if x == 0: # 左下顶点# 中⼼点旁边3个点sum = int(cur_pixel) \+ int(img[x + 1, y]) \+ int(img[x + 1, y - 1]) \+ int(img[x, y - 1])if sum <= 2 * 245:img[x, y] = 0elif x == height - 1: # 右下顶点 sum = int(cur_pixel) \+ int(img[x, y - 1]) \+ int(img[x - 1, y]) \+ int(img[x - 1, y - 1])if sum <= 2 * 245:img[x, y] = 0else: # 最下⾮顶点,6邻域sum = int(cur_pixel) \+ int(img[x - 1, y]) \+ int(img[x + 1, y]) \+ int(img[x, y - 1]) \+ int(img[x - 1, y - 1]) \+ int(img[x + 1, y - 1])if sum <= 3 * 245:img[x, y] = 0else: # y不在边界if x == 0: # 左边⾮顶点sum = int(img[x, y - 1]) \+ int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x + 1, y - 1]) \+ int(img[x + 1, y]) \+ int(img[x + 1, y + 1])if sum <= 3 * 245:img[x, y] = 0elif x == height - 1: # 右边⾮顶点 sum = int(img[x, y - 1]) \+ int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x - 1, y - 1]) \+ int(img[x - 1, y]) \+ int(img[x - 1, y + 1])if sum <= 3 * 245:img[x, y] = 0else: # 具备9领域条件的sum = int(img[x - 1, y - 1]) \+ int(img[x - 1, y]) \+ int(img[x - 1, y + 1]) \+ int(img[x, y - 1]) \+ int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x + 1, y - 1]) \+ int(img[x + 1, y]) \+ int(img[x + 1, y + 1])img[x, y] = 0cv2.imwrite(filename,img)return img 效果: 其实到了这⼀步,这些字符就可以识别了,没必要进⾏字符切割了,现在这三种类型的验证码识别率已经达到50%以上了字符切割 字符切割通常⽤于验证码中有粘连的字符,粘连的字符不好识别,所以我们需要将粘连的字符切割为单个的字符,在进⾏识别 字符切割的思路就是找到⼀个⿊⾊的点,然后在遍历与他相邻的⿊⾊的点,直到遍历完所有的连接起来的⿊⾊的点,找出这些点中的最⾼的点、最低的点、最右边的点、最左边的点,记录下这四个点,认为这是⼀个字符,然后在向后遍历点,直⾄找到⿊⾊的点,继续以上的步骤。

用于验证码图片识别的类(C#源码)

用于验证码图片识别的类(C#源码)

⽤于验证码图⽚识别的类(C#源码)最近写了⼏个⽹站的验证码图⽚⾃动识别程序,尽管每个⽹站的验证码图⽚都不相同,识别的⽅法有所差别。

但写得多了,也总结出不少相同之处。

今天抽空封装出⼀个基础类来,发现可以很好地重复利⽤,编写不同的验证码识别程序,效率提⾼了不少。

好东东不能独享,现放出来供⼤家共同研究,请⽹友们妥善⽤之。

封装后的类使⽤很简单,针对不同的验证码,相应继承修改某些⽅法,即可简单⼏句代码就可以实现图⽚识别了:GrayByPixels(); //灰度处理GetPicValidByValue(128, 4); //得到有效空间Bitmap[] pics = GetSplitPics(4, 1); //分割string code = GetSingleBmpCode(pics[i], 128); //得到代码串具体使⽤,请参见我做的例⼦:(例⼦说明:使⽤进程投票,可⾃动清除Alert弹出窗⼝,可⾃动换IP,ADSL⽤户⾃⾏修改Restart.bat中第三⾏内容)using System;using System.Collections.Generic;using System.Text;using System.Collections;using System.Drawing;using System.Drawing.Imaging;using System.Runtime.InteropServices;namespace BallotAiying2{class UnCodebase{public Bitmap bmpobj;public UnCodebase(Bitmap pic){bmpobj = new Bitmap(pic); //转换为Format32bppRgb}///<summary>///根据RGB,计算灰度值///</summary>///<param name="posClr">Color值</param>///<returns>灰度值,整型</returns>private int GetGrayNumColor(System.Drawing.Color posClr){return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16;}///<summary>///灰度转换,逐点⽅式///</summary>public void GrayByPixels(){for (int i = 0; i < bmpobj.Height; i++){for (int j = 0; j < bmpobj.Width; j++){int tmpValue = GetGrayNumColor(bmpobj.GetPixel(j, i));bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue));}}}///<summary>///去图形边框///</summary>///<param name="borderWidth"></param>public void ClearPicBorder(int borderWidth){for (int i = 0; i < bmpobj.Height; i++){for (int j = 0; j < bmpobj.Width; j++){if (i < borderWidth || j < borderWidth || j > bmpobj.Width - 1 - borderWidth || i > bmpobj.Height - 1 - borderWidth)bmpobj.SetPixel(j, i, Color.FromArgb(255, 255, 255));}}}///<summary>///灰度转换,逐⾏⽅式///</summary>public void GrayByLine(){Rectangle rec = new Rectangle(0, 0, bmpobj.Width, bmpobj.Height);BitmapData bmpData = bmpobj.LockBits(rec, ImageLockMode.ReadWrite, bmpobj.PixelFormat);// PixelFormat.Format32bppPArgb);// bmpData.PixelFormat = PixelFormat.Format24bppRgb;IntPtr scan0 = bmpData.Scan0;int len = bmpobj.Width * bmpobj.Height;int[] pixels = new int[len];Marshal.Copy(scan0, pixels, 0, len);//对图⽚进⾏处理int GrayValue = 0;for (int i = 0; i < len; i++){GrayValue = GetGrayNumColor(Color.FromArgb(pixels[i]));pixels[i] = (byte)(Color.FromArgb(GrayValue, GrayValue, GrayValue)).ToArgb(); //Color转byte }bmpobj.UnlockBits(bmpData);}///<summary>///得到有效图形并调整为可平均分割的⼤⼩///</summary>///<param name="dgGrayValue">灰度背景分界值</param>///<param name="CharsCount">有效字符数</param>///<returns></returns>public void GetPicValidByValue(int dgGrayValue, int CharsCount){int posx1 = bmpobj.Width; int posy1 = bmpobj.Height;int posx2 = 0; int posy2 = 0;for (int i = 0; i < bmpobj.Height; i++) //找有效区{for (int j = 0; j < bmpobj.Width; j++){int pixelValue = bmpobj.GetPixel(j, i).R;if (pixelValue < dgGrayValue) //根据灰度值{if (posx1 > j) posx1 = j;if (posy1 > i) posy1 = i;if (posx2 < j) posx2 = j;if (posy2 < i) posy2 = i;};};};// 确保能整除int Span = CharsCount - (posx2 - posx1 + 1) % CharsCount; //可整除的差额数if (Span < CharsCount){int leftSpan = Span / 2; //分配到左边的空列,如span为单数,则右边⽐左边⼤1if (posx1 > leftSpan)posx1 = posx1 - leftSpan;if (posx2 + Span - leftSpan < bmpobj.Width)posx2 = posx2 + Span - leftSpan;}//复制新图Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat);}///<summary>///得到有效图形,图形为类变量///</summary>///<param name="dgGrayValue">灰度背景分界值</param>///<param name="CharsCount">有效字符数</param>///<returns></returns>public void GetPicValidByValue(int dgGrayValue){int posx1 = bmpobj.Width; int posy1 = bmpobj.Height;int posx2 = 0; int posy2 = 0;for (int i = 0; i < bmpobj.Height; i++) //找有效区{for (int j = 0; j < bmpobj.Width; j++){int pixelValue = bmpobj.GetPixel(j, i).R;if (pixelValue < dgGrayValue) //根据灰度值{if (posx1 > j) posx1 = j;if (posy1 > i) posy1 = i;if (posx2 < j) posx2 = j;if (posy2 < i) posy2 = i;};};};//复制新图Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);bmpobj = bmpobj.Clone(cloneRect, bmpobj.PixelFormat);}///<summary>///得到有效图形,图形由外⾯传⼊///</summary>///<param name="dgGrayValue">灰度背景分界值</param>///<param name="CharsCount">有效字符数</param>///<returns></returns>public Bitmap GetPicValidByValue(Bitmap singlepic, int dgGrayValue){int posx1 = singlepic.Width; int posy1 = singlepic.Height;int posx2 = 0; int posy2 = 0;for (int i = 0; i < singlepic.Height; i++) //找有效区{for (int j = 0; j < singlepic.Width; j++){int pixelValue = singlepic.GetPixel(j, i).R;if (pixelValue < dgGrayValue) //根据灰度值{if (posx1 > j) posx1 = j;if (posy1 > i) posy1 = i;if (posx2 < j) posx2 = j;if (posy2 < i) posy2 = i;};};};//复制新图Rectangle cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);return singlepic.Clone(cloneRect, singlepic.PixelFormat);}///<summary>///平均分割图⽚///</summary>///<param name="RowNum">⽔平上分割数</param>///<param name="ColNum">垂直上分割数</param>///<returns>分割好的图⽚数组</returns>public Bitmap [] GetSplitPics(int RowNum,int ColNum){if (RowNum == 0 || ColNum == 0)return null;int singW = bmpobj.Width / RowNum;int singH = bmpobj.Height / ColNum;Bitmap [] PicArray=new Bitmap[RowNum*ColNum];Rectangle cloneRect;for (int i = 0; i < ColNum; i++) //找有效区{for (int j = 0; j < RowNum; j++){cloneRect = new Rectangle(j*singW, i*singH, singW , singH);PicArray[i*RowNum+j]=bmpobj.Clone(cloneRect, bmpobj.PixelFormat);//复制⼩块图}}return PicArray;}///<summary>///返回灰度图⽚的点阵描述字串,1表⽰灰点,0表⽰背景///</summary>///<param name="singlepic">灰度图</param>///<param name="dgGrayValue">背前景灰⾊界限</param>///<returns></returns>public string GetSingleBmpCode(Bitmap singlepic, int dgGrayValue){Color piexl;string code = "";for (int posy = 0; posy < singlepic.Height; posy++)for (int posx = 0; posx < singlepic.Width; posx++){piexl = singlepic.GetPixel(posx, posy);if (piexl.R < dgGrayValue) // Color.Black )code = code + "1";elsecode = code + "0";}return code;}}}。

Java简单验证码原理(源代码+步骤操作)

Java简单验证码原理(源代码+步骤操作)

Java简单验证码原理(源代码+步骤操作)本⽂章⼀共分为五个步骤,具体操作流程如下:⼀、新建名为:CheckCodeServlet的servlet类;⼆、复制以下代码到新建的CheckCodeServlet类中,修改⾃⼰的包名:package com.seesun2012.Servlet; //这⾥是我的包名import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CheckCodeServlet extends HttpServlet {//产⽣随即的字体private Font getFont() {//创建random对象⽤来⽣成随机数Random random = new Random();//创建字体数组,⽤来装不同的字体的Font对象Font font[] = new Font[5];font[0] = new Font("Ravie", Font.PLAIN, 24);font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24);font[2] = new Font("Forte", Font.PLAIN, 24);font[3] = new Font("Wide Latin", Font.PLAIN, 24);font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24);return font[random.nextInt(5)];}protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 设置响应头 Content-type类型resp.setContentType("image/jpeg");OutputStream os = resp.getOutputStream();int width = 83, height = 30;// 建⽴指定宽、⾼和BufferedImage对象BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics(); // 该画笔画在image上Color c = g.getColor(); // 保存当前画笔的颜⾊//填充矩形g.fillRect(0, 0, width, height);// 随即产⽣的字符串不包括 i l(⼩写L) o(⼩写O) 1(数字1)0(数字0)char[] ch = "abcdefghjkmnpqrstuvwxyz2345678901".toCharArray();int length = ch.length; // 随即字符串的长度String sRand = ""; // 保存随即产⽣的字符串Random random = new Random();for (int i = 0; i < 4; i++) {// 设置字体g.setFont(getFont());// 随即⽣成0-9的数字String rand = new Character(ch[random.nextInt(length)]).toString();sRand += rand;// 设置随机颜⾊g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));g.drawString(rand, 20 * i + 6, 25);}//产⽣随即⼲扰点for (int i = 0; i < 20; i++) {int x1 = random.nextInt(width);int y1 = random.nextInt(height);g.drawOval(x1, y1, 2, 2);}// 将画笔的颜⾊再设置回去g.setColor(c);// 释放此图形的上下⽂以及它使⽤的所有系统资源。

python 验证码识别 算式

python 验证码识别 算式

python 验证码识别算式以下是一个使用`Python`和`Tesseract`库进行验证码识别的代码示例:```pythonfrom PIL import Imageimport pytesseractdef images_to_string(index):# 导入图片,抓取的时候可以直接获取 io 流img1 = Image.open(f'{index} ({str(index)}+).png')# 获取图片的长宽w, h = img1.sizeprint('Original image size: %sx%s' % (w, h))# 因为是 PNG 图片,像素不是直接以 RGB 保存的,PNG 的每个像素里还有透明度 # 我们不需要处理透明度,tesseract 对于白色和不透明的识别是一样的,这里就转成 RGB# 如果图片是 jpg 的,可以直接使用,不需要 convertimg1rbg = img1.convert('RGB')# 读取全部的像素数据src_strlist = img1rbg.load()# 获取主干颜色data = src_strlist(80, 23)print(data)# 双层循环开始替换全部的像素点颜色for x in range(0, w):for y in range(0, h):# 判断当前点颜色是否等于主干颜色co = src_strlist(x, y)if co != data:src_strlist(x, y) = (245, 245, 255)# 直接调用内存里的 PIL image 对象进行图片识别text = pytesseract.image_to_string(img1rbg)text = text.replace(" ", " ").replace("\r\n", " ").replace(" ", " ").replace("\r", " ").replace("\n", " ")# 打印结果print(text)# 保存图片img1rbg.save(text + '.png')if __name__ == '__main__':for i in range(1, 21):images_to_string(i)```上述代码首先从`index`文件夹中导入一张验证码图片并对图片进行一系列处理,最后对图片中的算式进行识别并输出结果。

Python+Request库+第三方平台实现验证码识别示例

Python+Request库+第三方平台实现验证码识别示例

Python+Request库+第三⽅平台实现验证码识别⽰例1、登录时经常的出现验证码,此次结合Python+Request+第三⽅验证码识别平台(超级鹰识别平台)3、使⽤超级鹰平台需进⾏注册,购买1元,应该有1000次积分,再⽣产对应软件ID4、超级鹰下载Python语⾔进⾏Demo⽰例,代码如下(命名为ClassCode.py):import requestsfrom hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):ername = usernamepassword = password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.base_params = {'user': ername,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图⽚字节codetype: 题⽬类型参考 /price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题⽬的图⽚ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('/Upload/ReportError.php', data=params, headers=self.headers)return r.json()5、下⾯使⽤ClassCode.py模块中的代码,对⼈⼈⽹实现验证码登录,此时⽰例分别使⽤Cookie和Session进⾏演⽰import requestsfrom .ClassCode import Chaojiying_Client (导⼊ClassCode.py 模块)from lxml import etree (需安装:pip3 install lxml)# 对验证码图⽚进⾏抓捕及识别url = '/SysHome.do'headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",}page_text = requests.get(url=url,headers=headers).texttree = etree.HTML(page_text)try:code_img_src = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]code_img_data = requests.get(url=code_img_src, headers=headers).contentwith open('./code_img_data.jpg', 'wb') as fp:fp.write(code_img_data)except Exception as msg:print('元素不存在')# 使⽤超级鹰平台实现验证码识别chaojiying = Chaojiying_Client('超级鹰登录账号', '超级鹰登录密码', '根据验证码类型')with open('code_img_data.jpg', 'rb') as fp:img = fp.read()result = chaojiying.PostPic(img, 1005)['pic_str']print(result)################################################使⽤Cookie进⾏登录################################################# 使⽤Post发送登录请求 -- 使⽤Cookie进⾏登录def login_url():login_url = '/ajaxLogin/login?1=1&uniqueTimestamp=2021212242112' data = {"email": "⼈⼈⽹登录账号","password": "⼈⼈⽹登录密码","icode": result,"origURL": "/home","domain": "","key_id": 1,"captcha_type": "web_login","f":""}response = requests.post(url=login_url,headers=headers,data=data)print(response.status_code)login_page_text = response.textwith open('renren.html','w',encoding='utf-8') as fp:fp.write(login_page_text)return response.cookiesdef Profile():pro_url = '/969120248/profile'pr_respose_text = requests.get(url=pro_url,headers=headers,cookies=login_url()).textwith open('profile.html','w',encoding='utf-8') as fp:fp.write(pr_respose_text)Profile()################################################使⽤Session进⾏登录################################################# 使⽤Post发送登录请求 -- 使⽤Session进⾏登录# 创建session对象session = requests.Session()def login_url_Se():login_url = '/ajaxLogin/login?1=1&uniqueTimestamp=2021212242112' data = {"email": "⼈⼈⽹登录账号","password": "⼈⼈⽹登录密码","icode": result,"origURL": "/home","domain": "","key_id": 1,"captcha_type": "web_login","f":""}response = session.post(url=login_url,headers=headers,data=data)print(response.status_code)login_page_text = response.textwith open('renren.html','w',encoding='utf-8') as fp:fp.write(login_page_text)return response.cookiesdef Profile_Se():pro_url = '/969120248/profile'pr_respose_text = session.get(url=pro_url,headers=headers,cookies=login_url_Se()).text with open('profile_New.html','w',encoding='utf-8') as fp:fp.write(pr_respose_text)Profile_Se()。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
continue;
}
for(int jj=0;jj<20;jj++)
{
if(datap[ii,jj]!=datapic[jj])
{
notsamenum++;
}
}
if(notsamenum<4)
{
string asdasd=((char)datachar[ii]).ToString();
return true;
}
}
return jieguo;
}
/// <summary>
/// 添加到特征库中,并暂时将对应的字符置为空格以待人工识别
/// </summary>
void adddatawithnullchar()
{
if(this.ischardatain())
jieguo1=(thebuff[0]<<8)+thebuff[1];
ushort jieguo=(ushort)jieguo1;
return jieguo;
}
/// <summary>
/// 将内存中的数据写入硬盘(保存特征库)
/// </summary>
/// <param name="thefile">保存的位置</param>
//如果能够收集更多的特征库,识别率可以达到80%以上
//(此时可能需要将特征库的容量提高到15W个或以上)
//当然也可以改进品配算法(如使用关键点品配),以用较少的特征库达到较高的识别率,但
//那样有比较大的机会造成识别错误并且多线程时占用较多CPU时间。
int notsamenum=0;
/// <summary>
/// 对应的字符
/// </summary>
public static byte[] datachar=new byte[100000];
/// <summary>
/// 等待处理的数据
/// </summary>
public ushort[] datapic=new ushort[20];
public static void getbytesfromint(int thevalue, byte[] thebuff)
{
long v1=0; long v2=0; long v3=0; long v4=0;
uint b1=(uint)4278190080; uint b2=(uint)16711680; uint b3=(uint)65280; uint b4=(uint)255;
public static void writetofile(string thefile)
{
System.IO.FileStream fs = new System.IO.FileStream(thefile,System.IO.FileMode.OpenOrCreate,System.IO.FileAccess.ReadWrite);
}
/// <summary>
/// 从文件中读取信息,并保存在内存中相应的位置
/// </summary>
/// <param name="thefile">特征库文件</param>
public static void readfromfile(string thefile)
{
int allnum=0;
//当然也可以改进品配算法(如使用关键点品配),以用较少的特征库达到较高的识别率,但
//那样有比较大的机会造成识别错误并且多线程时占用较多CPU时间。
int notsamenum=0;
if(System.Math.Abs(dataxy[ii,0]-xlpic)>1 || System.Math.Abs(dataxy[ii,1]-ylpic)>1)
for(int ii=0;ii<datanum;ii++)
{
//统计一共有多少行的像素有差异,如果在4行以内就认为是存在该记录
//这种方法比较原始,但比较适合多线程时的运行,因为程序只进行简单的逻辑比较
//如果能够收集更多的特征库,识别率可以达到80%以上
//(此时可能需要将特征库的容量提高到15W个或以上)
thebuff[3]=(byte)v4;
}
/// <summary>
/// 将一个ushort值存入到2个字节的字节数组(从高地址开始转换,最高地址的值以无符号整型参与"与运算")
/// </summary>
/// <param name="thevalue">要处理的ushort值</param>
/// <summary>
/// 有效长度
/// </summary>
public byte xlpic=0;
/// <summary>
/// 有效宽度
/// </summary>
public byte ylpic=0;
/// <summary>
/// 检索特征库中存在的记录
/// </summary>
getbytesfromushort(datap[ii,jj],buff);
fs.Write(buff,0,2);
}
fs.WriteByte(dataxy[ii,0]);
fs.WriteByte(dataxy[ii,1]);
fs.WriteByte(datachar[ii]);
}
fs.Close();
QQ验证码识别源代码(C#/NET1.1)
using System;
namespace QQ
{
/// <summary>
/// yzm 的摘要说明。
/// </summary>
public class yzm
{
public yzm(public System.Drawing.Bitmap pic)
/// <param name="thebuff">字符数组</param>
/// <returns></returns>
public static int getintfrombyte(byte[] thebuff)
{
int jieguo=0;
long mid=0;
long m1=0; long m2=0; long m3=0; long m4=0;
}
/// <summary>
/// 验证码Leabharlann 片 /// </summary>
public System.Drawing.Bitmap bp =new System.Drawing.Bitmap(49,20);
/// <summary>
/// 特征库的长度
/// </summary>
public static int datanum=0;
/// <summary>
/// 特征库数据
/// </summary>
public static ushort[,] datap=new ushort[100000,20];
/// <summary>
/// 长度与高度
/// </summary>
public static byte[,] dataxy=new byte[100000,2];
allnum=getintfrombyte(buff);
byte[] buff0=new byte[2];
for(int ii=0;ii<allnum;ii++)
{
for(int jj=0;jj<20;jj++)
{
fs.Read(buff0,0,2);
datap[ii,jj]=getushortfrombyte(buff0);
v1=(ushort)(thevalue & b1);
v2=(ushort)(thevalue & b2);
thebuff[0]=(byte)(v1>>8);
thebuff[1]=(byte)(v2);
}
/// <summary>
/// 将4个字节的字节数组转换成一个int值
/// </summary>
{
char cj=(char)datachar[ii];
return cj.ToString();
}
}
return jieguo;
}
/// <summary>
/// 检查特征库中是否已经存在相关记录
/// </summary>
bool ischardatain()
{
bool jieguo=false;
if(dataxy[ii,0]!=xlpic || dataxy[ii,1]!=ylpic)
相关文档
最新文档