Python3+Selenium获取session和token供Requests使用教程

一、背景说明

之前写了一款简单的api模糊测试工具,之前系统可以使用http Base认证现在改成session形式并加上了token。

最简单的改造方法,是自己先在浏览器手动登录,然后提取出session和token(系统token在整个会话期间可重复使用)填到模糊测试工具中即可。但这种非全自动化的方式不到万不得已不想用。

最直接的方法,最使用requests按登录流程依次发包登录即可。但其中的难点是密码是加密提交的,询问开发人员说是DES加密;DES加密不难,但是用不同的语言编写的加密算法与别人的结果完全一致那就比较费工夫。

最后的方法,那就是使用selenium登录避开密码的构造,这种方法的关键点在于:selenium是基于图形界面操作的,没有直接的办法能获取request和response的数据包,在这种情况下如何获取session和token。

自己动web前端的存储并没有很深入了解,一直想的是如何获取selenium request和response的数据包从中提取session和token,直到看到这篇文章才想起前端的变量(尤其是restful中的全局变量)会放存localStorage和sessionStorage中,从中提取session和token即可。

二、环境搭建

2.1 下载驱动

下载驱动文件,放到后续python文件同级目录下或加入到环境变量中即可。其中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

pip install selenium

三、程序实现

3.1 系统状况

手动登录系统后,查看存储状况如下图所示,sessionid和token分别存储在sessionStorage的sessionId和token两个变量中

3.2 实现代码

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()

    # 登录系统,具体到自己系统时需要自行修改
    def login_system(self):
        # 登录用户名密码,改成目标系统用户名密码
        username = "admin"
        password = "123456"
        # 登录页面url,改成目标系统登录页面
        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中获取,具体看目标系统存到哪个中
        # window.sessionStorage和直接写sessionStorage是等效的
        # 一定要使用return,不然获取到的一直是None
        # get的Item不一定就叫sessionId,得具体看目标系统把sessionid存到哪个变量中
        sessionid = self.browser.execute_script(‘return sessionStorage.getItem("sessionId");‘)

        # 另外sessionid一般都直接通过返回Set-Cookies头设置到Cookie中,所以也可以从Cookie读取
        # 获取浏览器所有Set-Cookie,返回对象是字典列表
        # cookies = self.browser.get_cookies()
        # 获取单项Cookie,是不是叫sessionId取决于系统存成什么变量,单项Cookie是字典
        # cookie = self.browser.get_cookie("sessionId")
        # cookie = cookie["value"]
        # print(f"{cookies}")
        return sessionid

    # 获取token
    def get_token(self):
        # 是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中
        # window.sessionStorage和直接写sessionStorage是等效的
        # 一定要使用return,不然获取到的一直是None
        # get的Item不一定就叫token,得具体看目标系统把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 实现效果

参考:

https://pypi.org/project/selenium/

http://www.runoob.com/jsref/prop-win-localstorage.html

https://blog.csdn.net/sinat_34209942/article/details/81235925

https://stackoverflow.com/questions/44102520/python-selenium-local-storage-returns-none

原文地址:https://www.cnblogs.com/adolfmc/p/12639203.html

时间: 2024-10-08 03:25:38

Python3+Selenium获取session和token供Requests使用教程的相关文章

Jmeter 获取、读取token 供其他 HTTP 请求调用

创建一个简单的Jmeter 测试 1. 添加 配置元件\HTTP请求默认值:存放 http 协议.IP.端口 2. 添加 配置元件\HTTP Cookie 管理器:存放 JSESSIONID,供多个 HTTP 请求使用,防止出现后一个请求使用 token 登录时,出现 "登录超时" 3. 添加 配置元件\用户定义的变量:存放用户自定义变量 原文地址:https://www.cnblogs.com/bruce-he/p/10190310.html

用selenium获取cookies

前言:由于登录反爬措施的越来越麻烦,甚至出现了12306这种看图识物的无敌验证码,我只能说,我选择死亡.这就衍生出了使用selenium来获取获取cookies. 实例:获取qq空间cookies,亲测成功2018-3-7   from selenium import webdriver import requests import json import time 1 def get_cookies(): 2 browser = webdriver.Chrome(executable_path

SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强

本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候,这个Session请求在数据库中执行的过程中会申请其所需要的资源,比如可能会申请内存资源,表上的锁资源,物理IO资源,网络资源等等,如果当前Session运行过程中需要申请的某些资源无法立即得到满足,就会产生等待.SQL Server会以不用的方式来展现这个等待信息,比活动Session的等待信息,

IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息:比如用户信息.聊天历史记录.好友列表等等,长连接则是用于实时的聊天消息或指令的接收和发送. 作为IM系统中不可或缺的技术,Http短连的重要性无可替代,但Http作为传统互联网信

JS 设置/获取session

设置: 1 .       $.session.set('token', result.accessToken)      这个要引用库jquerySession.js 2.        sessionStorage.setItem("token", result.accessToken); 3.        localStorage.setItem("token", result.accessToken); 获取: 1.           ourtoken

session cookie token

参考链接 https://blog.csdn.net/qq_38560742/article/details/82717167 这篇较长 token_sessioncookie_1 https://cloud.tencent.com/developer/news/247610 比喻理解看token_sessioncookie_1 sessioncookie_1 https://www.cnblogs.com/shiyangxt/articles/1305506.html Http 协议是一个无状

权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token

1. 认证 (Authentication) 和授权 (Authorization)的区别是什么? 这是一个绝大多数人都会混淆的问题.首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么. 说简单点就是: 认证 (Authentication): 你是谁. 授权 (Authorization): 你有权限干什么. 稍微正式点(啰嗦点)的说法就是: Authentication(认证) 是验证您的身份的凭据(例如用户名/用

傻傻分不清之 Cookie、Session、Token、JWT

傻傻分不清之 Cookie.Session.Token.JWT 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时,就打卡成功) 互联网中的认证: 用户名密码登录 邮箱发送登录链接 手机号接收验证码 只要你能收到邮箱/验证码,就默认你是账号的主人 什么是授权(Authorization) 用户授予第三方应用访问该用户某些资源的权限 你在安装手机应用的时候,APP 会询问是

【Struts2】Struts2获取session的三种方式

1.Map<String,Object> map =  ActionContext.getContext().getSession(); 2.HttpSession session = ServletActionContext.getRequest().getSession(); 3.让Action实现SessionAware接口,并实现public void setSession(Map<String, Object> session) {} 方法,Struts2会在实例化Act