当前位置: 首页 > news >正文

某查查请求头参数加密分析(含JS加密算法与Python爬虫源码)

文章目录

  • 1. 写在前面
  • 2. 请求分析
  • 3. 断点分析
  • 4. 扣加密JS
  • 5. Python爬虫代码实现

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  先前写过一篇关于APP端自动化方案的文章,对于基础数据获取的话相对还是比较稳定的,当时单台设备测试一天数据量在1W+,单账号未被风控!感兴趣的可以移步阅读:使用Python爬取某查查APP端(Appium自动化篇)

如果除了基础数据想要获取更多类型的数据(风险信息、知识产权、法律诉讼…)可以直接从Web端入手,请求头参数加密!Web的话主要还是对账号的全方面风控策略~

在这里插入图片描述

2. 请求分析

抓包分析,大部分需要VIP权限,所以我这里找了一个非VIP数据项查看的接口(经营风险信息)。请求可以看到在Headers里面有两个参数是密文,如下所示:

在这里插入图片描述

X-Pid参数的值在网页源代码即可获取,无需分析,如下所示:

在这里插入图片描述

3. 断点分析

分析另一个加密参数,是一个键值对的数据,Key跟Value都是密文,这里通过XHR跟堆栈以及全距搜索的方式都可以定位到Headers处理部分的JS代码,如下所示:

在这里插入图片描述

如上图点击a.default跳转到请求头Key的加密具体方法:

在这里插入图片描述

点击r.default跳转到请求头Value的加密具体方法:

在这里插入图片描述

其中o.default是加密算法!先分析Key跟Value的加密算法o.default,在JS中可以看到WebPack加载了856562,跟着断点继续走,o.default的加密如下所示:

在这里插入图片描述

SHA512的加密函数,借助JS内CryptoJS一行代码即可实现,如下所示:

// HMAC SHA512加密函数
function hmacSHA512(data, key) {return CryptoJS.HmacSHA512(data, key).toString();
}

a.default是干啥的?是数据处理,JS代码如下所示:

在这里插入图片描述

如上代码o.default.no.default.codes取值字典内字段,内容如下:

在这里插入图片描述

如上显示这里的o.default是一个字典,定义实现如下:

o = {}
o.default = {"n": 20,"codes": {"0": "W","1": "l","2": "k","3": "B","4": "Q","5": "g","6": "f","7": "i","8": "i","9": "r","10": "v","11": "6","12": "A","13": "K","14": "N","15": "k","16": "4","17": "L","18": "1","19": "8" }   
}

4. 扣加密JS

通过上面断点分析,找到了Headers请求头内Key、Value的加密实现代码以及加密代码内的其他调用方法,最终加密算法如下:

const CryptoJS = require('crypto-js');// HMAC SHA512加密函数
function hmacSHA512(data, key) {return CryptoJS.HmacSHA512(data, key).toString();
}// 默认的配置和编码映射
const config = {"n": 20,"codes": {"0": "W", "1": "l", "2": "k", "3": "B", "4": "Q","5": "g", "6": "f", "7": "i", "8": "i", "9": "r","10": "v", "11": "6", "12": "A", "13": "K", "14": "N","15": "k", "16": "4", "17": "L", "18": "1", "19": "8"}
};// 根据给定的字符串生成编码
function generateCode(str) {let result = "";for (let char of str) {const code = char.charCodeAt() % config.n;result += config.codes[code];}return result;
}// 生成密钥
function generateKey(path, data = {}) {const encodedPath = encodeURIComponent(path).toLowerCase();const encodedData = JSON.stringify(data).toLowerCase();const hashedPathData = hmacSHA512(encodedPath + encodedData, generateCode(encodedPath)).toLowerCase();return hashedPathData.substr(8, 20);
}// 生成值
function generateValue(path, data = {}, tid = "") {const encodedPath = encodeURIComponent(path).toLowerCase();const encodedData = JSON.stringify(data).toLowerCase();return hmacSHA512(encodedPath + "pathString" + encodedData + tid, generateCode(encodedPath)).toLowerCase();
}// 主函数运行
function run(path, tid, data = {}) {const headers = {};headers[generateKey(path, data)] = generateValue(path, data, tid);return headers;
}// 测试数据
const tid = '53f97a8d50bcf99d4a9a3a36c6cdd9c2'; //企业加密ID
// 数据接口
const path = 'https://www.qcc.com/api/datalist/zhuanlilist';
const jsonData = {"keyNo": "6b242b475738f45a4dd180564d029aa9",
};console.log(run(path, tid, jsonData));

上述JS加密算法代码中generateCode函数实现的是a.default的数据操作处理,hmacSHA512函数实现的是o.default的加密方法

运行测试上面Key、Value的加密算法程序,结果如下所示:

在这里插入图片描述

5. Python爬虫代码实现

import re
import execjs
import requests# cookies信息自行设定
cookies = {'qcc_did': '','UM_distinctid': '','acw_tc': '','QCCSESSID': '','_uab_collina': '','CNZZDATA1254842228': ''
}def load_javascript_function():with open('./qcc_k_v.js', 'r', encoding='utf-8') as file:js_code = file.read()return execjs.compile(js_code)def generate_headers(url, pid, tid, json_data=None):headers = {'x-pid': pid} # 其他headers请求头信息自行补充path = re.findall(r'(/api.*)', url)[0]js_ctx = load_javascript_function().call('run', path, tid, json_data)for key, value in js_ctx.items():headers[key] = valuereturn headersdef make_post_request(url, pid, tid, json_data=None):headers = generate_headers(url, pid, tid, json_data)return requests.post(url, cookies=cookies, headers=headers, json=json_data)def make_get_request(url, pid, tid):headers = generate_headers(url, pid, tid)return requests.get(url, cookies=cookies, headers=headers)if __name__ == '__main__':# 企业加密唯一ID(自行选择测试)key_no = '3f603703d59a04cbe427e5825099a565'pid = '' # HTML中搜索并自行填充tid = '' # HTML中搜索并自行填充# 示例GET请求get_url = 'https://www.qcc.com/api/datalist/guarantorlist?keyNo=3f603703d59a04cbe427e5825099a565'print(make_get_request(get_url, pid, tid).json())# 示例POST请求post_url = 'https://www.qcc.com/api/datalist/zhuanlilist'json_data = {'keyNo': '3f603703d59a04cbe427e5825099a565'}print(make_post_request(post_url, pid, tid, json_data).json())

以上是最终的爬虫代码,根据注释完善即可!测试(经营风险|信息、知识产权)接口如下:

在这里插入图片描述

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

相关文章:

某查查请求头参数加密分析(含JS加密算法与Python爬虫源码)

文章目录 1. 写在前面2. 请求分析3. 断点分析4. 扣加密JS5. Python爬虫代码实现 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】&#xff…...

免费用chatGPT

免费用chatGPT,地址: DocGPT - 第二大脑...

还不会python 实现常用的数据编码和对称加密?看这篇文章就够啦~

相信很多使用 python 的小伙伴在工作中都遇到过,对数据进行相关编码或加密的需求,今天这篇文章主要给大家介绍对于一些常用的数据编码和数据加密的方式,如何使用 python 去实现。话不多说,接下来直接进入主题: 前言 1…...

简易实现 MyBatis 底层机制

MyBatis 大家好呀!我是小笙,我中间有1年没有更新文章了,主要忙于毕业和就业相关事情,接下来,我会恢复更新!我们一起努力吧! 概述 MyBatis 是一个持久层的框架(前身是 ibatis&#x…...

PhpPythonC++圆类的实现(OOP)

哎......被投诉了 😭😭😭😭😭 其实也不是小编不更,这不是期末了吗(zhaojiekou~~),而且最近学的信息收集和ctf感觉好像没找到啥能更的(不过最经还是在考虑更一…...

OpenSSL升级版本

1 查看openssl版本 $ openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 目前是1.0版本系列. 2 下载最新稳定版本的OpenSSL源码包 $ wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz 3 编译源码安装 tar -xzvf openssl-1.1.1q.tar.gz cd openssl-1.1.1q .…...

基于sprinmgboot实习管理系统源码和论文

随着信息化时代的到来,管理系统都趋向于智能化、系统化,实习管理也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,而实习管理…...

图像分类任务的可视化脚本,生成类别json字典文件

1. 前言 之前的图像分类任务可视化,都是在train脚本里, 用torch中dataloader将图片和类别加载,然后利用matplotlib库进行可视化。 如这篇文章中:CNN 卷积神经网络对染色血液细胞分类(blood-cells) 在分类任务中,必定…...

Adding Conditional Control to Text-to-Image Diffusion Models——【代码复现】

官方实现代码地址:lllyasviel/ControlNet: Let us control diffusion models! (github.com) 一、前言 此项目的使用需要显存大于8G,训练自己的ControlNet或需要更大,因此请注意查看自身硬件是否符合。 在此之前请确保已经安装好python以及…...

java-Exchanger详解

1.概述 java.util.concurrent.Exchanger。这在Java中作为两个线程之间交换对象的公共点。 2.Exchanger简介 Exchanger类可用于在两个类型为T的线程之间共享对象。该类仅提供了一个重载的方法exchange(T t)。 当调用exchanger时,它会等待成对的另一个线程也调用它…...

‘再战千问:启程你的提升之旅‘,如何更好地提问?

例如,很多时候我们提出一些问题,然而通义千问提供的答案,并非完全符合我们的期望。这并非由于通义千问的智能程度不足,而是提问者的“提问技巧”尚未掌握得当。 难道提问还需要讲究艺术性吗?确实如此。今天&#xff0c…...

java SSM社区文化服务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM社区文化服务管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的 源代码和数据库,系统主…...

go执行静态二进制文件和执行动态库文件

目的和需求:部分go的核心文件不开源,例如验证,主程序核心逻辑等等 第一个想法,把子程序代码打包成静态文件,然后主程序执行 子程序 package mainimport ("fmt""github.com/gogf/gf/v2/os/gfile"…...

通过示例解释序列化和反序列化-Java

序列化和反序列化是Java(以及通常的编程)中涉及将对象转换为字节流,以及反之的过程。当你需要传输或存储对象的状态时特别有用,比如将其通过网络发送或持久化到文件中。 序列化: 定义:序列化是将对象的状…...

k8s源码阅读环境配置

源码阅读环境配置 k8s代码的阅读可以让我们更加深刻的理解k8s各组件的工作原理,同时提升我们Go编程能力。 IDE使用Goland,代码阅读环境需要进行如下配置: 从github上下载代码:https://github.com/kubernetes/kubernetes在GOPATH目…...

Java JDBC整合(概述,搭建,PreparedStatement和Statement,结果集处理)

一、JDBC的概述: JDBC:是一种执行sql语句的Java APL,可以为多种关系类型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。有了JDBC,Java人员只需要编写一次程序就可以访问不同的数据库。 JDBC APL&#xf…...

Nginx 负载均衡集群 节点健康检查

前言 正常情况下,nginx 做反向代理负载均衡的话,如果后端节点服务器宕掉的话,nginx 默认是不能把这台服务器踢出 upstream 负载集群的,所以还会有请求转发到后端的这台服务器上面,这样势必造成网站访问故障 注&#x…...

uniapp 多轴图,双轴图,指定哪几个数据在哪个轴上显示

这里使用的在这里导入&#xff0c; 秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场 这里我封装成一个组件&#xff0c;自适应的&#xff0c;可以直接复制到自己的项目中 <template><qiun-data-charts type"mix":opts"opts":cha…...

Kotlin 协程 supervisorScope {} 运行崩溃解决

前言 简单介绍supervisorScope函数&#xff0c;它用于创建一个使用了 SupervisorJob 的 coroutineScope&#xff0c; 该作用域的特点&#xff1a;抛出的异常&#xff0c;不会 连锁取消 同级协程和父协程。 看过很多 supervisorScope {} 文档的使用&#xff0c;我照抄一摸一样…...

【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具

欢迎来到数据库的奇妙世界&#xff0c;在这里&#xff0c;我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具&#xff0c;它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用&#xff0…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...