zoukankan      html  css  js  c++  java
  • 关于验证码的消灭方式

    1 万能验证码

    2 屏蔽验证码

    3 机器学习搞定验证码

    4 利用市面上付费的接口提取

    下面说说付费的使用_超级鹰,需要用到selenium 库webdriver;需要用到图片处理pillow中Image

    验证码自动识别分5步

    1 调用webdriver创建浏览器并打开登录页面

    2 整体截取登录页面(内含验证码部分_因为验证码点击自动刷新故采用静态截图进行识别)

    3 识别页面验证码元素所在的位置及尺寸

    4 使用第三步的位置及Image方法在完整截图上面进行图片扣取

    5 调用超级鹰的付费接口进行截图识别

    直接上代码

    from selenium import webdriver
    from PIL import Image #图片处理库
    from china_railway.captcha.chaojiying import Chaojiying_Client #导入接口模块名
    import time

    #创建谷歌浏览器
    browser = webdriver.Chrome()
    #访问指定的url
    url = " http://www.chaojiying.com/user/login/"
    browser.get(url)
    #对验证码进行输入分三步
    # 第一步 截整个登录页面操作
    browser.save_screenshot("login.png")
    # 第二步 确定这验证码的位置 (因为一点击就刷新,不能点开页面去取值)并抠图
    cap = browser.find_element_by_xpath("/html/body/div[3]/div/div[3]/div[1]/form/div/img") #页面验证码元素
    location = cap.location #确定验证码的位置
    size = cap.size #确定验证码的尺寸
    #四个点 左 上 右 下来确定(跟桌面显示比例相关,如果是125%,那么所有数据均放大1.25倍)
    left = location["x"] #前端页面四个点来定位置,左上角为初始点
    up = location["y"]
    right = left + size['width']#初始左+元素宽度
    down = up + size['height']#初始上+元素高度
    var = (left,up,right,down)
    # 第三步 在完整截图cap,根据定位来抠取验证码并调用接口进行验证码识别
    login_cap = Image.open('login.png')
    captcha = login_cap.crop(var)
    captcha.save('captcha.png')
    # 调用超级鹰的接口,提取出来数字并进行send_keys操作
    chaojiying = Chaojiying_Client('账户', '密码', '899836') #用户中心>>软件ID 生成一个替换 96001
    im = open('captcha.png', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    res = chaojiying.PostPic(im, 1902) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
    browser.find_element_by_xpath("/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input").send_keys(res['pic_str']) #输入接口读取的验证码

    browser.find_element_by_xpath("/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input").click() #点击登录按钮
    # 跳转需要时间 肉眼瞅瞅没毛病,自动化做断言
    time.sleep(5)
    browser.close()

    接口文档如下,账户需要自行官方申请充值后使用

    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__':
    chaojiying = Chaojiying_Client('用户名', '密码', '899836')#用户中心>>软件ID 生成一个替换 96001
    im = open('yzm.png', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    res = chaojiying.PostPic(im, 1902) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
    print(res['pic_str'])
  • 相关阅读:
    npm 报错 : `Error: ENOENT: no such file or directory, mkdir D:\`
    weex中根据返回图片的大小,进行等比缩放展示
    weex中怎么动态循环产生输入框?字段名根据后端返回的数据而定
    hdu 2473 Junk-Mail Filter(并查集)
    cf2A Winner(implementation)
    hdu 5185 Equation(分析+DP)
    hdu 5183 Negative and Positive (NP)(STL-集合【HASH】)
    hdu 2059 龟兔赛跑(DP)
    hdu 1978 How many ways(DP)
    hdu 2577 How to Type(DP)
  • 原文地址:https://www.cnblogs.com/digitalNatives/p/10963409.html
Copyright © 2011-2022 走看看