亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python3+Selenium獲取session和token供

系統(tǒng) 1773 0
原文鏈接: https://www.cnblogs.com/lsdb/p/10515759.html

一、背景說(shuō)明

之前寫了一款簡(jiǎn)單的api模糊測(cè)試工具,之前系統(tǒng)可以使用http Base認(rèn)證現(xiàn)在改成session形式并加上了token。

最簡(jiǎn)單的改造方法,是自己先在瀏覽器手動(dòng)登錄,然后提取出session和token(系統(tǒng)token在整個(gè)會(huì)話期間可重復(fù)使用)填到模糊測(cè)試工具中即可。但這種非全自動(dòng)化的方式不到萬(wàn)不得已不想用。

最直接的方法,最使用requests按登錄流程依次發(fā)包登錄即可。但其中的難點(diǎn)是密碼是加密提交的,詢問(wèn)開發(fā)人員說(shuō)是DES加密;DES加密不難,但是用不同的語(yǔ)言編寫的加密算法與別人的結(jié)果完全一致那就比較費(fèi)工夫。

最后的方法,那就是使用selenium登錄避開密碼的構(gòu)造,這種方法的關(guān)鍵點(diǎn)在于:selenium是基于圖形界面操作的,沒(méi)有直接的辦法能獲取request和response的數(shù)據(jù)包,在這種情況下如何獲取session和token。

自己動(dòng)web前端的存儲(chǔ)并沒(méi)有很深入了解,一直想的是如何獲取selenium request和response的數(shù)據(jù)包從中提取session和token,直到看到這篇文章才想起前端的變量(尤其是restful中的全局變量)會(huì)放存localStorage和sessionStorage中,從中提取session和token即可。

?

二、環(huán)境搭建

2.1 下載驅(qū)動(dòng)

下載驅(qū)動(dòng)文件,放到后續(xù)python文件同級(jí)目錄下或加入到環(huán)境變量中即可。其中Chrome驅(qū)動(dòng)要注意Driver版本與瀏覽器版本對(duì)應(yīng)要求。

Firefox驅(qū)動(dòng)下載地址:https://github.com/mozilla/geckodriver/releases

Chrome驅(qū)動(dòng)下載地址:http://chromedriver.chromium.org/downloads

Safari驅(qū)動(dòng)下載地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

Edge驅(qū)動(dòng)下載地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

?

2.2 安裝selenium

            pip install selenium
          

?

三、程序?qū)崿F(xiàn)

3.1 系統(tǒng)狀況

手動(dòng)登錄系統(tǒng)后,查看存儲(chǔ)狀況如下圖所示,sessionid和token分別存儲(chǔ)在sessionStorage的sessionId和token兩個(gè)變量中

Python3+Selenium獲取session和token供Requests使用教程_第1張圖片

?

3.2 實(shí)現(xiàn)代碼

復(fù)制代碼

            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):
        # 啟用無(wú)頭模式,可選
        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)時(shí)需要自行修改
    def login_system(self):
        # 登錄用戶名密碼,改成目標(biāo)系統(tǒng)用戶名密碼
        username = "admin"
        password = "123456"
        # 登錄頁(yè)面url,改成目標(biāo)系統(tǒng)登錄頁(yè)面
        url = "https://10.10.6.93/#login"
        self.browser.get(url)
        # 顯性等待,直到用戶名控件加載出來(lái)才進(jìn)行下一步
        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)
        # 點(diǎn)擊登錄
        self.browser.find_element_by_id("btnLogin").click()
        # 強(qiáng)制等待5秒,待session和token都成功返回并存到瀏覽器中
        # restful隱性等待不太好用?self.browser.implicitly_wait(5)
        time.sleep(5)

    # 獲取sessionid
    def get_sessionid(self):
        # 是要從localStorage中獲取還是要從sessionStorage中獲取,具體看目標(biāo)系統(tǒng)存到哪個(gè)中
        # window.sessionStorage和直接寫sessionStorage是等效的
        # 一定要使用return,不然獲取到的一直是None
        # get的Item不一定就叫sessionId,得具體看目標(biāo)系統(tǒng)把sessionid存到哪個(gè)變量中
        sessionid = self.browser.execute_script('return sessionStorage.getItem("sessionId");')

        # 另外sessionid一般都直接通過(guò)返回Set-Cookies頭設(shè)置到Cookie中,所以也可以從Cookie讀取
        # 獲取瀏覽器所有Set-Cookie,返回對(duì)象是字典列表
        # cookies = self.browser.get_cookies()
        # 獲取單項(xiàng)Cookie,是不是叫sessionId取決于系統(tǒng)存成什么變量,單項(xiàng)Cookie是字典
        # cookie = self.browser.get_cookie("sessionId")
        # cookie = cookie["value"]
        # print(f"{cookies}")
        return sessionid

    # 獲取token
    def get_token(self):
        # 是要從localStorage中獲取還是要從sessionStorage中獲取,具體看目標(biāo)系統(tǒng)存到哪個(gè)中
        # window.sessionStorage和直接寫sessionStorage是等效的
        # 一定要使用return,不然獲取到的一直是None
        # get的Item不一定就叫token,得具體看目標(biāo)系統(tǒng)把token存到哪個(gè)變量中
        token = self.browser.execute_script('return sessionStorage.getItem("token");')
        # print(f"{token}")
        return token

    def __del__(self):
        # 退出程序時(shí)關(guān)閉瀏覽器
        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}")
          

復(fù)制代碼

?

3.3 實(shí)現(xiàn)效果

Python3+Selenium獲取session和token供Requests使用教程_第2張圖片

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 女人大毛片一级毛片一 | 成年女人在线视频 | 国产在线拍 | 亚洲综合日韩在线亚洲欧美专区 | av在线色 | 刺激videoschina偷拍 | 不卡在线视频 | 国产精品麻豆久久99 | 男人天堂a在线 | 欧美va亚洲va国产综合 | 欧美久色| 亚洲视频中文字幕在线 | 国内精品久久久久影院日本 | 伊人天天躁夜夜躁狠狠 | 黄片毛片在线观看 | 神马影院我不卡888 神马影院我不卡手机 | 国产亚洲视频在线观看 | 免费观看一级特黄欧美大片 | 在线视频 中文字幕 | 精品图区| 手机看片日韩国产一区二区 | 亚洲美女性生活视频 | 999成人国产精品 | 亚洲酒色1314狠狠做 | 国产成人亚洲精品91专区手机 | 一级aaaaaa毛片免费 | 日韩欧美一区二区在线 | 中文字幕日韩视频 | 日韩精品中文字幕在线 | 国内精品久久久久久西瓜色吧 | 国产午夜久久精品 | 不卡一级aaa全黄毛片 | 91福利视频网站 | 一道本不卡免费视频 | 老妇综合久久香蕉蜜桃 | 一级毛片美国一级j毛片不卡 | 九九久久久久午夜精选 | 欧美性xxxxbbbb | 一区二三区国产 | 日本a在线视频 | 奇米影视第四色首页 |