【易车网实例】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 ...
随机推荐
- Chrome(谷歌)浏览器永久关闭恢复页面提示框(记录)
使用脚本调用Chrome浏览器启动指定页面,然后代码里的命令关闭,会被浏览器识别为非正常关闭. 再次执行脚本的时候会停留在空白页面,无法进入指定页面,设置为主页也无法进入. 排查可能是浏览器自动恢复页 ...
- vue-devtools 打开 vscode 可能会报错
据说 99% 的人不知道 vue-devtools 还能直接打开对应组件文件?本文原理揭秘 mac 电脑在 VSCode command + shift + p,Windows 则是 ctrl + s ...
- 关于PB用JDBC连接MySQL,亲测有效
以前自学过一段时间的PB,数据窗口让人印象深刻,前段时间,在西瓜视频看到有人录制了PB的教学视频,让我想起以前自学的那段时光,遇到了问题,也不知道问谁,现在网络发达,可以在网上查找问题,但是有大多数博 ...
- JDMasking v0.1.0-beta 发布
JDMasking 全称是jdbc data masking,是一款零代码修改.无重启.基于JDBC的动态数据脱敏软件. JDMasking 主要对实现jdbc的驱动进行字节码的增强,支持对运行中的程 ...
- 微信小程序中如何设置跳转页面
修改project.config.json内容 "cloudfunctionRoot":"cloud", //配置云开发的路径 更改app.js文件内容 App ...
- vue element表格合计问题
vue element计算表格合计问题 问题:当表格的el-table-column标签下的属性prop属性值为'对象.属性'时,将不能自动合计.例如: <el-table border v-l ...
- 网络安全(中职组)-B模块:暴力破解
任务环境说明: 服务器场景名称:sql008 服务器场景用户名:administrator:密码:未知(封闭靶机) 1.使用渗透机场景kali中工具扫描服务器场景,将iis的版本号作为flag提交: ...
- Android笔记--按钮触控
Button(由TextView派生而来) 但也是有一定的区别: 具体实现: 按钮控件的新增属性 具体实现: 在未使用textAllCaps属性之前,按钮名称会默认为全部使用大写字母: 在指定了该属性 ...
- SpringBoot部署到外部Tomcat无法注册到Nacos服务端
事情经过 近期做一个项目投标演示(POC)环境支持,需要集成Nacos服务端.考虑到现有项目中已经有了Nacos相关依赖,那还不简单?新建个服务端,配置几下重启不就搞定了吗?然而事情远没有想得这么简单 ...
- linux中查看用户和组信息小结
查看当前登录用户的组内成员groups 查看当前登录用户名whoami 查看tom用户所在的组,以及组内成员groups tom 查看所有的用户信息cat /etc/passwd 用户名.密码.用户i ...