• web 自动化-验证码识别登录 图片验证码


      这个软件收费,这就很不好了

    1、pillow 模块安装(处理图像的库)

    默认安装:打开 cmd,输入命令:

      pip install pillow

    豆瓣格式:打开 cmd,输入命令:

      pip install -i https://pypi.douban.com/simple pillow

    2、验证码的由来

    • 验证码,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答
    • 对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂-点就是滑动验证的。 诸如此类的验证码,对我们的系统增加了安全性的保障,但是对于我们测试人员来讲,在自动化测试的过程中,无疑是一个棘手的问题。

    3、web自动化验证码解决方案

    一般在我们测试过程中,登录遇到验证码的时候,有以下种解决方案:

    • 第一种、让开发去掉验证码
    • 第二种、设置一个万能的验证码
    • 第三种、通过cookie绕过登录
    • 第四种、自动识别技术识别验证码

    4、识别验证码

    1、第三方的打码平台识别

      

      网络上的第三方打码平台众多,这里的选择 超级鹰 这个第三方的平台来给大家做演示。

      地址:http://www.chaojiying.com/

    2、下载开发文档:

      

    下载好的代码:

    import requests
    from hashlib import md5
    
    
    class Chaojiying_Client(object):
    
        def __init__(self, username, password, soft_id):
            self.username = username
            password = password.encode('utf8')
            self.password = md5(password).hexdigest()
            self.soft_id = soft_id
            self.base_params = {
                'user': self.username,
                '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: 题目类型 参考 http://www.chaojiying.com/price.html
            """
            params = {
                'codetype': codetype,
            }
            params.update(self.base_params)
            files = {'userfile': ('ccc.jpg', im)}
            r = requests.post('http://upload.chaojiying.net/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('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
            return r.json()
    
    
    if __name__ == '__main__':
        # 需要传三个参数'超级鹰用户名', '超级鹰用户名的密码', '软件id'
        cjy = Chaojiying_Client('qq1938091409', '123456', '904651')  # 用户中心>>软件ID 生成一个替换 96001
        # 打开一个文件,读取图片的内容
        im = open('a.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        print(cjy.PostPic(im, 1902))
        res = cjy.PostPic(im, 1902)  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
        print(res['pic_str'])

    3、需要注册账号,在代码执行中会用到 '超级鹰用户名', '超级鹰用户名的密码', '软件id'

      

    获取并输入图片验证码步骤顺序:

    import time
    from selenium import webdriver
    from PIL import Image       # pillow模块
    from web_项目前期.a图片验证码.chaojiying import Chaojiying_Client
    
    # 创建一个浏览器
    driver = webdriver.Chrome()
    # 访问登录页面
    url = 'http://www.chaojiying.com/user/mysoft/'
    driver.get(url)
    time.sleep(2)  # 暂停一秒钟
    
    # 选择账号、密码输入栏,输入对应的账号密码
    input_user = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')
    input_user.send_keys('qq121292679')
    input_pwd = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')
    input_pwd.send_keys('546245426')
    
    # 获取验证码的图片,并进行识别,将识别的结果,输入到验证码输入框中
    # 对当前页面进行截图
    driver.save_screenshot('login.png')
    
    # 选择验证码图片的元素
    yzm_btn = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')
    # 获取图片元素的位置
    loc = yzm_btn.location
    # 获取图片的宽高
    size = yzm_btn.size
    print(loc)
    print(size)
    
    # 获取验证码上下左右的位置,电脑的缩放比例125%(100%就不需要乘),需要乘以1.25,否则会出现定位不准确
    left = loc['x']*1.25
    top = loc['y']*1.25
    right = (loc['x'] + size['width'])*1.25
    botom = (loc['y'] + size['height'])*1.25
    val = (left, top, right, botom)         # 得到左上右下的值,顺序固定
    
    # 打开网页截图
    login_pic = Image.open('login.png')
    # 通过左上右下的值,去截取验证码
    yzm_pic = login_pic.crop(val)
    # 保存验证码
    yzm_pic.save('yzm.png')
    
    # 识别验证码
    cjy = Chaojiying_Client('qq121292679', '546245426', '96001')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('yzm.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    res = cjy.PostPic(im, 1902)  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    data = res['pic_str']
    print(data)
    
    # 在输入框输入验证码
    yzm_input = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input')
    yzm_input.send_keys(data)
    
    
    # 点击登录
    submit = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input')
    submit.click()
    
    # 登录之后等待5秒 关闭浏览器
    time.sleep(5)
    driver.close()

    *******请大家尊重原创,如要转载,请注明出处:转载自:https://www.cnblogs.com/shouhu/,谢谢!!******* 

  • 相关阅读:
    求阴影部分的面积
    论语(原文注音, 注释, 译文, 评析) 打印版
    生肖故事
    北京大学2019年高等代数考研试题
    LaTeX技巧561:LaTeX如何让每一章带有目录?
    用 Mathematica 获取图片的 RGB 三基色
    tex 进度条
    跟锦数学190314
    Beamer 目录分栏
    Beamer 跳到另外一页
  • 原文地址:https://www.cnblogs.com/shouhu/p/12764788.html
Copyright © 2020-2023  润新知