350 lines
7.3 KiB
Markdown
350 lines
7.3 KiB
Markdown
# API验签破解 - 快速参考
|
||
|
||
## 🎯 核心概念
|
||
|
||
```
|
||
验签参数 = 防止爬虫的签名参数
|
||
|
||
常见参数:
|
||
├─ a_bogus → 最关键,每个请求都不同
|
||
├─ msToken → 会话Token
|
||
├─ verifyFp → 设备指纹
|
||
└─ fp → 设备指纹(同verifyFp)
|
||
```
|
||
|
||
## 🚀 三种方案对比
|
||
|
||
| 方案 | 难度 | 稳定性 | 速度 | 推荐度 |
|
||
|------|------|--------|------|--------|
|
||
| **Cookie方案** | ⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ **推荐** |
|
||
| **Playwright方案** | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 推荐 |
|
||
| **完全逆向方案** | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⚠️ 高级 |
|
||
|
||
## 📦 当前项目(Cookie方案)
|
||
|
||
### 日常使用
|
||
|
||
```bash
|
||
# Cookie失效时重新登录
|
||
python main.py login
|
||
|
||
# 抓取数据
|
||
python main.py crawl
|
||
|
||
# 守护进程模式
|
||
python main.py daemon
|
||
```
|
||
|
||
### 原理
|
||
|
||
```
|
||
1. 浏览器登录 → 保存Cookie
|
||
2. 使用Cookie发送请求 → 无需验签参数
|
||
3. Cookie失效 → 重新登录
|
||
```
|
||
|
||
## 🔍 开始逆向分析
|
||
|
||
### 方法1: Python工具(最简单)
|
||
|
||
```bash
|
||
# 1. 安装依赖
|
||
pip install playwright
|
||
playwright install chromium
|
||
|
||
# 2. 运行工具
|
||
python tools/capture_params.py
|
||
|
||
# 3. 在浏览器中操作
|
||
# 工具会自动显示所有参数
|
||
```
|
||
|
||
### 方法2: 浏览器Hook(最专业)
|
||
|
||
```javascript
|
||
// 1. 打开网站 + F12
|
||
// 2. Console标签
|
||
// 3. 粘贴 tools/browser_hook.js 内容
|
||
// 4. 回车运行
|
||
// 5. 正常操作,查看捕获:
|
||
|
||
window._showCapturedRequests() // 查看所有请求
|
||
window._capturedRequests[0] // 第一个请求详情
|
||
window._exportCapturedRequests() // 导出JSON
|
||
```
|
||
|
||
### 方法3: Chrome DevTools(经典)
|
||
|
||
```
|
||
1. F12 → Network → Fetch/XHR
|
||
2. 勾选 "Preserve log"
|
||
3. 操作页面触发请求
|
||
4. 找到 getInstituteDarenData
|
||
5. 右键 → Copy → Copy as fetch
|
||
```
|
||
|
||
## 🔑 找到签名算法
|
||
|
||
### 搜索关键词
|
||
|
||
```javascript
|
||
// Sources标签 → Ctrl+Shift+F
|
||
|
||
搜索词:
|
||
├─ "a_bogus" → 签名参数名
|
||
├─ "sign" → 签名函数
|
||
├─ "_webmsdk" → 签名SDK
|
||
├─ "encrypt" → 加密函数
|
||
└─ "getInstituteDarenData" → API调用位置
|
||
```
|
||
|
||
### 设置断点
|
||
|
||
```
|
||
1. 找到可疑函数
|
||
2. 点击行号设置断点
|
||
3. 刷新页面
|
||
4. 单步调试 (F10/F11)
|
||
5. 查看 Call Stack
|
||
```
|
||
|
||
## 📝 实战代码片段
|
||
|
||
### 测试Cookie是否足够
|
||
|
||
```python
|
||
import requests
|
||
|
||
url = "https://buyin.jinritemai.com/api/authorTradeData/getInstituteDarenData"
|
||
cookies = {'sessionid': 'xxx', ...} # 从浏览器复制
|
||
|
||
# 只带Cookie,不带验签参数
|
||
params = {
|
||
'page': 1,
|
||
'pageSize': 20,
|
||
'start_time': '2025/11/29',
|
||
'end_time': '2025/11/29'
|
||
}
|
||
|
||
response = requests.get(url, params=params, cookies=cookies)
|
||
print(response.status_code) # 200 = Cookie足够
|
||
print(response.json())
|
||
```
|
||
|
||
### 使用Playwright方案
|
||
|
||
```python
|
||
from playwright.sync_api import sync_playwright
|
||
|
||
with sync_playwright() as p:
|
||
browser = p.chromium.launch(headless=False)
|
||
context = browser.new_context()
|
||
|
||
# 加载Cookie
|
||
context.add_cookies([
|
||
{'name': 'sessionid', 'value': 'xxx', 'domain': '.jinritemai.com', ...}
|
||
])
|
||
|
||
page = context.new_page()
|
||
|
||
# 监听API响应
|
||
def handle_response(response):
|
||
if 'getInstituteDarenData' in response.url:
|
||
print("捕获到数据:", response.json())
|
||
|
||
page.on('response', handle_response)
|
||
page.goto('https://buyin.jinritemai.com/...')
|
||
|
||
# 等待数据
|
||
page.wait_for_timeout(5000)
|
||
browser.close()
|
||
```
|
||
|
||
### 使用execjs执行JS
|
||
|
||
```python
|
||
import execjs
|
||
|
||
# 从浏览器提取的JS代码
|
||
js_code = """
|
||
function generateSign(url, params) {
|
||
var timestamp = Date.now();
|
||
var str = url + JSON.stringify(params) + timestamp;
|
||
// ... 实际的加密逻辑
|
||
return btoa(str); // Base64编码
|
||
}
|
||
"""
|
||
|
||
ctx = execjs.compile(js_code)
|
||
sign = ctx.call('generateSign', url, params)
|
||
print(f"a_bogus: {sign}")
|
||
```
|
||
|
||
## 🛠️ 调试技巧
|
||
|
||
### 查看全局变量
|
||
|
||
```javascript
|
||
// Console中执行
|
||
for (let key in window) {
|
||
if (key.includes('token') ||
|
||
key.includes('sign') ||
|
||
key.includes('fp')) {
|
||
console.log(key, typeof window[key]);
|
||
}
|
||
}
|
||
```
|
||
|
||
### Hook函数调用
|
||
|
||
```javascript
|
||
// 假设签名函数是 window._sign
|
||
const original = window._sign;
|
||
window._sign = function(...args) {
|
||
console.log('_sign被调用:', args);
|
||
const result = original.apply(this, args);
|
||
console.log('_sign返回:', result);
|
||
console.trace();
|
||
return result;
|
||
};
|
||
```
|
||
|
||
### 导出网络请求
|
||
|
||
```
|
||
1. Network标签
|
||
2. 右键请求列表
|
||
3. Save all as HAR
|
||
4. 使用文本编辑器查看
|
||
```
|
||
|
||
## 📚 相关文档
|
||
|
||
```
|
||
项目根目录/
|
||
├─ 如何破解验签.md ← 详细教程
|
||
├─ 逆向分析指南.md ← 完整指南
|
||
├─ tools/
|
||
│ ├─ README.md ← 工具说明
|
||
│ ├─ capture_params.py ← Python工具
|
||
│ └─ browser_hook.js ← JS Hook
|
||
└─ README.md ← 项目说明
|
||
```
|
||
|
||
## ⚡ 常用命令速查
|
||
|
||
```bash
|
||
# === 项目相关 ===
|
||
python main.py login # 登录获取Cookie
|
||
python main.py status # 查看Cookie状态
|
||
python main.py crawl # 抓取数据
|
||
python main.py daemon # 守护进程
|
||
|
||
# === 逆向工具 ===
|
||
python tools/capture_params.py # 捕获参数
|
||
python tools/capture_params.py <URL> <API> # 自定义
|
||
|
||
# === 依赖安装 ===
|
||
pip install -r requirements.txt # 安装Python依赖
|
||
playwright install chromium # 安装浏览器
|
||
```
|
||
|
||
## 💡 决策树
|
||
|
||
```
|
||
需要逆向验签吗?
|
||
│
|
||
├─ [是] Cookie频繁失效?
|
||
│ ├─ [否] → 继续用Cookie方案 ✅
|
||
│ └─ [是] → 需要高频访问?
|
||
│ ├─ [否] → 用Playwright方案 ✅
|
||
│ └─ [是] → 完全逆向 ⚠️
|
||
│
|
||
└─ [否] → 学习目的?
|
||
├─ [是] → 用tools工具练习 📚
|
||
└─ [否] → 继续用Cookie方案 ✅
|
||
```
|
||
|
||
## 🎓 学习路径
|
||
|
||
```
|
||
初级 → 中级 → 高级
|
||
|
||
1️⃣ 理解Cookie方案
|
||
└─ 运行项目,查看代码
|
||
|
||
2️⃣ 学会使用工具
|
||
├─ python tools/capture_params.py
|
||
└─ 浏览器运行 browser_hook.js
|
||
|
||
3️⃣ 掌握DevTools
|
||
├─ Network查看请求
|
||
├─ Sources设置断点
|
||
└─ Console调试JS
|
||
|
||
4️⃣ 理解加密算法
|
||
├─ MD5, SHA, Base64
|
||
├─ RC4, AES
|
||
└─ Canvas指纹
|
||
|
||
5️⃣ 实现签名算法
|
||
├─ 提取JS代码
|
||
├─ execjs执行
|
||
└─ Python实现
|
||
```
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
```
|
||
✅ DO
|
||
├─ 控制访问频率(1-3秒延迟)
|
||
├─ 遵守服务条款
|
||
├─ 仅用于学习
|
||
└─ 做好错误处理
|
||
|
||
❌ DON'T
|
||
├─ 高频访问(秒级)
|
||
├─ 商业牟利
|
||
├─ 分享账号
|
||
└─ 绕过安全机制
|
||
```
|
||
|
||
## 🆘 遇到问题
|
||
|
||
```
|
||
问题分类:
|
||
│
|
||
├─ Cookie失效
|
||
│ └─ python main.py login
|
||
│
|
||
├─ 请求被拒绝
|
||
│ ├─ 检查Cookie是否有效
|
||
│ ├─ 检查User-Agent
|
||
│ └─ 降低访问频率
|
||
│
|
||
├─ 验签失败
|
||
│ ├─ 确认是否需要验签参数
|
||
│ ├─ 使用工具捕获正确参数
|
||
│ └─ 对比浏览器请求差异
|
||
│
|
||
└─ 账号被封
|
||
└─ 更换账号,降低频率
|
||
```
|
||
|
||
## 📞 获取帮助
|
||
|
||
1. 阅读 `逆向分析指南.md`
|
||
2. 查看 `tools/README.md`
|
||
3. 运行示例代码测试
|
||
4. 使用工具分析实际请求
|
||
|
||
---
|
||
|
||
**最后建议:**
|
||
- 90%的情况Cookie方案够用 ✅
|
||
- 需要稳定性用Playwright ✅
|
||
- 完全逆向适合专业团队 ⚠️
|
||
|
||
祝您成功!🎉
|
||
|