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 30 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
Python匹配中文的正则表达式
May 11 Python
python调用java的jar包方法
Dec 15 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
详解python读取和输出到txt
Mar 29 Python
Python实现TCP通信的示例代码
Sep 09 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
openstack中的rpc远程调用的方法
Jul 09 Python
Python图片验证码降噪和8邻域降噪
Aug 30 Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 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使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
php上传图片类及用法示例
2016/05/11 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
js停止输出代码
2008/07/20 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
数据库测试通常都包括哪些方面
2015/11/30 面试题
专科毕业生求职简历的自我评价
2013/10/12 职场文书
售后服务科岗位职责范文
2013/11/13 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
西游降魔篇观后感
2015/06/15 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
nginx location优先级的深入讲解
2021/03/31 Servers
python字典进行运算原理及实例分享
2021/08/02 Python
教你部署vue项目到docker
2022/04/05 Vue.js
进行数据处理的6个 Python 代码块分享
2022/04/06 Python