易车号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 + “&param=” + 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逆向保姆级教程的更多相关文章

  1. RocketMQ保姆级教程

    大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...

  2. 保姆级教程——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版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  3. 自建本地服务器,自建Web服务器——保姆级教程!

    搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...

  4. Eclipse for C/C++ 开发环境部署保姆级教程

    Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...

  5. 强大博客搭建全过程(1)-hexo博客搭建保姆级教程

    1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...

  6. 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!

    作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...

  7. ElasticSearch入门篇(保姆级教程)

    本章将介绍:ElasticSearch的作用,搭建elasticsearch的环境(Windows/Linux),ElasticSearch集群的搭建,可视化客户端插件elasticsearch-he ...

  8. github注册教程最新版(十年程序员保姆级教程)

    您可以在墨抒颖的网站体验本文章的纯净版 准备 拥有一个可以接受信息的邮箱即可 开始 点击github官网github step1.进入注册页面 点击Sign Up进入注册流程 step2.输入邮箱 这 ...

  9. 【k8s】在AWS EKS部署并通过ALB访问k8s Dashboard保姆级教程

    本教程适用范围 在AWS上使用EKS服务部署k8s Dashboard,并通过ALB访问 EKS集群计算节点采用托管EC2,并使用启动模板. 使用AWS海外账号,us-west-2区域 使用账号默认v ...

  10. Python小游戏——外星人入侵(保姆级教程)第一章 01创建Pygame窗口 02创建设置类Setting()

    系列文章目录 第一章:武装飞船 01:创建Pygame窗口以及响应用户输入 02:创建设置类Setting() 一.前期准备 1.语言版本 Python3.9.0 2.编译器 Pycharm2022 ...

随机推荐

  1. 【javascript】关于charCodeAt()方法

    在做算法题目leetcode 2283时,看见某些答案会使用charCodeAt(),因为自己没用过,所以作此纪录 描述在 JavaScript 中,charCodeAt() 是一种字符串方法,用于检 ...

  2. Hive:FAILED: LockException [Error 10280]: Error communicating with the metastore

    1.问题示例 使用hive直接选择查看表中数据报错,而相同语句在spark-sql却不报错. 实在无力吐槽hive了,因它受伤太多了. (1)使用hive hive (test)> select ...

  3. 生产环境实现Docker部署宝塔面板

    生产环境中,为了避免极小概率的数据丢失,我们将容器内的宝塔文件映射到宿主机的目录中(您之后安装的 Nginx.MySQL 等服务均会挂载到宿主机目录).该方法是 Docker 部署宝塔面板的最优方案, ...

  4. java 程序运行机制

    java 程序运行同时拥有 编译型语言和解释型语言的特点 程序运行流程: 源程序 .java文件 --> Java 编译器--> 字节码 .class 文件 --> 类装饰器 --& ...

  5. Hive中的高级函数

    高级函数 1.炸裂函数 UDTF 通常是将数组或者集合中或者结构体(涉及到数据类型-------复杂数据类型)中的元素单个输出 特点:接收一行数据,输出一行或多行数据 2.窗口函数/开窗函数 概念:能 ...

  6. Python学习笔记--第二阶段啦

    初识对象 示例: 类的成员方法 上图中的self必须填写!!! 示例: 类和对象 有c和c++语言基础的话,就会发现其实是一样的道理,只是实现代码有差异 构造方法(init) 示例: 注意: 其他内置 ...

  7. wx.BoxSizer布局管理器用法,及其Add()方法参数说明

    wx.BoxSizer 布局管理器是一种常见的布局管理器,它可以在水平或垂直方向上布置子窗口部件.同时,它还可以在水平或垂直方向上包含其他 wx.BoxSizer 来创建复杂的布局. 下面是 wx.B ...

  8. 创业团队如何落地敏捷测试,提升质量效能?丨声网开发者创业讲堂 Vol.03

    前言 老牛是资深测试专家.技术架构师.具备多年互联网公司从业经验以及十多年一线研发经验.同时也是 DevOps 践行者,近几年兼任质量团队的管理工作.其中,负责的某技术平台,稳定运行两年多,累计调用量 ...

  9. 解放生产力:30+实用AI工具汇总

    除了ChatGPT,还有哪些好用AI工具?带着这个问题,也为了解AIGC已经在哪些场景落地,我体验了30多个AI工具并且分享出来,希望对你有帮助. 文字 ChatGPT -- 解决任何问题地址:htt ...

  10. dart基础---->dart语法入门

    Dart is an open source, structured programming language for creating complex, browser-based web appl ...