【易车网实例】x-sign逆向保姆级教程
易车号x-sign逆向
前言
许多网站都有反爬机制,x-sign加密就是许多反爬虫机制的其中一种,本次将以易车号作为目标进行演示。
方法仅供学习参考。
链接:https://hao.yiche.com
用到的库:requests , urllib3 , time , hashlib
pip install hashlib
第一步,主页面
首先判断页面内容的更新方式,打开F12开发者工具,将页面一直下拉到底部,页面会自动更新出下一页内容,很明显是动态加载的,因此可以确定是Ajax请求。
在网络工具中选择Fetch/XHR,只有几条请求,一条一条查看,发现get_latest_video_list这一条包含了页面内容,在请求了几次之后,每次都是这个名字的请求携带内容,因此爬取目标就先确定为这条请求。
第二步 请求头
点击标头,在请求头中首先可以看到请求URL请求方式。
继续往下拉,可以看到x-sign,说明这条请求是经过x-sign加密的,因此就需要把请求头中的一些内容进行处理后再进行提交。首先看到有一条名字叫做x-timestamp的内容,很容易想到时间戳,调用 time.time() 后返回的内容和这条内容非常接近,也就可以确当这条内容是当前时间戳,并且长度为13位
经过测试发现,其中有三条是必须填写并且需要对应上的:x-sign(密钥),x-platform(设备类型),x-timestamp(时间戳)
点击负载选项,可以看到请求携带了一些json参数,在发送请求时需要加入请求头。
爬虫的基本框架基本就是这样了,只需要把x-sign获取到就可以了。另外,requests再爬取https时会报错,需要引用urllib3后加上一句urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)就可以了
import requests,json,urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def down(url):
headers = {
"authority": "hao.yiche.com",
"x-platform": "pc",
"x-sign": "",
"x-timestamp": "",
"x-user-guid": "a9f123e80087cd4aec7983ad6d611113"
}
jsons = ''
res = requests.post(url=url,headers=headers,verify=False,json=jsons)
return res
if __name__ == '__main__':
url = 'https://hao.yiche.com/site_web/hao/api/get_latest_video_list'
res = down(url).json()
print(res)
InsecureRequestWarning: Unverified HTTPS request is being made to host 'hao.yiche.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
warnings.warn(
{'status': '10600', 'message': 'JSON序列化异常 或 Request body is missing', 'data': None}
第三步 x-sign
获取x-sign首先找到源代码位置,利用Ctrl+Shift+F全局搜索x-sign,
将js文本格式化之后可以看到x-sign的值是s(e,t)的返回值,另外在上边看到了些熟悉的东西,刚才提到的头文件中三个必需值中有一个是设备类型,而这里写的name值应该就是定义的几种设备类型和对应的Value值,先记下来备用,例如我用PC端,就记下Value= “19DDD1FBDFF065D3A4DA777D2D7A81EC”, cid = “508”
在这里打上断点,下滑页面再次发送一条请求,可以看出,返回来cid值也确实是508,因此可以确定这里的508页确实和上边的一样是写死的参数。
接下来看 s(e,t)的位置,末尾写着返回值是s,而s就是对n进行md5加密,n则是由"cid=" + t.cid + “¶m=” + i + o + t.timestamp这一串内容拼接而来。我们只需要知道t.cid、i、o、t.timestamp的值。
1、其中cid就是上边已知的定义好的值。例如pc的cid为508。
2、从内容上来看,i 貌似是定义页面的参数也是写死的{“pageIndex”:8,“pageSize”:10},经过几次请求后发现也确实是写死的参数
3、根据请求的内容可以看到timestamp是长度13位的数字,因此不妨假设他就是长度为13位的时间戳。
4、o的内容就很明显了,和刚才看到的一模一样,大概率也是写死的,需要name,value,cid同时对应
因此四个值都已经的出来了,只需要进行一次md5加密就可以得出x-sign值了,下面来放进代码里验证一下
第四步 加密
利用第三方库对拼接后的内容进行md5加密
import hashlib
hex = hashlib.md5()
hex.update(sign.encode('utf-8'))
sign = hex.hexdigest()
经过测试,结果正常返回,至此逆向的过程就结束了。
有几个点可能出错需要注意一下
调用time.time()时返回的是一个小数点前10位的浮点数,需要将返回值乘以1000后使用int()取整,并且用str() 转换为字符串后进行拼接,否则会报出类型错误
在拼接时需要注意一下pageIndex的值是否和页面的对应,例如页面给出的是pageindex=5,pagesize=10,若在这里写成pageindex=1或者其他非5的数字,就会报出签名错误或者json非法。
- 这里面的三个值必须全部对应,有一个不对就会出错。一定要注意headers中的x-platform中的值。
最后
过程不算很难,但是很考验耐心和细节
没有接受挑战,没有失败经验,怎进步向前?
源代码已经提交至Gitee:逆向 · Primice/Python演示 - 码云 - 开源中国 (gitee.com)
爬虫请勿过度使用,使用时需遵守robots协议。
【易车网实例】x-sign逆向保姆级教程的更多相关文章
- RocketMQ保姆级教程
大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...
- 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)
写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...
- 自建本地服务器,自建Web服务器——保姆级教程!
搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...
- Eclipse for C/C++ 开发环境部署保姆级教程
Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...
- 强大博客搭建全过程(1)-hexo博客搭建保姆级教程
1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...
- 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!
作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...
- ElasticSearch入门篇(保姆级教程)
本章将介绍:ElasticSearch的作用,搭建elasticsearch的环境(Windows/Linux),ElasticSearch集群的搭建,可视化客户端插件elasticsearch-he ...
- github注册教程最新版(十年程序员保姆级教程)
您可以在墨抒颖的网站体验本文章的纯净版 准备 拥有一个可以接受信息的邮箱即可 开始 点击github官网github step1.进入注册页面 点击Sign Up进入注册流程 step2.输入邮箱 这 ...
- 【k8s】在AWS EKS部署并通过ALB访问k8s Dashboard保姆级教程
本教程适用范围 在AWS上使用EKS服务部署k8s Dashboard,并通过ALB访问 EKS集群计算节点采用托管EC2,并使用启动模板. 使用AWS海外账号,us-west-2区域 使用账号默认v ...
- Python小游戏——外星人入侵(保姆级教程)第一章 01创建Pygame窗口 02创建设置类Setting()
系列文章目录 第一章:武装飞船 01:创建Pygame窗口以及响应用户输入 02:创建设置类Setting() 一.前期准备 1.语言版本 Python3.9.0 2.编译器 Pycharm2022 ...
随机推荐
- UIPath踩坑记一UIpath中抓取数据后在tableau中无表头
UIpath抓取数据存在Excel中(Excel 应用程序范围),且已设置表头,但是放到tableau中无表头 更换为"写入范围(工作簿)",同时属性设置必须勾选"添加标 ...
- [Unity移动端]Mono与IL2Cpp
参考链接: https://blog.csdn.net/linxinfa/article/details/87358809 https://blog.csdn.net/Aison_/article/d ...
- 火狐浏览器调试eval源码
火狐浏览器调试eval源码 firefox浏览器在网页调试上,有一个没法和chrome一比高下的功能,就是eval脚本的调试,有时前端架构使用了基于eval的方式,有时候可能是自己一个多行函数,每每遇 ...
- bash中的basename与dirname以及${}
var=/dir1/dir2/file.tar.gz basename $var #获取文件名 file.tar.gz dirname $var #获取目录名称 / ...
- 解决Python写入yaml后排版混乱还丢失注释问题
转载https://www.cnblogs.com/jiahm/category/1530828.html 大家有没有遇到过在使用Python进行yaml文件写入数据后,内容排版混乱并且丢失注释问题, ...
- 基于声网 Flutter SDK 实现互动直播
前言 互动直播是实现很多热门场景的基础,例如直播带货.秀场直播,还有类似抖音的直播 PK等.本文是由声网社区的开发者"小猿"撰写的Flutter基础教程系列中的第二篇,他将带着大家 ...
- 2022年8月学科能力综合测试(TACA)试题解答 Mathemaitca练习
目录 试题地址 1 4 5 10 13 你让我猜我肯定这么猜 试题地址 https://k.sina.com.cn/article_2897328623_acb1b9ef019011qen.html ...
- Linux设备驱动那些事
目的 初步了解 linux 设备驱动框架模型 初步了解设备驱动模型有哪些元素 设备驱动模型元素的说明及解释 设备驱动模型元素的工作原理 设备驱动模型的小例子 对整体有个粗略的了解,设备驱动类型种类太多 ...
- 很强,我终于找到绘制E-R图的正确姿势
前言 不知道大家是不是和我一样,为了追求速度,开发时一般都是直接建表就干,哪管什么E-R图.直到xxx项目找上你,某某客户要E-R图,提供一下吧.这时候就很烦,从头绘制E-R图成本真的很高,今天我就遇 ...
- Excel批量加粗关键词(宏)
代码如下: Sub 批量加粗() Dim a As Range Dim b As String b = InputBox("请输入要加粗的关键字") For Each a In A ...