前言
验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的。
对于验证码,要么是让开发在测试环境弄个万能的验证码,如: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")
运行结果: