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线程池的实现实例
Nov 18 Python
浅谈Python的文件类型
May 30 Python
python编写Logistic逻辑回归
Dec 30 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
Python命名空间的本质和加载顺序
Dec 17 Python
关于pytorch处理类别不平衡的问题
Dec 31 Python
python isinstance函数用法详解
Feb 13 Python
Django choices下拉列表绑定实例
Mar 13 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 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生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
详解Python中heapq模块的用法
2016/06/28 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
python操作excel的方法
2018/08/16 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
pyqt5 QProgressBar清空进度条的实例
2019/06/21 Python
python之生成多层json结构的实现
2020/02/27 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
医院护士求职自荐信格式
2013/09/21 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
代办出身证明书
2014/10/21 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
医生个人年终总结
2015/02/28 职场文书
高中运动会前导词
2015/07/20 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
一篇文章带你掌握SQLite3基本用法
2022/06/14 数据库