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 深入理解yield
Sep 06 Python
java直接调用python脚本的例子
Feb 16 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
Python 错误和异常代码详解
Jan 29 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
python设置值及NaN值处理方法
Jul 03 Python
Python实现插入排序和选择排序的方法
May 12 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
smarty实现多级分类的方法
2014/12/05 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
js资料toString 方法
2007/03/13 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
Vue 组件注册全解析
2020/12/17 Vue.js
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
Python 如何优雅的将数字转化为时间格式的方法
2019/09/26 Python
python中自带的三个装饰器的实现
2019/11/08 Python
Django继承自带user表并重写的例子
2019/11/18 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
报关专员求职信范文
2014/02/22 职场文书
会计岗位职责模板
2014/03/12 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
长城导游词300字
2015/01/30 职场文书
民事诉讼代理词
2015/05/25 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
导游词之千岛湖
2019/09/23 职场文书
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
Elasticsearch 批量操作
2022/04/19 Python