Python3使用Selenium获取session和token方法详解


Posted in Python onFebruary 16, 2021

一、背景说明

之前写了一款简单的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两个变量中

Python3使用Selenium获取session和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 实现效果

Python3使用Selenium获取session和token方法详解

更多关于Python获取session和token方法请查看下面的相关链接

Python 相关文章推荐
Python中import机制详解
Nov 14 Python
Python中flatten( )函数及函数用法详解
Nov 02 Python
Python实现多进程的四种方式
Feb 22 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
django列表筛选功能的实现代码
Mar 27 Python
通过Python实现一个简单的html页面
May 16 Python
Python生成并下载文件后端代码实例
Aug 31 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
使用Python封装excel操作指南
Jan 29 Python
requests在python中发送请求的实例讲解
Feb 17 Python
python基础之爬虫入门
May 10 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 #Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 #Python
Python3+Django get/post请求实现教程详解
Feb 16 #Python
Python3+Flask安装使用教程详解
Feb 16 #Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 #Python
Python LMDB库的使用示例
Feb 14 #Python
python 装饰器重要在哪
Feb 14 #Python
You might like
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
php5与php7的区别点总结
2019/10/11 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
基于jquery的可多选的下拉列表框
2012/07/20 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
JavaScript中的await/async的作用和用法
2016/10/31 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
python多线程http下载实现示例
2013/12/30 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
Python如何读取、写入CSV数据
2020/07/28 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
蔬菜基地的创业计划书
2014/01/06 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
简爱读书笔记
2015/06/26 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server