某度旋转验证码v2的加密算法更新后,对于爬虫挑战带来了新的难度。本文将详细介绍如何通过抓包分析和逆向工程的方式,分析出验证码加密算法,并用代码实现整个过程。
抓包分析:
首先,我们需要抓包分析验证码请求和响应,以便了解加密算法的实现细节。在抓包过程中,我们可以观察到验证码请求和响应中的参数,以及它们的关系和变化。
发起验证码初始化请求:
const ver = 1;
const timestamp = Date.now();
const referer = "https://example.com";
const ak = "your_ak_value";
const initParams = {
ver: ver,
_: timestamp,
refer: referer,
ak: ak
};
// 发起初始化请求
const initResponse = await makeInitRequest(initParams);
获取验证码初始化响应参数:
javascript
Copy code
const as = initResponse.as;
const tk = initResponse.tk;
发起验证码样式请求:
const styleParams = {
tk: tk,
_: timestamp,
otherParams: "other values"
};
// 发起样式请求
const styleResponse = await makeStyleRequest(styleParams);
获取验证码样式响应参数:
const path = styleResponse.path;
const backstr = styleResponse.backstr;
发起验证码提交请求:
const submitParams = {
tk: tk,
as: as,
fs: encryptedFs,
_: timestamp,
url: "https://submitted-url.com"
};
// 发起提交请求
const submitResponse = await makeSubmitRequest(submitParams);
逆向分析:
通过对抓包过程的分析,我们可以了解到验证码请求中的加密参数fs的生成方式,进而进行逆向分析。
构造第一个fs参数:
const common_en = JSON.stringify({ path: path, backstr: backstr });
const firstFs = encrypt(common_en, secondHandle);
构造第二个fs参数:
javascript
Copy code
const finalFs = encrypt(JSON.stringify({ common_en: firstFs, backstr: backstr }), { key: newKey, as: as, method: "aes-ecb" });
加密函数实现:
function encrypt(data, params) {
let encryptedData;
switch (params.method) {
case "aes-ecb":
encryptedData = AES.encrypt(data, params.key).toString();
break;
// Add other encryption methods here
default:
throw new Error("Unsupported encryption method");
}
return encryptedData;
}
计算密钥值:
function getNewKey(as) {
// Calculate key based on 'as'
// Example implementation
const key = CryptoJS.MD5(as + "appsapi2").toString().slice(0, 16);
return key;
}
AES加密模块初始化:
const AES = {
encrypt: (data, key) => CryptoJS.AES.encrypt(data, key).toString(),
// Add other AES encryption methods here
};
如果上述代码遇到问题或已更新无法使用等情况可以联系Q:1436423940或直接访问www.ttocr.com测试对接(免费得哈)