本篇文章分析巨量星图的sign值生成。
案例地址:https://www.xingtu.cn/visitor/creative/market/service
文章目录
- 接口分析
- 参数定位
- 加密追踪
- 代码还原
接口分析
只有一个加密参数sign
参数定位
ctrl F 全局搜索关键词 sign,在chunk-vendors文件中出现了很多检索内容
进来简单查找了一下,很快就看到一个比较像的。打上断点
触发请求,可以看到此处就是sign的生成位置。
加密追踪
对 A(Object(r[“a”])(Object(r[“a”])({}, n), l), s, o) 这串代码进行分析。最简单的查看方法就是断点后在控制台打印。
Object(r[“a”]) 是 function o(e){}
(Object(r[“a”])({}, n), l) 等于 {“service_method”:“SearchSpuVideoCase”,“service_name”: “search.AdStarSearch”};
s = [‘keyword’, ‘filters’, ‘order_by’, ‘sort_type’, ‘page’, ‘limit’] o = true
主要的function A :
u = 请求链接的参数组合
y()
追了一下发现是一个md5的实现
部分Js代码:
代码语言:javascript复制function A(e, t, n) {
var r = null != t ? t : {}
, i = r.include
, o = r.enforceWithKeys
, a = void 0 === o ? [] : o
, s = Object.keys(e);
if (n && i) {
var l = i.concat(["service_name", "service_method", "sign_strict"]);
s = s.filter((function(e) {
return l.includes(e)
}
))
}
var u = s.sort().map((function(t) {
var n = e[t];
return function(e) {
return null == e
}(n) ? "" : t (!a.includes(t) && function(e) {
return ["string", "number"].includes('string')
}(n) ? n : t)
}
)).join("");
console.log(u "e39539b8836fb99e1538974d3ac1fe98")
return u "e39539b8836fb99e1538974d3ac1fe98";
}
var item = {
"service_method":"SearchSpuVideoCase",
"service_name": "search.AdStarSearch"
};
function o(e) {
for (var t = 1; t < arguments.length; t ) {
var n = null != arguments[t] ? arguments[t] : {};
t % 2 ? i(Object(n), !0).forEach((function(t) {
Object(r["a"])(e, t, n[t])
}
)) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : i(Object(n)).forEach((function(t) {
Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t))
}
))
}
return e
}
A(o(item), ['keyword', 'filters', 'order_by', 'sort_type', 'page', 'limit'], true);
代码还原
代码语言:javascript复制# -*- coding: utf-8 -*-
import requests
import hashlib
server_name = 'search.AdStarSearch'
service_method = 'SearchSpuVideoCase'
sort_type = '1'
limit = '30'
url = f'https://www.xingtu.cn/star_tools/api/gateway/handler_get/?keyword=&order_by=score&sort_type=1&page=1&limit=30&filters={"first_category_id":"100","second_category_id":"10000"}&service_name={server_name}&service_method={service_method}&sign_strict=1&sign='
string = f"filtersfilterskeywordlimit{limit}order_byscorepage1service_method{service_method}service_name{server_name}sign_strict1sort_type{sort_type}e39539b8836fb99e1538974d3ac1fe98"
m = hashlib.md5()
m.update(string.encode())
sign = m.hexdigest()
print(requests.get(url=url sign).text)