一、背景說明
之前寫了一款簡單的api模糊測試工具,之前系統(tǒng)可以使用http Base認證現(xiàn)在改成session形式并加上了token。
最簡單的改造方法,是自己先在瀏覽器手動登錄,然后提取出session和token(系統(tǒng)token在整個會話期間可重復使用)填到模糊測試工具中即可。但這種非全自動化的方式不到萬不得已不想用。
最直接的方法,最使用requests按登錄流程依次發(fā)包登錄即可。但其中的難點是密碼是加密提交的,詢問開發(fā)人員說是DES加密;DES加密不難,但是用不同的語言編寫的加密算法與別人的結果完全一致那就比較費工夫。
最后的方法,那就是使用selenium登錄避開密碼的構造,這種方法的關鍵點在于:selenium是基于圖形界面操作的,沒有直接的辦法能獲取request和response的數(shù)據(jù)包,在這種情況下如何獲取session和token。
自己動web前端的存儲并沒有很深入了解,一直想的是如何獲取selenium request和response的數(shù)據(jù)包從中提取session和token,直到看到這篇文章才想起前端的變量(尤其是restful中的全局變量)會放存localStorage和sessionStorage中,從中提取session和token即可。
二、環(huán)境搭建
2.1 下載驅動
下載驅動文件,放到后續(xù)python文件同級目錄下或加入到環(huán)境變量中即可。其中Chrome驅動要注意Driver版本與瀏覽器版本對應要求。
Firefox驅動下載地址:https://github.com/mozilla/geckodriver/releases
Chrome驅動下載地址:http://chromedriver.chromium.org/downloads
Safari驅動下載地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
Edge驅動下載地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
2.2 安裝selenium
三、程序實現(xiàn)
3.1 系統(tǒng)狀況
手動登錄系統(tǒng)后,查看存儲狀況如下圖所示,sessionid和token分別存儲在sessionStorage的sessionId和token兩個變量中
![](/d/20211017/ec2e73faaac16a6dfb415a152a45d3b1.gif)
3.2 實現(xiàn)代碼
import json
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
class GetSessionAndToken():
def __init__(self):
# 啟用無頭模式,可選
browser_options = webdriver.FirefoxOptions()
browser_options.add_argument('--headless')
browser_options.add_argument('--disable-gpu')
self.browser = webdriver.Firefox(firefox_options=browser_options)
# self.browser = webdriver.Chrome()
# 登錄系統(tǒng),具體到自己系統(tǒng)時需要自行修改
def login_system(self):
# 登錄用戶名密碼,改成目標系統(tǒng)用戶名密碼
username = "admin"
password = "123456"
# 登錄頁面url,改成目標系統(tǒng)登錄頁面
url = "https://10.10.6.93/#login"
self.browser.get(url)
# 顯性等待,直到用戶名控件加載出來才進行下一步
WebDriverWait(self.browser,20,0.5).until(EC.presence_of_element_located((By.ID,"txtUserName")))
# 填寫用戶名
self.browser.find_element_by_id("txtUserName").send_keys(username)
# 填寫密碼
self.browser.find_element_by_id("txtPassword").send_keys(password)
# 點擊登錄
self.browser.find_element_by_id("btnLogin").click()
# 強制等待5秒,待session和token都成功返回并存到瀏覽器中
# restful隱性等待不太好用?self.browser.implicitly_wait(5)
time.sleep(5)
# 獲取sessionid
def get_sessionid(self):
# 是要從localStorage中獲取還是要從sessionStorage中獲取,具體看目標系統(tǒng)存到哪個中
# window.sessionStorage和直接寫sessionStorage是等效的
# 一定要使用return,不然獲取到的一直是None
# get的Item不一定就叫sessionId,得具體看目標系統(tǒng)把sessionid存到哪個變量中
sessionid = self.browser.execute_script('return sessionStorage.getItem("sessionId");')
# 另外sessionid一般都直接通過返回Set-Cookies頭設置到Cookie中,所以也可以從Cookie讀取
# 獲取瀏覽器所有Set-Cookie,返回對象是字典列表
# cookies = self.browser.get_cookies()
# 獲取單項Cookie,是不是叫sessionId取決于系統(tǒng)存成什么變量,單項Cookie是字典
# cookie = self.browser.get_cookie("sessionId")
# cookie = cookie["value"]
# print(f"{cookies}")
return sessionid
# 獲取token
def get_token(self):
# 是要從localStorage中獲取還是要從sessionStorage中獲取,具體看目標系統(tǒng)存到哪個中
# window.sessionStorage和直接寫sessionStorage是等效的
# 一定要使用return,不然獲取到的一直是None
# get的Item不一定就叫token,得具體看目標系統(tǒng)把token存到哪個變量中
token = self.browser.execute_script('return sessionStorage.getItem("token");')
# print(f"{token}")
return token
def __del__(self):
# 退出程序時關閉瀏覽器
self.browser.close()
if __name__ == "__main__":
obj = GetSessionAndToken()
obj.login_system()
sessionid = obj.get_sessionid()
token = obj.get_token()
print(f"sessionid為: {sessionid}\n"
f"token為: {token}")
3.3 實現(xiàn)效果
![](/d/20211017/1f0e09a53fa7f869b58ef915a3a2bdce.gif)
更多關于Python獲取session和token方法請查看下面的相關鏈接
您可能感興趣的文章:- python中requests模擬登錄的三種方式(攜帶cookie/session進行請求網(wǎng)站)
- Python處理session的方法整理
- python使用requests.session模擬登錄
- python3+requests接口自動化session操作方法
- Python爬蟲番外篇之Cookie和Session詳解
- python中requests庫session對象的妙用詳解
- 剖析Python的Tornado框架中session支持的實現(xiàn)代碼
- 在Python的Django框架的視圖中使用Session的方法
- Python ORM框架SQLAlchemy學習筆記之映射類使用實例和Session會話介紹