zoukankan      html  css  js  c++  java
  • 验证码破解

    验证码破解

    HTTP的响应状态码:

    1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
    2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
    3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
    4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
    5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。
    

    验证码处理:

    - 1.对携带验证码的页面数据进行抓取
    - 2.可以将页面数据中验证码进行解析,验证码图片下载到本地
    - 3.可以将验证码图片提交给三方平台进行识别,返回验证码图片上的数据值
        - 云打码平台:
            - 1.在官网中进行注册(普通用户和开发者用户)
            - 2.登录开发者用户:
                - 1.实例代码的下载(开发文档-》调用实例及最新的DLL-》PythonHTTP实例下载)
                - 2.创建一个软件:我的软件-》添加新的软件
            -3.使用示例代码中的源码文件中的代码进行修改,让其识别验证码图片中的数据值
    

    模拟登录:

    # 人人网携带验证码的模拟登录
    # 1.识别验证码
    import time
    import random
    import requests
    from lxml import etree
    from urllib import request
    from code_class import YDMHttp
    
    requests = requests.Session()
    
    
    def get_code_text(code_type, file_path):
        result = None
    
        # 普通用户名
        username = 'username'
    
        # 密码
        password = 'password'
    
        # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
        appid = 7971
    
        # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
        appkey = 'b6fef487706d29041c20e6f9da220669'
    
        # 图片文件
        filename = file_path
    
        # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
        codetype = code_type
    
        # 超时时间,秒
        timeout = 30
    
        # 检查
        if (username == 'username'):
            print('请设置好相关参数再测试')
        else:
            # 初始化
            yundama = YDMHttp(username, password, appid, appkey)
    
            # 登陆云打码
            uid = yundama.login();
            print('uid: %s' % uid)
    
            # 查询余额
            balance = yundama.balance();
            print('balance: %s' % balance)
    
            # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
            cid, result = yundama.decode(filename, codetype, timeout);
            print('cid: %s, result: %s' % (cid, result))
    
        return result
    
    
    def get_unique_timestamp():
        """
        获取人人网登录地址时间戳
        :return:
        """
        localtime = time.localtime()
        today = int(time.strftime("%w"))
        ran_num = random.randint(1000, 99999)
        unique_time_stamp = str(localtime[0]) + str(localtime[1] - 1) + str(today) + str(localtime[3]) + str(ran_num)
    
        return unique_time_stamp
    
    
    url = "http://www.renren.com/"
    headers = {
        "Connection": "close",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36"
    }
    page_text = requests.get(url=url, headers=headers).text
    
    # 解析出验证码图片的地址
    tree = etree.HTML(page_text)
    img_url = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
    print(img_url)
    page_content = requests.get(url=img_url, headers=headers).content
    with open('./img_code.jpg', 'wb') as f:
        f.write(page_content)
    
    # 使用打码平台识别验证码
    code_text = get_code_text(1006, './img_code.jpg')
    print(code_text)
    # code_text = input("请输入验证码: ")
    
    # 获取登录动态码参数rkey
    get_key_url = "http://login.renren.com/ajax/getEncryptKey"
    data_json = requests.get(url=get_key_url, headers=headers).json()
    print(data_json)  # {'isEncrypt': True, 'e': '10001', 'n': 'c98650a51a42c2522d67a37c13ae142be25821ac23074db8a8863114e22399f5', 'maxdigits': '19', 'rkey': '0452cd7fedabf16e84a21d42ee7b46d4'}
    rkey = data_json['rkey']
    
    # 模拟登录
    login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp={}".format(get_unique_timestamp())
    data = {
        "email": "email",
        "icode": code_text,
        "origURL": "http://www.renren.com/home",
        "domain": "renren.com",
        "key_id": "1",
        "captcha_type": "web_login",
        "password": "53ed186e58ff5426ded959d41ac86024c0e31a9fdd32dc762afa8bda262dc0b4",
        "rkey": rkey,
        "f": "http%3A%2F%2Fwww.renren.com%2FSysHome.do"
    }
    """
    现在遇到的问题是密码属于RSA动态加密的,解决方案可参考文档https://blog.csdn.net/livecoldsun/article/details/30067165
    """
    response = requests.post(url=login_url, headers=headers, data=data)
    print(response.json())
    
    模拟登录人人网
    
  • 相关阅读:
    PowerDesigner15在win7-64位系统下对MySQL反向工程
    像竹子一样有节操
    spring 注解
    如何实现在已有代码之后添加逻辑之java动态代理
    如何实现在已有代码之后添加逻辑之继承,组合(静态代理)实现方法
    MySql按周,按月,按日分组统计数据
    SpringBoot 获取前端传递Json的几种方法
    Spring boot 基础整理(一)
    layui常用插件(二) 时间插件
    layui常用插件(一) 轮播图
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12794719.html
Copyright © 2011-2022 走看看