易车号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. pycharm安装包的简便方法

  2. js延迟加载、js异步加载

    1.js延迟加载 (1)js延迟加载是js性能优化的一种方式 (2)作用:为了提高网页的加载速度 (3)原理:等网页加载完成之后再加载js文件 ··需要优化的原因:HTML元素是按照其在页面中出现的次 ...

  3. 基于Centos7 minimal 加固

    一.用户帐号和环境-----------------------. 2 二.系统访问认证和授权--------------------- 3 三.核心调整--------------------- 4 ...

  4. 数据库中1NF,2NF,3NF的判别

    参照:https://blog.csdn.net/qq_28888837/article/details/98733448 1NF:每一个都是最原子化.  2NF:找到主键后,每一个非主键对主键都是完 ...

  5. 【读书笔记】组合计数中的行列式方法 专题3 完美匹配: the Pfaffian method

    目录 专题3-Perfect matchings: the Pfaffian method 一些定义 用2×1的砖密铺a×b的大矩形的方法数 专题3-Perfect matchings: the Pfa ...

  6. 2.Web开发基础

    Web开发基础 目录 Web开发基础 1.网络基础 2.OSI模型 应用层: 表示层: 会话: 传输层: 网络层: 数据链路层: 物理层: 3.通信子网:(数据通信) 4.资源子网:(数据处理) 5. ...

  7. [Volo.Abp升级笔记]使用旧版Api规则替换RESTful Api以兼容老程序

    @ 目录 原理分析 开始改造 更换基类型 重写接口 替换默认规则 在微服务架构中的问题 Volo.Abp 配置应用层自动生成Controller,增删查改服务(CrudAppService)将会以RE ...

  8. [BUUCTF]Web刷题记录

    为提升观感体验,本篇博文长期更新,新题目以二次编辑形式附在最后 [ACTF2020 新生赛]Exec 打开后发现网页是关于执行一个ping指令,经过测试是直接执行的,所以就直接命令执行了 127.0. ...

  9. 基于Labelstudio的UIE半监督智能标注方案(本地版)

    基于Labelstudio的UIE半监督智能标注方案(本地版) 更多技术细节参考上一篇项目,本篇主要侧重本地端链路走通教学,提速提效: 基于Labelstudio的UIE半监督深度学习的智能标注方案( ...

  10. kubernetes核心实战(三)--- ReplicationController

    5.ReplicationController ReplicationController 确保在任何时候都有特定数量的 Pod 副本处于运行状态.换句话说,ReplicationController ...