python入门教程之识别验证码


Posted in Python onMarch 04, 2017

前言

验证码?我也能破解?

关于验证码的介绍就不多说了,各种各样的验证码在人们生活中时不时就会冒出来,身为学生日常接触最多的就是教务处系统的验证码了,比如如下的验证码:

python入门教程之识别验证码

识别办法

模拟登陆有着复杂的步骤,在这里咱们不管其他操作,只负责根据输入的一张验证码图片返回一个答案字符串。

我们知道验证码为了制作干扰,会把图片弄成五颜六色的样子,而我们首先就是要去除这些干扰,这一步就需要不断试验了,增强图片色彩,加大对比度等等都可以产生帮助。

python入门教程之识别验证码

python入门教程之识别验证码

在经过各种对图片的操作之后,终于找到了比较完美的去除干扰方案。可以看到在去除干扰之后,最优情况下,我们将得到一张十分纯净的黑白字符图片。一张图片上有四个字符,没办法一下子就把四个字符全部识别,需要把图片进行裁剪,裁剪成每张小图只有一个字符的样子,再对每张图片分别进行识别。

python入门教程之识别验证码

python入门教程之识别验证码

python入门教程之识别验证码

python入门教程之识别验证码

接下来就是识别文字了,我们首先把得到的小图转换成01表示的矩阵,每个矩阵代表一个字符。

比如数字六的矩阵

num_6=[
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1,1,0,0,0,0,0,0,
0,0,0,0,1,1,1,0,0,0,0,0,0,
0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,0,0,0,0,0,
0,1,1,1,1,1,1,1,1,0,0,0,0,
0,1,1,0,0,0,0,1,1,1,0,0,0,
0,1,1,0,0,0,0,0,1,1,0,0,0,
0,1,1,0,0,0,0,0,1,1,0,0,0,
0,1,1,1,0,0,0,1,1,1,0,0,0,
0,0,1,1,1,1,1,1,1,0,0,0,0,
0,0,0,1,1,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
]

远远望过去,眯着眼睛还是能分辨出来的。

因为验证码十分规整,每个数字所在的位置都是固定的,所以并不需要涉及什么机器学习的算法,只是简单的进行一下矩阵的比对就可以了,在所有的实现做好的矩阵中找到相似度最高的矩阵就可以了,在这里的比对方法多种多样,反正数据简单能正确识别出来就好。

至此,咱们的验证码识别工作就结束了。

这次进行的验证码识别主要采用python的PIL进行图片操作,模拟登陆自动填写验证码的全部代码请看这里:

示例代码

# -*- coding: utf-8 -*
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
import re
import requests
import io
import os
import json
from PIL import Image
from PIL import ImageEnhance
from bs4 import BeautifulSoup

import mdata

class Student:
 def __init__(self, user,password):
  self.user = str(user)
  self.password = str(password)
  self.s = requests.Session()

 def login(self):
  url = "http://202.118.31.197/ACTIONLOGON.APPPROCESS?mode=4"
  res = self.s.get(url).text
  imageUrl = 'http://202.118.31.197/'+re.findall('<img src="(.+?)" width="55"',res)[0]
  im = Image.open(io.BytesIO(self.s.get(imageUrl).content))
  enhancer = ImageEnhance.Contrast(im)
  im = enhancer.enhance(7)
  x,y = im.size
  for i in range(y):
   for j in range(x):
    if (im.getpixel((j,i))!=(0,0,0)):
     im.putpixel((j,i),(255,255,255))
  num = [6,19,32,45]
  verifyCode = ""
  for i in range(4):
   a = im.crop((num[i],0,num[i]+13,20))
   l=[]
   x,y = a.size
   for i in range(y):
    for j in range(x):
     if (a.getpixel((j,i))==(0,0,0)):
      l.append(1)
     else:
      l.append(0)
   his=0
   chrr="";
   for i in mdata.data:
    r=0;
    for j in range(260):
     if(l[j]==mdata.data[i][j]):
      r+=1
    if(r>his):
     his=r
     chrr=i
   verifyCode+=chrr
   # print "辅助输入验证码完毕:",verifyCode
  data= {
  'WebUserNO':str(self.user),
  'Password':str(self.password),
  'Agnomen':verifyCode,
  }
  url = "http://202.118.31.197/ACTIONLOGON.APPPROCESS?mode=4"
  t = self.s.post(url,data=data).text
  if re.findall("images/Logout2",t)==[]:
   l = '[0,"'+re.findall('alert((.+?));',t)[1][1][2:-2]+'"]'+" "+self.user+" "+self.password+"\n"
   # print l
   # return '[0,"'+re.findall('alert((.+?));',t)[1][1][2:-2]+'"]'
   return [False,l]
  else:
   l = '登录成功 '+re.findall('! (.+?) ',t)[0]+" "+self.user+" "+self.password+"\n"
   # print l
   return [True,l]

 def getInfo(self):
  imageUrl = 'http://202.118.31.197/ACTIONDSPUSERPHOTO.APPPROCESS'
  data = self.s.get('http://202.118.31.197/ACTIONQUERYBASESTUDENTINFO.APPPROCESS?mode=3').text #学籍信息
  data = BeautifulSoup(data,"lxml")
  q = data.find_all("table",attrs={'align':"left"})
  a = []
  for i in q[0]:
   if type(i)==type(q[0]) :
    for j in i :
     if type(j) ==type(i):
      a.append(j.text)
  for i in q[1]:
   if type(i)==type(q[1]) :
    for j in i :
     if type(j) ==type(i):
      a.append(j.text)
  data = {}
  for i in range(1,len(a),2):
   data[a[i-1]]=a[i]
  # data['照片'] = io.BytesIO(self.s.get(imageUrl).content)
  return json.dumps(data)

 def getPic(self):
  imageUrl = 'http://202.118.31.197/ACTIONDSPUSERPHOTO.APPPROCESS'
  pic = Image.open(io.BytesIO(self.s.get(imageUrl).content))
  return pic

 def getScore(self):
   score = self.s.get('http://202.118.31.197/ACTIONQUERYSTUDENTSCORE.APPPROCESS').text #成绩单
   score = BeautifulSoup(score, "lxml")
   q = score.find_all(attrs={'height':"36"})[0]
   point = q.text
   print point[point.find('平均学分绩点'):]
   table = score.html.body.table
   people = table.find_all(attrs={'height' : '36'})[0].string
   r = table.find_all('table',attrs={'align' : 'left'})[0].find_all('tr')
   subject = []
   lesson = []
   for i in r[0]:
    if type(r[0])==type(i):
     subject.append(i.string)
   for i in r:
    k=0
    temp = {}
    for j in i:
     if type(r[0])==type(j):
      temp[subject[k]] = j.string
      k+=1
    lesson.append(temp)
   lesson.pop()
   lesson.pop(0)
   return json.dumps(lesson)

 def logoff(self):
  return self.s.get('http://202.118.31.197/ACTIONLOGOUT.APPPROCESS').text

if __name__ == "__main__":
 a = Student(20150000,20150000)
 r = a.login()
 print r[1]
 if r[0]:
  r = json.loads(a.getScore())
  for i in r:
   for j in i:
    print i[j],
   print
  q = json.loads(a.getInfo())
  for i in q:
   print i,q[i]
  a.getPic().show()
 a.logoff()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python 时间操作例子和时间格式化参数小结
Apr 24 Python
用Python的pandas框架操作Excel文件中的数据教程
Mar 31 Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 Python
python list是否包含另一个list所有元素的实例
May 04 Python
cmd运行python文件时对结果进行保存的方法
May 16 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python socket服务常用操作代码实例
Jun 22 Python
python 链接和操作 memcache方法
Mar 04 #Python
快速实现基于Python的微信聊天机器人示例代码
Mar 03 #Python
Python实现在线音乐播放器
Mar 03 #Python
python开发简易版在线音乐播放器
Mar 03 #Python
详解python中requirements.txt的一切
Mar 03 #Python
python中异常捕获方法详解
Mar 03 #Python
python利用不到一百行代码实现一个小siri
Mar 02 #Python
You might like
php 求质素(素数) 的实现代码
2011/04/12 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
php支付宝APP支付功能
2020/07/29 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
JavaScript 获取滚动条位置并将页面滑动到锚点
2021/02/08 Javascript
Python中的自省(反射)详解
2015/06/02 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
python 默认参数问题的陷阱
2016/02/29 Python
Python探索之pLSA实现代码
2017/10/25 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
草莓网英国官网:Strawberrynet UK
2017/02/12 全球购物
汽修专业学生自我鉴定
2013/11/16 职场文书
毕业生个人投资创业计划书
2014/01/04 职场文书
安全责任书怎么写
2014/07/28 职场文书
青年志愿者活动感想
2015/08/07 职场文书
网络研修心得体会
2016/01/08 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis