Python 爬虫进阶必备 | 某视频平台 sign 加密参数分析
今日网站
Byb29tJTNGc3BtJTNEYTJoMGMuODE2NjYyMi5QaG9uZVNva3VVZ2NfMS5kdGl0bGUlMjZpZCUzRDgwOTE1MjElMDA=
今天这个网站同样来自咸鱼的技术交流群
,也是群友拿来交流的网站,因为风险较高,所以上面的密文解不出来的别费劲了。
有需要可以翻下群聊的记录。
抓包与定位
这网站比较敏感所以我们快速过一下,不要研究深了,封号警告~
先看下需要分析的请求
这个请求之后返回了一个 json 数据,前端程序解析这个 json 展示在页面上
所以进一步来看下他的请求参数
可以看到位置的参数只有sign
这一个,其他的参数基本都能猜出大概的意思
所以直接检索一下参数名(不是 xhr 请求用不上 xhr 断点)
检索的结果很少,只有两个,可以通过请求的链接快速定位这个参数所在的文件位置
通过在文件中再次检索,可以快速定位到sign
的位置
加密分析
这个逻辑就非常简单了,快速过一下这个逻辑
第一步、获取到提交参数中的appkey
可以写死,并做一个简单的运算
第二步、将第一步的g
和当前的时间戳、token还有提交的参数中的data
部分做一个拼接后传入了h()
这里比较迷惑性的是token
,这个token
试过是由不同访问的会话生成一个固定的值带入cookie
当中的,这一点可以直接在会话中检索,和cookie
中的值一样
那么这个cookie
的值是怎么来的呢?
通过检索是可以看到是由请求直接写入的
这里就需要再次去模拟这个请求然后拿到服务器返回的cookie
,之后再解析出这个cookie
中的_m_h5_tk
再带入到上面的h()
参数中
第三、获取cookie
的这个请求可以看到也带有sign
,这个时候就陷入懵逼的情况了,不知道的还以为是无限套娃呢?
不过经过使用postman
测试发现,这个获取cookie
请求的sign
写死也是可以获取到set-cookie
的,所以我们就直接写死sign
就行了
第四、完成第三步假的sign
之后,我们就可以获取到set-cookie
中的_m_h5_tk
也就是token
第五、完成第四步之后,h()
传入的参数就可以完成拼接了,这里就需要分析h()
完成了什么逻辑
打上断点,可以看到h()
是个比较简单的 js 也没什么混淆,可以直接扣取代码,也可以直接参考咸鱼分析的结果,这个h
就是 MD5 算法,直接用 Python 实现即可
第六、使用 Python 完成数据的获取
- Scala-2.13.0 安装及配置
- HBase-1.3.1 集群搭建
- CentOs7.3 Hadoop 用户 ssh 免密登录
- 手把手教你用Mysql-Cluster-7.5搭建数据库集群
- 简单的java开源图床
- 调度器Quartz的简述与使用总结
- 使用 RecyclerView 实现 Gallery 画廊效果,并控制 Item 停留位置
- linux chmod,chown命令详解
- Quartz任务调度快速入门
- ElasticSearch 安装报错整理
- Docker Compose 1.16.1 安装
- 教你如何用 RecyclerView 做一个好用的轮播图
- Docker-17.06.2 环境搭建
- 我所理解的Intent 和Intent-filter
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Dynamic Programming - 375. Guess Number Higher or Lower II
- go语言的原生map引发的一个坑
- 分布式服务监控你真的会吗
- Design - 460. LFU Cache
- Binary Search - 33. Search in Rotated Sorted Array
- Binary Search - 35. Search Insert Position
- Binary Search - 278. First Bad Version
- Design - 381. Insert Delete GetRandom O(1) - Duplicates allowed
- Design - 380. Insert Delete GetRandom O(1)
- DFS&BFS - 52. N-Queens II
- DFS&BFS - 51. N-Queens
- maze - dfs
- DFS&BFS - 130. Surrounded Regions
- Tree - 145. Binary Tree Postorder Traversal
- Tree - 94. Binary Tree Inorder Traversal