【Python模拟websocket登陆-拆包封包】
Python模拟websocket登陆-拆包封包
- 解析一个网站
- 获取wss原始数据
- 拆包wss数据
- 封包wss数据
- 发送接收websocket的常驻后台脚本
- 总结
解析一个网站
这里所用的网站是我一个内测的网站,主要手段是chrome devtools,用得很多,但我玩的不深,这次上了点干货.
- 首先在网络那一块,找到js或者index.html,右键点击,选择替换内容,在需要分析的地方写上自己的代码。
- 对于ajax加载的js模块,把js在加载地址,换成离线下载到本地的地址,存入本地的服务,原来是http的,还还用http。原来https的必须也在https,本地web开启跨域允许。然后ajax加载部分js也就替换成可定制的了。
- 虽然代码很难读,但是在适合的地方,可以随便写cosole.log.
- 对于js的调试和中断不太懂,还没用,
- 界面的记录器标签,可以记录一组点击,然后能看到json代码,用于回放。
- 记录的动作可以用js实现插入在任何位置,只要调试通过就行。
获取wss原始数据
获取数据的两种方式,各种优缺点:
- 在上一章中,可以看到websocket建立和sendBytes,onMessage之类的函数,在这里启动cosole.log就能得到逐条纪录。不论ws还是wss。这里可以看到语义,并可定制测试代码。
- 在devtools网络标签下的wss://server:port/url地址,对应的respone可以取得全部的来往数据,和代码块所收发的字节按道理是完全一致的,可以做为一个验证和参考。
拆包wss数据
所谓的拆包是理解数据的意义,我还没有修炼到靠数据读含义的深度,只能靠代码,也就js,顺眼化处理的代码,比如以下的登陆数据代码,从1万行里拽出来的。
- 消息头4表字节
u.prototype.addHeader = function(e, t, n, a) {return void 0 === n && (n = 0),void 0 === a && (a = 0),e | t << 4 | n << 12 | a << 23
4个参数在长度 e->4bit, t ->,8bit,n->11bit a->9bit.
含义e=command ,t=action, n=length,a=ext
- 登陆消息的主体
var a = new z.SyncLogonDto;a.account = e.account,a.sn = e.sn,a.token = e.token,a.uid = e.userID,a.localHost = 0,4 == a.sn.length && 0 < a.uid && "" != a.token ? this.sendMsg(a.getBody(), z.ServiceType.HALL_CMD, z.ServiceType.HALL_LOGIN_ACT, 2 = o.prototype.getBody = function() {var e = new t.BGByteArray;return e.writeUnsignedInt(this.major),e.writeUnsignedInt(this.minor),e.writeUTFBytes(this.sn),e.writeUnsignedInt(this.localHost),e.writeLongUint(this.uid),var a = new z.SyncLogonDto;a.account = e.account,a.sn = e.sn,a.token = e.token,a.uid = e.userID,a.localHost = 0,4 == a.sn.length && 0 < a.uid && "" != a.token ? this.sendMsg(a.getBody(), z.ServiceType.HALL_CMD, z.ServiceType.HALL_LOGIN_ACT, 2 = o.prototype.getBody = function() {var e = new t.BGByteArray;return e.writeUnsignedInt(this.major),e.writeUnsignedInt(this.minor),e.writeUTFBytes(this.sn),e.writeUnsignedInt(this.localHost),e.writeLongUint(this.uid),e.writeFixedLenthString(this.account, 32),e.writeFixedLenthString(this.token, 32),e},a = o,t.SyncLogonDto = ae.writeFixedLenthString(this.token, 32),e},a = o,t.SyncLogonDto = a
主要的处理逻辑在·o.prototype.getBody = function()
这里的writeUnsigedInt是四字节无符号整数,而且是小头的。就是低位在前,高位在后
,相同还有,
writeFixedLenthString(this.account, 32),补充位,也是先写入数据,后填充‘\x00’,在python的bytes使用bytes.ljust(),后面有详细介绍。
这是消息的主体
封包wss数据
根据上面在js可以生成一些python代码用于数据组织
def addHeader(bodyl,command,action=0,ext=0):# Data---\x3e command:" + t + " action:" + n + " size: 4+len(e),ext:anum= command | action << 4 | bodyl << 12 | ext << 23#num.to_bytes(length=32,byteorder='little')return num.to_bytes(length=4,byteorder='little')def parseHeader(hex4='11c08500'):# little_byte = b'\x01\x00\x00\x00\x00\x00\x00\x00'hex4=int.from_bytes(bytes.fromhex(hex4),byteorder='little')command=hex4 &int('F',16)action=hex4>>4 & int('FF',16)l=hex4>>12 & int('7FF',16) #only 11bitext=hex4>>23 print (f'command:{command},action:{action},len:{l},ext:{ext}')def loginbytes(sn,lh,uid,account,token):re=bytes()re+=int(b'01',16).to_bytes(4,byteorder='little')re+=int(b'01',16).to_bytes(4,byteorder='little')re+=sn.encode()re+=int(lh).to_bytes(4,byteorder='little')re+=int(uid).to_bytes(8,byteorder='little')re+=account.encode().ljust(32,b'\x00')re+=token.encode().ljust(32,b'\x00')# print(len(re))# print (re.hex())return re
解释
addHeader使用按位或,在返回时byteorder='little')
这是比较原始数据得出的。
parseHeader用按位与,移位来排除前,与来排除后,只留对照有用的。
这两个函数处理4字节32位的头部信息。
loginbytes 是改写的js中的SyncLogonDto getBody其中account.encode().ljust(32,b'\x00')
是对account补足32,int(uid).to_bytes(8,byteorder='little')
是将uid转为长整数8字节长,低位在前高位在后的bytes。
发送接收websocket的常驻后台脚本
本段代码,pip install websocket-client, 版本号1.18,websocket协议13
import websocket
import threading
import time
import os
import login
#os.path+=['../']
# 定义当接收到消息时调用的回调函数
def on_message(ws, message):print(f"Received message: {message}")# 定义当连接关闭时调用的回调函数
def on_close(ws, close_status_code, close_msg):print(f"### Closed ###")# 定义当出现错误时调用的回调函数
def on_error(ws, error):print(f"### Error ### {error}")if __name__ == "__main__":# websocket服务地址ws_service_address = "ws://your_websocket_server"ws_service_address = "wss://alidr-311.klwgt.com/data"# 创建websocket应用实例websocket.enableTrace(True)ws = websocket.WebSocketApp(ws_service_address,on_message=on_message,on_close=on_close,on_error=on_error)# 创建一个线程用于运行websocket客户端wst = threading.Thread(target=ws.run_forever)wst.daemon = Truewst.start()time.sleep(3)mss=login.getlogin()ws.send_bytes(mss)# 主线程做其他事情...# 例如,主线程可以发送消息到websocket服务器# ws.send("Your message here")# 主线程在此处等待,否则程序会立即退出# 如果你的程序需要在后台运行,则不需要这一行wst.join()
其实主要就是来自百度AI的一段代码。稍加调整假入了延时的登陆调用。然后就成功登陆了。实现和浏览器js登陆websocket的一样的效果。
总结
虽然这段代码,没有什么业务功能,细节也是基本的类型转换,但是它是从怀疑中不断产生的。因为我开始时怀疑python在websocket库是否能完全仿真js在websocket。在查看js的建立连接的请求头时,发现协议版本是2011年的13,然后查看了websocket-client在pypi,也是支持到这个版本,只是还没有实现gzip功能的扩展。
既然如此,wss的 建立也没要求cookie和其实token。那就用python跑一下。基于开始处对于网站数据的整理,要是没有原本的js脚本,这也是一个不可能完成的事情了。但是虽然登陆成了,以后的业务逻辑还不知道怎么处理。最少,分步骤,实现批处理,是可以的。这就由python建立 了 一个,js代码的客户端。
好吧纯属有病。
再见
相关文章:
【Python模拟websocket登陆-拆包封包】
Python模拟websocket登陆-拆包封包 解析一个网站获取wss原始数据拆包wss数据封包wss数据发送接收websocket的常驻后台脚本总结 解析一个网站 这里所用的网站是我一个内测的网站,主要手段是chrome devtools,用得很多,但我玩的不深,…...
速盾:海外服务器使用CDN加速有什么好处?
随着互联网的快速发展和全球化的需求增加,海外服务器的使用已经成为许多公司和个人的首选。与此同时,为了提供更好的用户体验和更快的网页加载速度,使用CDN(内容分发网络)加速海外服务器已经成为一个普遍的选择。CDN可…...
windows系统中实现对于appium的依赖搭建
Node.js:Appium是基于Node.js的,因此需要安装Node.js。可以从Node.js官网下载并安装。 Java Development Kit (JDK):用于Android应用的自动化测试,需要安装JDK。可以从Oracle官网下载并安装。 Android SDK:进行Andro…...
使用MATLAB进行字符串处理
MATLAB是一个强大的数学和计算机科学的软件工具包。它拥有一个灵活的字符串处理工具,可以用于处理和转换不同格式的字符串,例如,数值、日期、时间等。本文将探讨如何使用MATLAB进行字符串处理,以及如何利用它来解决实际问题。 在…...
Sourcetree登录GitLab账号
1. 在GitLab上创建个人访问令牌 在gitlab中点击右上角的头像图标,选择设置进入 Access Tokens(访问令牌) 页面填写令牌名称和到期时间,指定Scopes(范围)。一般选择read_repository和api点击 Create person…...
Linux进阶:软件安装、网络操作、端口、进程等
软件安装 yum 和 apt 均需要root权限 CentOS系统使用: yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y,自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…...
光猫、路由器、交换机之连接使用(Connection and Usage of Optical Cats, Routers, and Switches)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...
2025蓝桥杯(单片机)备赛--扩展外设之超声波测距原理与应用(十一)
1 超声波测距原理 接收器接到超声波的时间差。超声波发射器想某一方向发射波,再发射时刻开始计时 超声波在空气中传播,遇到障碍物则返回,超声波接收器收到反射波,立即停止计时。 SOR4原理: 通过IO口(TRIG…...
分布式数据库中间件可以用在哪些场景呢
在数字化转型的浪潮中,企业面临着海量数据的存储、管理和分析挑战。华为云分布式数据库中间件(DDM)作为一款高效的数据管理解决方案,致力于帮助企业在多个场景中实现数据的高效管理和应用,提升业务效率和用户体验。九河…...
MyBatis-Plus分页插件IPage用法
首先就是service接口需要继承IService<entity> 然后就是业务类实现类中需要继承ServiceImpl<Mapper,entity> Mapper正常写法,继承baseMapepr<entity> IPage的使用方式 QueryWrapper<MdSaleDayPhone> queryWrappernew QueryWrapper<>…...
使用MATLAB进行遗传算法设计
遗传算法是一种基于自然进化的计算方法,在解决各种优化问题方面具有广泛的应用。MATLAB作为一种强大的数学软件,可以方便快捷地实现遗传算法,并且通过可视化的方式直观地展现算法运行过程和结果。本文将介绍使用MATLAB进行遗传算法设计的步骤…...
mindtorch study
安装 pip install mindtorch mindtorch 用于帮助迁移torch模型到mindspore 大部分都可以直接把mindtorch的torch搞成torch,就和以前的代码一致,注意下面 只有静态图有点点差异 step也有差异 自定义优化器就麻烦了。 pyttorch还是牛啊 并行计算还是用的…...
java八股-SpringCloud微服务-Eureka理论
文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是?CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现?本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…...
2024信创数据库TOP30之蚂蚁集团OceanBase
数据库作为存储、管理和分析这些数据的关键工具,其地位自然不言而喻。随着信息技术的日新月异,数据库技术也在不断演进,以满足日益复杂多变的市场需求。近日,备受瞩目的“2024信创数据库TOP30”榜单由DBC联合CIW/CIS权威发布&…...
查找redis数据库的路径
Redis 数据库的路径通常由配置文件中的 dir 参数指定 查找 Redis 配置文件: Redis 配置文件通常命名为 redis.conf。您可以在以下位置查找它: /etc/redis/redis.conf(Linux 系统上的常见位置)/usr/local/etc/redis/redis.conf&…...
DrugLLM——利用大规模语言模型通过 Few-Shot 生成生物制药小分子
摘要 小分子由于能够与特定的生物靶点结合并调节其功能,因此在药物发现领域发挥着至关重要的作用。根据美国食品和药物管理局(FDA)过去十年的审批记录,小分子药物占所有获批上市药物的 76%。小分子药物的特点是合成相对容易&…...
【蓝桥杯C/C++】翻转游戏:多种实现与解法解析
博客主页: [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 💯题目💯问题分析解法一:减法法解法二:位运算解法解法三:逻辑非解法解法四:条件运算符解法解法五:数组映射法不同解法的比较…...
【AI系统】核心计算之矩阵乘
核心计算之矩阵乘 AI 模型中往往包含大量的矩阵乘运算,该算子的计算过程表现为较高的内存搬移和计算密度需求,所以矩阵乘的效率是 AI 芯片设计时性能评估的主要参考依据。本文我们一起来看一下矩阵乘运算在 AI 芯片的具体过程,了解它的执行性…...
Vue.js 自定义指令:从零开始创建自己的指令
vue使用directive 前言vue2使用vue3使用 前言 关于使用自定义指令在官网中是这样描述的 vue2:对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。 vue3:自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 在 Vue.js 中使用自定义指令…...
策略模式
定义:即定义一系列的算法,算法1,算法2,...,算法n,把他们封装起来,使他们可以相互替换。 优点:使得一个类的行为或者其算法可以在运行时改变,而且使用Context类的人在外部…...
性能优化--CPU微架构
一 指令集架构 Intel X86, ARM v8, RISC-V 是当今广泛使用的指令架构的实例。 大多数现代架构可以归类为基于通用寄存器的加载和存储型架构,在这种架构下,操作数倍明确指定,只能使用夹在和存储指令访问内存。除提供基本的功能之外,…...
在 Sanic 框架中实现高效内存缓存的多种方法
在使用 Sanic 框架开发 Web 应用时,我们可以通过内存缓存来提升应用的性能,减少对数据库或其他外部服务的频繁请求。下面提供一些在 Sanic 中实现内存缓存的基本方法。 使用 Python 内置的 functools.lru_cache 如果你的缓存需求比较简单,且…...
Mac 环境变量配置基础教程
MacOS 下一般配置有多个 Shell,如 Bash、ZSH 等,不同的 Shell 其创建 Terminal 时使用的环境变量配置文件也不尽相同,但一般都会读取并执行脚本文件 /etc/profile 来加载系统级环境变量,而用户级别环境变量,一般都会在…...
Qt如何屏蔽工具栏(QToolBar)自动折叠功能
最近发现Qt上工具栏一行放不下的时候,会自动折叠起来。当用户点击展开功能的小三角按钮时,工具栏会展开成多行。这个功能本身没什么问题,但是当工具栏展开的时候,鼠标光标一旦不小心移动到了工具栏外面,这时候…...
【数据分享】中国统计摘要(1978-2024)
数据介绍 《中国统计摘要(1978 - 2024)》犹如一部浓缩的历史巨著,承载着中国几十年来的发展轨迹与辉煌成就。它是由国家统计局精心编纂的重要资料,为我们全方位地展现了中国在经济、社会、民生等各个领域的深刻变革。 这本统计摘…...
unity运行状态下移动、旋转、缩放控制模型
demo地址:https://download.csdn.net/download/elineSea/90017272 unity2021以上版本用下面的插件 https://download.csdn.net/download/elineSea/90017305...
《 C++ 点滴漫谈 一 》C++ 传奇:起源、演化与发展
摘要 C 是一门兼具高效性与灵活性的编程语言,自上世纪 80 年代诞生以来,已经深刻影响了计算机科学与技术的发展。从 Bjarne Stroustrup 的初步构想到如今遍布各大领域,C 经历了语言规范的不断完善与功能的持续扩展。本文详细回顾了 C 的起源…...
Github客户端工具github-desktop使用教程
文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…...
自然语言处理:第六十三章 阿里Qwen2 2.5系列
本人项目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor 项目地址: QwenLM/Qwen2.5: Qwen2.5 is the large language model series developed by Qwen team, Alibaba Cloud. 官网地址: 你好,Qwen2 | Qwen & Qwen2.5: 基础模型大派对&a…...
springboot中设计基于Redisson的分布式锁注解
如何使用AOP设计一个分布式锁注解? 1、在pom.xml中配置依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.26</version></dependency><dependenc…...
angular做门户网站/中国站长之家官网
在我的代码中,我取两个数据系列的对数并绘制它们.我想通过将x轴的每个刻度值提高为e(自然对数的反对数)来改变每个刻度值.换一种说法.我想绘制两个系列的对数,但是具有x轴的水平.这是我正在使用的代码.from pylab import scatterimport pylabimport matplotlib.pyplot as pltim…...
网页app生成器原理/四川seo快速排名
基本思路:使用SQL SERVER 2014的Reporting Services定位MYSQL用于生产,MS SQL SERVER用于统计分析处理,不占用CPU和IO。与MYSQL的关系采用链接服务器方式: http://www.cnblogs.com/hukn/archive/2011/07/27/SQL_Server_ODBC_LinkS…...
wordpress不要分页/深圳竞价排名网络推广
操作符会进行隐式自动类型转换,此处ab隐式的将加操作的结果类型强制转换为持有结果的类型, 而aab则不会自动进行类型转换.如: 以下代码是否有错,有的话怎么改? 有错误.short类型在进行运算时会自动提升为int类型,也就是说 s11 的运算结果是int类型,而s1…...
深圳个人网站建设/如何百度推广
2019独角兽企业重金招聘Python工程师标准>>> spring 提供一个Resource接口来统一底层资源一致的访问,而且提供了一些便利的接口 一、Resource接口 org.springframework.core.io.Resource,对InputStream进行了封装 package org.springframewor…...
用凡客建站做的网站有哪些/山东大学经济研究院
近两年像LOL、吃鸡这种竞技类游戏从来都是国内游戏市场中的常青树,尤其是英雄联盟,运营多年至今热度不减反增,保持这种状态实在难能可贵,其中很大的原因是这种MOBA类游戏往往靠技术说话,而至于氪金多少只能彰显在外观是…...
重庆做营销型网站建设公司/百度搜索引擎营销案例
Java语言中,把字符串作为对象来处理,类String就可以用来表示字符串(类名首字母都是大写的)。1.字符串常量字符串常量是用双引号括住的一串字符。例如:"Hello World"2.String表示字符串变量String用来可以创建…...