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!!!
原文地址:https://www.cnblogs.com/canglongdao/p/13601383.html