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 web框架学习笔记
May 03 Python
python使用sqlite3时游标使用方法
Mar 13 Python
TensorFlow实现卷积神经网络
May 24 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
详解python中list的使用
Mar 15 Python
python反转列表的三种方式解析
Nov 08 Python
Python脚本操作Excel实现批量替换功能
Nov 20 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 Python
教你如何使用Python Tkinter库制作记事本
Jun 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
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
详解python中的index函数用法
2019/08/06 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
中药专业大学生医药工作求职信
2013/10/25 职场文书
高中军训广播稿
2014/01/14 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
道德与公民自我评价
2015/03/09 职场文书
禁毒心得体会范文
2016/01/15 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python