zoukankan      html  css  js  c++  java
  • python selenium-webdriver 登录验证码的处理(十二)

    很多系统为了防止坏人,会增加各样形式的验证码,做测试最头痛的莫过于验证码的处理,验证码的处理一般分为三种方法

    1.开发给我们设置一个万能的验证码;

    2.开发将验证码给屏蔽掉;

    3.自己识别图片的上的千奇百怪的图片,但是这样的方法识别成功率不是特别的高,而且也不是对所有的都可以识别,只是识别一些简单的验证码;

    4.可以调用其他的服务商的验证码识别的接口,我从阿里云的云市场找到一家验证码识别的接口,0.9元可以调用大概是60次(0.01元20次,我不知道自己为何傻乎乎的花了0.9元买了60次的规格);

    这里主要使用到了pytesseract和PIL两个模块,首先我们搭建一下环境

    pip install Pillow
    pip install pytesseract 
    由于Python-tesseract是一个基于google's Tesseract-OCR的独立封装包,那么我们需要下载
    Tesseract-OCR进行安装,window下安装记住需要配置环境变量

    下面我们直接看一下具体的实例

    #-*- coding:utf-8 -*-
    import time
    from selenium import webdriver
    from PIL import Image,ImageEnhance
    import pytesseract
    
    def get_auth_code(driver,codeEelement):
        '''获取验证码'''
        driver.save_screenshot('login/login.png')  #截取登录页面
        imgSize = codeEelement.size   #获取验证码图片的大小
        imgLocation = imgElement.location #获取验证码元素坐标
        rangle = (int(imgLocation['x']),int(imgLocation['y']),int(imgLocation['x'] + imgSize['width']),int(imgLocation['y']+imgSize['height']))  #计算验证码整体坐标
        login = Image.open("login/login.png")  
        frame4=login.crop(rangle)   #截取验证码图片
        frame4.save('login/authcode.png')
        authcodeImg = Image.open('login/authcode.png')
        authCodeText = pytesseract.image_to_string(authcodeImg).strip()
        return authCodeText
    
    def pandarola_login(driver,account,passwd,authCode):
        '''登录pandarola系统'''
        driver.find_element_by_id('loginname').send_keys(account)
        driver.find_element_by_id('password').send_keys(passwd)
        driver.find_element_by_id('code').send_keys(authCode)
        driver.find_element_by_id('to-recover').click()
        time.sleep(2)
        title = driver.find_element_by_id('menuName-h').text  #获取登录的标题
        '''验证是否登录成功'''
        try:
            assert title == u'桌面'
            return '登录成功'
        except AssertionError as e:
            return '登录失败'
    
    if __name__ == '__main__':
    
        driver = webdriver.Chrome()
        driver.get('http://pandarola.pandadata.cn')
        driver.maximize_window()
        imgElement = driver.find_element_by_id('codeImg')
        authCodeText = get_auth_code(driver,imgElement)
        pandarola_login(driver,'admin','1',authCodeText)
        driver.quit()

    由于我们系统属于内部系统,验证码比较简单,所以很轻松的识别了,但是有时候2和Z无法识别,只要登录失败重新获取再次登录即可。毕竟自己写的验证码识别,识别的成功的几率还时比较低,所以我这边从阿里云的云市场找到了一家公司,用他们的接口来识别,最起码公司的几个系统的验证码问题全部解决了,再也不用求开发了。

    ps:

      这里包含了接口的说明文档,大概可以自己看一下,https://market.aliyun.com/products/57126001/cmapi014396.html#sku=yuncode839600006,我这边演示下通过这个接口来识别验证码。

    #-*- coding:utf-8 -*-
    import base64
    import requests
    import json
    def read_picture_base64(fileNmae):
        '''验证码图片 base64加密格式'''
        with open(fileNmae,'rb') as f:
            base64Picture = base64.b64encode(f.read())
        return base64Picture.decode()
    
    
    def authcode_picture_convert_string(appCode,querys,base64Picture):  #appCode 接口的认证key,querys 验证码类型
        '''通过第三方结果获取验证码'''
        header = {
            'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',   #根据API的要求,定义相对应的Content-Type
            "Authorization":"APPCODE "+ appCode
        }
        url = 'http://jisuyzmsb.market.alicloudapi.com/captcha/recognize'  #调用地址
        bodys = {'type':querys,'pic':base64Picture}   #请求参数
        res = requests.post(url,headers=header,data=bodys)
        return res.text
    
    if __name__ == '__main__':
        appCode = '377e5f0fe10146ef9aa88bae756a3904'
        querys = 'e4'
        base64Picture = read_picture_base64('login/20170629232535.png')
        text = authcode_picture_convert_string(appCode,querys,base64Picture)
        authCode = json.loads(text)['result']['code']  #解析返回的结果
        print(authCode)
  • 相关阅读:
    一系列视频教程 收藏
    生成一个4位整数
    spring 实现定时任务
    判断字符串是否包含汉字
    pmd代码安全扫描工具
    IntelliJ IDEA
    李小龙传奇
    checkmarx使用笔记、原理
    pmd 使用笔记
    Mysql的安装(视频+部分视频截图)
  • 原文地址:https://www.cnblogs.com/mengyu/p/7095673.html
Copyright © 2011-2022 走看看