用Selenium抢会议室(三):识别验证码

一直想不明白,公司内网的一个会议室系统为啥需要验证码登陆?难道就为了防止员工用工具刷会议室?(滑稽笑😌)
并且既然做了验证码,居然还用的最原始的数字+字母形式,除了文字颜色,验证码图片中一点干扰信息也没有。。。
这也就给了我一个可乘之机😀
废话不多说,用十分钟搞定这个验证码吧!

验证码识别工具选取

一般而言,为了方便自动化测试,开发都会单独提供一个接口或者万能验证码。但本次是为了抢会议室,验证码只能靠自己搞定了。
识别验证码的过程其实就是图像识别,主要是ocr文字识别技术。市面上有许多免费的ocr引擎以及API,能够识别多种语言,不过一般识别率不是很高,若要追求识别率,甚至还有收费的人工打码平台。
对付公司的这种简单的验证码,用开源的ocr引擎就够用了。本次选用的是Google爸爸出品的ocr引擎----Tesseract,不仅功能强大而且使用简单,并且还是开源的。

Tesseract安装与使用

1、安装
安装过程比较简单,直接参看官方文档即可:安装tesseract方法
说明:windows下安装tesseract后需要将tesseract.exe路径加入系统path环境变量。

2、使用
tesseract的使用方式一般有两种:可以动态调用libtesseract或者直接使用tesseract.exe程序。本次为了方便偷懒,直接采用后者。使用方式如下:

#打开cmd窗口,直接使用以下命令
tesseract c:\code.png c:\result -l eng

以上命令表示用tesseract识别c盘目录下的code.png的内容,并将识别的结果输出到result.txt中,识别的语言为english。

获取验证码图片并识别

有了工具,就只差需要被识别的验证码图片了。
一开始准备直接抓取验证码的链接直接下载一份验证码图片,但后来发现不行,每次访问验证码的url都会动态生成新的验证码😓。
所有只有两种方法获取验证码图片
1.从cookie中抓取
2.直接截图
为了方(偷)便(懒),本次使用第二种截图的方式。

但采用截图获取验证码图片的话就面临一个问题,如何只截取含验证码的部分区域呢?
这个就得借助selenium的控件属性以及python的Image库了。
说明:python使用Image需要单独安装PIL

步骤:
1、使用selenium截取全屏图片
2、使用selenium定位到验证码控件,通过元素的.location属性获取该控件的绝对坐标,计算出验证码在屏幕的区域。
3、根据步骤2中的坐标,使用Image工具对步骤1中的全屏截图进行切割,最终得到只包含验证码部分的图片
4、剩下的就交给tesseract去识别了

实现代码(部分):

import os,Image
from selenium import webdriver

path = os.path.dirname(os.path.realpath(__file__))
#全屏截图
driver.get_screenshot_as_file(path + '\screenshot.png')
#获取验证码元素位置
element = driver.find_element_by_class_name('login_code_img')
left = int(element.location['x'])
top = int(element.location['y'])
right = int(element.location['x'] + element.size['width'])
bottom = int(element.location['y'] + element.size['height'])
#通过Image处理图像
im = Image.open(path + '\screenshot.png')
im = im.crop((left, top, right, bottom))
im.save(path + '\code.png')

#执行识别操作
cmd = "tesseract %s\code.png %s\code -l eng" % (path, path)
os.system(cmd)

#读取最终的结果
f = open(self.path + "\code.txt")
code = f.read().replace(" ", "").replace("\n", "")
f.close

补充说明

通过以上两步操作就以及完成验证码的识别了。不过实现比较粗糙,为了提升识别率还可以做更多,比如:

  1. 将验证码图片进行二值化处理,提升识别率
  2. 对tesseract进行识别训练,让其更加智能化。
  3. 对于识别出的结果做一些判断,比如验证码位数不对或者登陆失败,就刷新页面继续识别。多用几次异常处理提升登陆的成功率
####项目源码
解决了以上问题,剩下的就是简单的控件操作了。除了切换frame窗口以外,基本没遇到其它问题。
源码:https://github.com/liangqiangWang/MRHelper






最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 前言 经常大家在做自动化测试或者做网络爬虫的时候,都很容易遇到验证码。今天,我们就简单的说下,怎么用python来...
    浪晋阅读 1,888评论 0 6
  • Python 2.7IDE Pycharm 5.0.3 Selenium:Selenium的介绍及使用,强烈推荐@...
    mrlevo520阅读 13,064评论 16 56
  • 目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫。验证码的形式有多种,最常见的就是图片...
    猴哥爱读书阅读 19,820评论 7 15
  • 前言 相信大家利用 Python 写的爬虫应该遇到过要输入验证码的尴尬局面,又或者写了个自动填充表单的小程序,结果...
    迦度蓝洛阅读 16,581评论 2 35
  • 这是一篇关于一个可爱的小男孩的故事。如果不是他发生了车祸骤然离世,我也许不会记起他的点点滴滴,更不会为了他写...
    阿丶C阅读 260评论 0 1