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中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
python解决网站的反爬虫策略总结
Oct 26 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
python实现二分查找算法
Sep 21 Python
python监控文件并且发送告警邮件
Jun 21 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
python自动识别文本编码格式代码
Dec 26 Python
python 通过文件夹导入包的操作
Jun 01 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
Apr 21 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服务器
2006/10/09 PHP
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
php生成圆角图片的方法
2015/04/07 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
JS原型链怎么理解
2016/06/27 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
python2.7到3.x迁移指南
2018/02/01 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
Python sql注入 过滤字符串的非法字符实例
2020/04/03 Python
基于python实现复制文件并重命名
2020/09/16 Python
python中pow函数用法及功能说明
2020/12/04 Python
教你怎样写好自我评价
2013/10/05 职场文书
应届生财务管理求职信
2013/11/06 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
葬礼司仪主持词
2014/03/31 职场文书
家具商场的活动方案
2014/08/16 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
教师节简报
2015/07/20 职场文书
python开发人人对战的五子棋小游戏
2022/05/02 Python