Python+Chrome自动识别验证码

Python+Chrome自动识别验证码

验证码故名思意,一般用在登陆或确认等需要验证操作人身份的环节,用来区分真人操作和自动操作、防止误操作等,其本意是好的,但在许多自动化场景中验证码就成了阻碍效率提升的拦路虎。

识别验证码的方式很多,其背后的影像识别算法后续有机会我们再去深究,目前早有前者帮我们做好了验证码识别接口,我们只需要按照开发样例调用识别接口即可。

使用现成得轮子减少工作量

阿里云提供了几个服务商的验证码识别接口,简单验证码的识别近乎于免费,我们来用其中的一个试试使用效果。

阿里云的API已经提供了代码示例,按理说我们经过简单的调试即可使用。

API传入验证码图片或Base64后的编码、验证码类型后返回json格式的识别结果,验证码类型好办,验证码图片对于爬虫也不困难,准备好验证码直接调试即可,这里用python做示例。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import urllib, urllib2, sys
import ssl
host = 'https://jisuyzmsb.market.alicloudapi.com'
path = '/captcha/type'
method = 'POST'
appcode = '你自己的AppCode'
querys = ''
bodys = {}
url = host + path
request = urllib2.Request(url) #Python2
request.add_header('Authorization', 'APPCODE ' + appcode)
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
response = urllib2.urlopen(request, context=ctx)
content = response.read()
if (content):
    print(content)

使用事前申请好的鉴权代码和示例代码一次性就可以识别成功,接口返回了识别状态和验证码。

但如果是用selenium和Chrome模拟浏览器功能去自动化运行程序的话,获取验证码图片是个难题,Chrome并不支持直接获取验证码的图片,selenium因为是浏览器层面的模拟也无法将验证码另存为图片,那么只好去截图和裁剪了,好在全页面截图和获取坐标点不困难。


1
2
3
4
5
6
7
8
9
10
from selenium import webdriver
import selenium
element = BotSession.find_element_by_xpath('//*[@id="identify"]')
left = int(element.location['x']*1.5)#根据缩放确定倍数
top = int(element.location['y']*1.5)#要留意win10得自动缩放和DPI调整
right = int(element.location['x']*1.5 + element.size['width']*1.5)
bottom = int(element.location['y']*1.5 + element.size['height']*1.5)
from PIL import Image#需要pip install PIL
im = Image.open(DataFolds + '/test.png')
im = im.crop((left, top, right, bottom))

截图和裁剪之后就可以直接转换调用api识别了,完整的代码如下


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def CodeDetect(Filepath) :
    import base64
    with open(Filepath,"rb") as f:
        # b64encode编码
        base64_data = base64.b64encode(f.read())
    import urllib, sys
    import ssl
    from urllib import request
    host = 'https://jisuyzmsb.market.alicloudapi.com'
    path = '/captcha/recognize'
    method = 'POST'
    appcode = 'Code'
    querys = 'type=en4'
    bodys = {}
    url = host + path + '?' + querys
    bodys['pic'] = base64_data
    post_data = urllib.parse.urlencode(bodys).encode("utf-8")
    request = urllib.request.Request(url, post_data)
    request.add_header('Authorization', 'APPCODE ' + appcode)
    request.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    response = urllib.request.urlopen(request, context=ctx)
    content = response.read()
    if (content):
        return(content)

好了,这样就可以每天自动从各类报表系统内拉取数据,调用计划任务刷新SQL数据库生成报表发送到邮箱了。上班打开电脑冲杯咖啡的功夫,上午的日报就做好了,欧耶!

本文遵守署名-非营利性使用-相同方式共享协议,转载请保留本段:冰丝带雨 » Python+Chrome自动识别验证码

赞 (0)