• Selenium3+python3自动化(二十九)--绕过验证码(add_cookie)


    前言

    验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的。

    对于验证码,要么是让开发在测试环境弄个万能的验证码,如:1234,要么就是尽量绕过去,如本篇介绍的添加cookie的方法。

    一、fiddler抓包

    1.前一篇讲到,登录后会生成一个已登录状态的cookie,那么只需要直接把这个值添加到cookies里面就可以了。

    2.可以先手动登录一次,然后抓取这个cookie,这里就需要使用抓包工具fiddler了

    3.先打开博客园登录页面,手动输入账号、密码(不要点登录按钮)

    4.打开fiddler抓包工具,此时再点击博客园登录按钮

    5.登录成功后,再查看cookie变化,发现多了两组参数,多的这两组参数就是我们想要的,copy出来,一会有用

    二、添加cookie方法:driver.add_cookie()

    1.add_cookie(cookie_dict)方法里面参数是cookie_dict,说明里面参数是字典类型。

    2.源码文档如下:

        def add_cookie(self, cookie_dict):
            """
            Adds a cookie to your current session.
    
            :Args:
             - cookie_dict: A dictionary object, with required keys - "name" and "value";
                optional keys - "path", "domain", "secure", "expiry"
    
            Usage:
                driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
                driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
                driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
    
            """
            self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
    

     3.从官方的文档里可以看出,添加cookie时候传入字典类型就可以了,等号左边的是name,等号右边的是value。

    4.把前面抓到的两组数据(参数不仅仅只有name和value),写成字典类型:

     { 'name': '.Cnblogs.AspNetCore.Cookies',  'value': 'CfDJ8K5MrGQfPjpFvR..'}

       {'name':'.CNBlogsCookie', 'value':'D91850C4CD31009089BC89E52828E790...'}

    三、cookie组成结构

    1.用抓包工具fiddler只能看到cookie的name和value两个参数,实际上cookie还有其它参数

    2.cookie参数组成,以下参数是我通过driver.get_cookie(name='.Cnblogs.AspNetCore.Cookies')获取到的

    {'domain': '.cnblogs.com', 'expiry': 1600323701, 'httpOnly': True, 'name': '.Cnblogs.AspNetCore.Cookies', 'path': '/', 'secure': False, 'value': 'CfDJ8K5MrGQfPjpFvRyctF-QEQeCtuTUT7AWh5J3mEtrjo1AxOx4pIr4p8IXoz9Qe581bUPLATX9qLPmLEz2GdL9jD2AsBwfhf3oex-mU4-vHO5CGE8RUzEK1lTwuN6GC9HKNwey4PGv2EdeAXZUlkpys4z5kcb...'}
    

     domain:服务器域名

    expiry:cookie有效终止日期

    httpOnly:防脚本攻击

    name:cookie的名称

    path:path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的cookie

    secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。

    四、添加cookie

    1.这里需要添加两个cookie,一个是.CNBlogsCookie,另一个是.Cnblogs.AspNetCore.Cookies

     备注:抓取到多个cookie,实际需要添加哪个cookie,需要自己手动验证;我尝试了只添加.Cnblogs.AspNetCore.Cookies可以成功

    2.我这里打开的网页是添加新随笔的主页:https://i.cnblogs.com/posts/edit

    3.添加cookie后,请求添加新随笔页面,没有跳转到登录页面,可见成功了。

    下面我使用python3+selenium3请求登录博客园,验证码处,停留几秒,手动操作,获取需要的cookie,并添加cookie

    五、参考代码:

    # coding:utf-8
    from selenium import webdriver
    import time
    driver=webdriver.Chrome()
    driver.get("https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2F")
    rs1=driver.get_cookies()
    print(len(rs1),rs1)
    driver.find_element_by_id("mat-input-0").send_keys("333@qq.com")
    driver.find_element_by_id("mat-input-1").send_keys("P@ssw0rd")
    driver.find_element_by_xpath("//div[@class='ng-tns-c141-2 ng-star-inserted']/button[@mat-flat-button='']").click()
    time.sleep(6)
    driver.maximize_window()
    print("登录博客园,长度:{},查看cookie:{}".format(len(driver.get_cookies()),driver.get_cookies()))
    # c1=driver.get_cookie(name='.CNBlogsCookie')
    c2=driver.get_cookie(name='.Cnblogs.AspNetCore.Cookies')
    # print("c1的值:{}".format(c1))
    print("c2的值:{}".format(c2))
    driver.delete_all_cookies()
    time.sleep(2)
    print("登录博客园后,清空cookies,查看cookie值:{}".format(driver.get_cookies()))
    time.sleep(3)
    
    driver.get("https://i.cnblogs.com/posts/edit")
    #也可以先登录一次,获取相应的cookie,然后写成如下格式
    # c1={'domain': '.cnblogs.com', 'expiry': 1600311566, 'httpOnly': True, 'name': '.CNBlogsCookie', 'path': '/', 'secure': False, 'value': '57816AE9359FC0EBB0E29CFC6DB54D1C9755DC24DFD280F53FB69E4373FEE5E100F048F349CBA6F525E3BCCC929470368F79FC580A93BE6C5F1704D94D25BB81E14D66D014673718D1525904BAC926F65276B44E'}
    # c2={'domain': '.cnblogs.com', 'expiry': 1600311566, 'httpOnly': True, 'name': '.Cnblogs.AspNetCore.Cookies', 'path': '/', 'secure': False, 'value': 'CfDJ8K5MrGQfPjpFvRyctF-QEQeI02AzdFdRMxR-3IUWETGf86Kd5SwmYUqyXkOpP6ZgviFOryIP0081_2UrxxAb8ElIgUTuB9R5cMyuifY1KoZu8Rh7ox7rHxyUdnaLJZNmQkqt04TXwSiJQann36kQ2t_MrWFytPzs7groCHrJX4qkkKcvLSvjicxSsTuQzy1qo3UpiVr5EnF4pBBcYWyPASJ-oXetn-8DbnTeuW226Fbx2qoK-jsl177eoB8GAA1FhZzBcV9BZny-yqJZkW99TH4JTMqhyuQGM1e_dx8JEMsTCAkUvPRnLpeRO3OtfP8GaEgFUQHlOo7I2l3SzEI5HOZI9v_xHZheUm8Ti48TI4Z5W2jcmxGBhBzdc74BIQM4srrosgoTm6JREqERPVZ07hMtxTxY1n1fljPSir18Tn-wfk8X66JxzW1couqtbSUwB2hJZxWJBxNqteHSd4f-dM8gmJHqXZPphiatByTB2gQSptEDpwokTcK29TRd-jGkW3LgdREkjvyyMOVfnIRJZu7hcj2cVMFLbq0vAltWdVoJSD-9vzzuWRDxq-LAYooO7A'}
    # driver.add_cookie(c1)
    driver.add_cookie(c2)
    time.sleep(3)
    #打开新随笔,不再显示登录
    driver.get("https://i.cnblogs.com/posts/edit")
    

     运行结果:

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    Python-炫酷二维码
    Dictionary 序列化与反序列化
    获取数据库所有表名与字段名
    LinQ To Object 基本用法
    使用jq操作脚本生成元素的事件
    表单验证如何让select设置为必选
    js实现复制功能兼容ios
    微信小程序使用函数防抖解决重复点击消耗性能问题
    electronr进行签名与公证
    使用electron在mac升级签名后进行升级出现“QRLUpdaterErrorDomain”的错误
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13601383.html
Copyright © 2020-2023  润新知