zl程序教程

您现在的位置是:首页 >  其他

当前栏目

巨量星图sign

2023-03-15 22:03:17 时间

本篇文章分析巨量星图的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代码:

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);

代码还原

# -*- 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=%7B%22first_category_id%22:%22100%22,%22second_category_id%22:%2210000%22%7D&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)