之前介绍过通过cookie 绕过验证码实现登录的方法。这里并不多余,会增加分析和另外一种方法实现登录。
1、思路介绍
1.1、直接看代码,内有详细注释说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# FileName : Wm_Cookie_Login.py
# Author : Adil
# DateTime : 2018/3/20 19:47
# SoftWare : PyCharm
from selenium import webdriver
import time
url = 'https://system.address'
def login():
'''先定义一个正常登录的方法,获取登录前和登录后的cookie'''
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
cookieBefore = driver.get_cookies()
# 打印登录前的cookie
print (cookieBefore)
time.sleep( 2 )
driver.find_element_by_id( "new-username" ).clear()
driver.find_element_by_id( "new-username" ).send_keys( "username" )
driver.implicitly_wait( 5 )
driver.find_element_by_id( "new-password" ).clear()
driver.find_element_by_id( "new-password" ).send_keys( "password" )
driver.find_element_by_id( 'home-right-login' ).click()
driver.implicitly_wait( 5 )
# 加一个休眠,这样得到的cookie 才是登录后的cookie,否则可能打印的还是登录前的cookie
time.sleep( 5 )
print ( "登录后!" )
cookiesAfter = driver.get_cookies()
print ( "cookiesAfter:" )
print (cookiesAfter)
# cookie 存放到了list,其中是dict
# 对比发现登录后的cookie比登录前多了4个dict。
# 如下代码分别是 1、4 、7、 8
len1 = len (cookiesAfter)
print ( "len:%d" % len1)
cookie1 = cookiesAfter[ 0 ]
cookie2 = cookiesAfter[ 3 ]
cookie3 = cookiesAfter[ - 2 ]
cookie4 = cookiesAfter[ - 1 ]
print ( "cookie1:%s" % cookie1)
print ( "cookie2:%s" % cookie2)
print ( "cookie3:%s" % cookie3)
print ( "cookie4:%s" % cookie4)
driver.quit()
# 将获取的这四个cookie作为参数,传递给,使用cookie登录的函数,如下
cookieLogin(cookie1,cookie2,cookie3,cookie4)
def cookieLogin(cookie1,cookie2,cookie3,cookie4):
print ( "+++++++++++++++++++++++++" )
print ( "cookieLogin" )
print ( "cookie2:%s" % cookie2)
print ( "cookie4:%s" % cookie4)
driver = webdriver.Chrome()
driver.maximize_window()
# 清除一下cookie
driver.delete_all_cookies()
time.sleep( 3 )
driver.get(url)
# 打开浏览器后添加访问地址后,添加cookie
driver.add_cookie(cookie1)
driver.add_cookie(cookie2)
driver.add_cookie(cookie3)
driver.add_cookie(cookie4)
print ( "cookies" )
# 打印一下cookie,与上面正常登录的cookie对比一下
print (driver.get_cookies())
time.sleep( 5 )
# 刷新页面,可以看到已经是登录状态了,至此完成的使用cookie 的登录。
driver.refresh()
time.sleep( 5 )
driver.quit()
if __name__ = = "__main__" :
login()
|
1.2、代码介绍
如图,可以查看到登录前与登录后的cookie,将其拷贝出来,进行对比
如图,对比可以,登录后多余四个cookie
查看多余cookie的位置,是list 的1、4、7、8g额元素,所以将其取出,作为参数给cookie登录函数。
注意:该实例介绍的是无验证码登录操作,但思路是一样的。而这个demo ,仅仅是为了介绍一下使用cookie 登录的思路,具体项目应用中,这样是很不方便的。
2、绕过验证码登录实战
接下来,介绍含有验证码的登录,当然cookie处理的思路与上介绍的基本一样
这里增加了几点内容:
a、先首次使用验证码正确登录并保存登录前、后的cookie,对比分析cookie,筛选有用的cookie
b、将cookie 写到yaml 文件中,方便后续使用cookie登录时直接使用,而不需像上面介绍的那样,每次都需要先正常登录一样。
c、使用cookie登录时,从yaml文件中读取对应cookie即可。注意:Yaml 文件操作详见: Python Yaml 学习 ,有详细介绍yaml的读写操作。
注意:这里介绍的是先手动输入验证码正确登录后获取cookie。实际应用中可以使用其他方式获取cookie
如:1、之前介绍的博客园登录实例:Python - Cookie绕过验证码登录 使用fiddler,查看cookie
2、使用浏览器查看cookie 如,借助chrome 插件如下图,导出cookie进行分析。
思路如上,代码如下:
2.1、正常登录获取有效cookie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
# FileName : getLoginCookie.py
# Author : Adil
# DateTime : 2018/3/20 21:43
# SoftWare : PyCharm
import yaml,time,os
from selenium import webdriver
url = 'https://system.address'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
time.sleep( 2 )
driver.find_element_by_id( "username" ).clear()
driver.find_element_by_id( "username" ).send_keys( "username" )
driver.implicitly_wait( 5 )
driver.find_element_by_id( "password" ).clear()
driver.find_element_by_id( "password" ).send_keys( "password" )
print ( "请输入验证码:" )
# 手动输入验证码
security_code = input ()
time.sleep( 1 )
driver.find_element_by_id( "security_code" ).send_keys(security_code)
time.sleep( 1 )
driver.find_element_by_id( 'sign_btn' ).click()
driver.implicitly_wait( 5 )
# 加一个休眠,这样得到的cookie 才是登录后的cookie,否则可能打印的还是登录前的cookie
time.sleep( 5 )
cookiesAfter = driver.get_cookies()
len1 = len (cookiesAfter)
# 已经知道需要第几个cookie,这里需要第3个cookie,所以选择cookie下标为2
cookie1 = cookiesAfter[ 2 ]
# 获取当前文件所在路径
fileNamePath = os.path.split(os.path.realpath(__file__))[ 0 ]
# 拼接config.yaml文件绝对路径
yamlPath = os.path.join(fileNamePath, 'config.yaml' )
# 以覆盖写入打开文件
fw = open (yamlPath, 'w' ,encoding = 'utf-8' )
# 构建数据
data = { "cookie1" :cookie1}
# 装载写入yaml文件。
yaml.dump(data,fw)
driver.quit()
|
2.2、读取cookie配置文件,使用cookie登录系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# FileName : stlUseCookieLogin.py
# Author : Adil
# DateTime : 2018/3/20 21:48
# SoftWare : PyCharm
from selenium import webdriver
import time,yaml,os
url = 'https://system.address'
driver = webdriver.Chrome()
driver.maximize_window()
driver.delete_all_cookies()
time.sleep( 3 )
driver.get(url)
fileNamePath = os.path.split(os.path.realpath(__file__))[ 0 ]
yamlPath = os.path.join(fileNamePath, 'config.yaml' )
# 读取yaml 文件
f = open (yamlPath, 'r' ,encoding = 'utf-8' )
cont = f.read()
conf = yaml.load(cont)
# 读取cookie值
cookie1 = conf.get( "cookie1" )
# 添加cookie
driver.add_cookie(cookie1)
print ( "cookies" )
print (driver.get_cookies())
time.sleep( 5 )
# 这里重新获取地址,因为有些系统,未登录状态,链接会跳转,这里就是,登录状态后,才能正确打开指定网址,所以这里要再次指定网址。
driver.get(url)
# 刷新查看登录状态
driver.refresh()
time.sleep( 5 )
driver.quit()
|
以上应该算是已经详细的介绍了使用cookie 登录的思路了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/BlueSkyyj/p/8615879.html