京东联盟h5st(3.1)逆向分析

2024-02-26 14:20

本文主要是介绍京东联盟h5st(3.1)逆向分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:本文仅作学习交流,请遵守法律法规,不要恶意爬取网站。

网址:'aHR0cHM6Ly91bmlvbi5qZC5jb20vcHJvTWFuYWdlci9pbmRleA=='

h5st是京东系的反爬方式,即在接口中加上一个叫h5st的参数,h5st加密有不同的版本。本文提到的网站不是京东网站,是和京东有关联的一个网站,也有h5st参数,是3.1版本。

分析接口

要分析的是一个‘全部商品’接口,找到接口后先分析必要的参数。逐个分析可以发现必要的参数有headers中的origin和user-agent;cookies中的thor,以及params

很容易发现 headers和params中的functionId、appid、loginType是固定值,_是时间戳

需要参数来源的是cookies中的thor;params中的uuid、x-api-eid-token、h5st以及body中的searchUUID

再进一步分析会发现thor、uuid和x-api-eid-token都来源于cookies,分别对应thor、__jdu和3AB9D23F7A4B3CSS

没必要较劲他的什么时候产生的,哪个接口返回的,直接写死得了

所以我们重点要逆向的是h5st和searchUUID

逆向参数

h5st在源代码中位置倒是挺少,点进去打上断点跟代码,你会发现,等到了断点处,h5st的值已经产生了

怎么定位到具体的代码位置是在是个难点,唯有大胆猜测小心求证,逐步调试,观察作用域中参数值的变化

这里直接上结果:

searchUUID是一个随机字符串,每次切换页面时会变化,很好抠,也可以固定;

body先经过加密得到一个64位字符串,然后和其他的字符串拼接组成了h5st

body加密的位置:

body: K()(k()(i)).toString()

h5st加密的位置:

var D = this["__genSignP" + d(0, 1516, 1351)](z, c, a, r);

 至此我们可以再去看一下h5st的组成:

h5st: 20240226121601029;1733260139752348;586ae;tk03w04801dbb18nDfQXSjnTtkviyKrnh_npbbTrMXmrKSOfOfS6hSPJmKG_uyEocdAqBwHSNZYf4R8HHwT9MJBgpgyG;ac2846635dfb61c405b4ee623bccd274eb35866e3a3e9195013f2eeeb72f2db6;3.1;1708920961029;24c9ee85e67cf80746dd82817ecbeafc7a829b35c7f446a4c7d476cc9faa1d8834a93323ad7bce9bef1bba682b93d2e355076cc27b11bb228be53f32ed20565266eae147141141e0d154463e1733333213609f805a4de2ddf29a06541f6bb9892b80989b96d4724a0aaba834467cab40debef3f59396c2874c1a5d3ee361ffc6//  yyyyMMddhhmmssSSS格式的日期字符串
20240226121601029;
//  浏览器指纹  跟浏览器有关 可以是固定值
1733260139752348;
//  appID 固定值
586ae;
//  token 应该是某个接口的返回值  可以是固定值
tk03w04801dbb18nDfQXSjnTtkviyKrnh_npbbTrMXmrKSOfOfS6hSPJmKG_uyEocdAqBwHSNZYf4R8HHwT9MJBgpgyG;
//  加密字符串  跟body有关  需破解
ac2846635dfb61c405b4ee623bccd274eb35866e3a3e9195013f2eeeb72f2db6;
//  h5st版本号  固定值
3.1;
//  时间戳
1708920961029;
//  跟环境相关 可以是固定值
24c9ee85e67cf80746dd82817ecbeafc7a829b35c7f446a4c7d476cc9faa1d8834a93323ad7bce9bef1bba682b93d2e355076cc27b11bb228be53f32ed20565266eae147141141e0d154463e1733333213609f805a4de2ddf29a06541f6bb9892b80989b96d4724a0aaba834467cab40debef3f59396c2874c1a5d3ee361ffc6

所以接下来就重点抠出h5st中第5段字符串的加密即可

成果展示

const CryptoJS = require('crypto-js');
var wp;
window = global;var _ts = Date.now(),_fp = '1733260139752348',_appId = '586ae',_token = "tk03wb3c91c5518nXSL2egI9QuTKOLXLWBjx5lwKOpslUAXudyJSt0AmNRFyy4si5VCp4NpZB8wclFWOpK07zoso0J6C",_version = '3.1',_unknown = '24c9ee85e67cf80746dd82817ecbeafc7a829b35c7f446a4c7d476cc9faa1d8834a93323ad7bce9bef1bba682b93d2e355076cc27b11bb228be53f32ed20565266eae147141141e0d154463e1733333213609f805a4de2ddf29a06541f6bb9892b80989b96d4724a0aaba834467cab40debef3f59396c2874c1a5d3ee361ffc6'var _td = ts2format(_ts)!function (o) {"use strict";var e, n, t, a = {};function r(e) {var n = a[e];if (void 0 !== n)return n.exports;var t = a[e] = {id: e,loaded: !1,exports: {}};// console.log(e)return o[e].call(t.exports, t, t.exports, r),t.loaded = !0,t.exports}r.m = o,e = [],r.O = function (n, t, o, a) {if (!t) {var c = 1 / 0;for (u = 0; u < e.length; u++) {t = e[u][0],o = e[u][1],a = e[u][2];for (var i = !0, f = 0; f < t.length; f++)(!1 & a || c >= a) && Object.keys(r.O).every((function (e) {return r.O[e](t[f])})) ? t.splice(f--, 1) : (i = !1,a < c && (c = a));if (i) {e.splice(u--, 1);var d = o();void 0 !== d && (n = d)}}return n}a = a || 0;for (var u = e.length; u > 0 && e[u - 1][2] > a; u--)e[u] = e[u - 1];e[u] = [t, o, a]},r.n = function (e) {var n = e && e.__esModule ? function () {return e.default}: function () {return e};return r.d(n, {a: n}),n},r.d = function (e, n) {for (var t in n)r.o(n, t) && !r.o(e, t) && Object.defineProperty(e, t, {enumerable: !0,get: n[t]})},r.f = {},r.e = function (e) {return Promise.all(Object.keys(r.f).reduce((function (n, t) {return r.f[t](e, n),n}), []))},r.u = function (e) {return {34: "biservicefee",81: "promotion",378: "user",410: "marketActivities",621: "entire",685: "lineReport",869: "createShop",917: "agreement",929: "common-731babaf",973: "common-43dd7041",1131: "appMng",1276: "shopActPromotion",1288: "myApi",1621: "investmentEffect",1666: "planDetails",1806: "officalPromotion",1884: "taskDetail",1913: "jdauthentication",1970: "newWithdraw",1992: "cashDetail",2337: "withdraw",2412: "socialMediaMng",2479: "marketingCalendar",2481: "realTimeScreen",2527: "withdrawRecord",2690: "couponList",2795: "cashGiftCreate",2832: "taskSquare",2951: "RewardActivity",2970: "articlePromotion",2992: "myTask",3012: "subCommission",3386: "cashGiftDeposit",3513: "trafficMediaMng",3583: "webExtension",3712: "openplatform-9a53bcac",3756: "shopPromotion",3761: "openplatform-9a6b8f1e",3765: "skuAnalyse",3779: "active",3888: "external",3940: "cashCoupon",4163: "InterfaceManagement",4256: "channel",4565: "common-d91a9049",4738: "cpcMedia",4843: "openplatform-d91a9049",4962: "common-8912b8e4",5001: "groupList",5075: "planList",5142: "reverseInvestment",5177: "home",5313: "myStarEnlist2",5413: "recommendMng",5512: "accounting",5549: "jingPlanMng",5724: "common-69b0bd4f",5769: "appMedia",5847: "socialMediaExtension",5863: "projectDetail",6026: "InvestmentData",6103: "common-b4fa4e1a",6419: "batchMng",6596: "404",6653: "DataPromotion",6659: "common-4720890c",6682: "appExtension",6810: "common-c7713fe4",7012: "shopPromotionDetail",7066: "secretOrder",7253: "shopAnalyse",7468: "openOrder",7815: "chatExtension",7899: "custompromotion",7991: "webMng",8022: "cashGiftDepositResult",8273: "actAnalyse",8277: "cashGift",8300: "msg",8429: "helpcenter",8442: "moreProductList",8608: "channelPromotion",8722: "common-fb051ecb",8924: "initRevGroup",8983: "report",8989: "common-a07e9f05",9206: "trafficMediaExtension",9223: "initiate",9557: "couponPromotion",9621: "myInvoice",9664: "taskEffectData",9704: "batchDetail",9734: "myShop",9830: "darenBank",9847: "userTask",9851: "common-c0d952d5",9920: "operate",9940: "promotionSite",9974: "myStarEnlist"}[e] + "." + {34: "884dabbf",81: "516fbf65",378: "4fa7f455",410: "f3b3ce65",621: "779cbc2d",685: "635b41c3",869: "6e91e04e",917: "8931b075",929: "3c7249c4",973: "dd604fd9",1131: "5c758086",1276: "4afef4b0",1288: "efd9ca56",1621: "dd68ef97",1666: "15ddc024",1806: "2ce9aabc",1884: "26a69c37",1913: "7cf33bc8",1970: "2f4e7bbb",1992: "ede710f5",2337: "ed174f32",2412: "35ff0de8",2479: "a21c8c42",2481: "6fed6857",2527: "6a37ef3c",2690: "64ddf7cc",2795: "a674eb69",2832: "feecd3be",2951: "93b3e34d",2970: "0384070e",2992: "be5042ce",3012: "2347219c",3386: "1a1f7d84",3513: "c04a31fc",3583: "f5d3ef48",3712: "e2f73577",3756: "7a6444be",3761: "53e3439b",3765: "a4ec0efd",3779: "38223816",3888: "fce9007a",3940: "6e0a2517",4163: "f5764a34",4256: "d71746f3",4565: "38532a63",4738: "d5a92ea5",4843: "ac578919",4962: "46dd7b93",5001: "6ffabe1f",5075: "bf8fe0b0",5142: "f02f701e",5177: "95d0d33a",5313: "81217ce7",5413: "c7fd2e9a",5512: "9f7c1dc7",5549: "b90e6eb0",5724: "fae8a443",5769: "3026d89e",5847: "88f445a5",5863: "26a850a1",6026: "d554b6c8",6103: "9a594517",6419: "8a5d5b4f",6596: "43477835",6653: "e904d280",6659: "c79c71eb",6682: "9a980d14",6810: "767f177d",7012: "310763bf",7066: "0930edea",7253: "093b1d51",7468: "abc74f1b",7815: "7176c4b5",7899: "e3745e3e",7991: "bf2e88d9",8022: "0b3b8d2b",8273: "7597ef4f",8277: "4abc271d",8300: "386bd6f1",8429: "0a43b716",8442: "866be077",8608: "ce7516bf",8722: "d3db8be6",8924: "e678bf90",8983: "0eb1ef70",8989: "ba78e6ab",9206: "178b940f",9223: "bfda0e2b",9557: "a25c4ce7",9621: "56164042",9664: "fa4795b0",9704: "5721dc0a",9734: "74dcc744",9830: "de870bad",9847: "2b8f9834",9851: "cf04e91b",9920: "f2cde753",9940: "eb35820c",9974: "a83b6246"}[e] + ".js"},r.g = function () {if ("object" == typeof globalThis)return globalThis;try {return this || new Function("return this")()} catch (e) {if ("object" == typeof window)return window}}(),r.o = function (e, n) {return Object.prototype.hasOwnProperty.call(e, n)},n = {},t = "JDUnion:",r.l = function (e, o, a, c) {if (n[e])n[e].push(o);else {var i, f;if (void 0 !== a)for (var d = document.getElementsByTagName("script"), u = 0; u < d.length; u++) {var b = d[u];if (b.getAttribute("src") == e || b.getAttribute("data-webpack") == t + a) {i = b;break}}i || (f = !0,(i = document.createElement("script")).charset = "utf-8",i.timeout = 120,r.nc && i.setAttribute("nonce", r.nc),i.setAttribute("data-webpack", t + a),i.src = e),n[e] = [o];var s = function (t, o) {i.onerror = i.onload = null,clearTimeout(l);var a = n[e];if (delete n[e],i.parentNode && i.parentNode.removeChild(i),a && a.forEach((function (e) {return e(o)})),t)return t(o)}, l = setTimeout(s.bind(null, void 0, {type: "timeout",target: i}), 12e4);i.onerror = s.bind(null, i.onerror),i.onload = s.bind(null, i.onload),f && document.head.appendChild(i)}},r.r = function (e) {"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {value: "Module"}),Object.defineProperty(e, "__esModule", {value: !0})},r.nmd = function (e) {return e.paths = [],e.children || (e.children = []),e},r.p = "//storage.360buyimg.com/pubfree-bucket/unionpc/b7e5298d5/",function () {var e = {6700: 0};r.f.j = function (n, t) {var o = r.o(e, n) ? e[n] : void 0;if (0 !== o)if (o)t.push(o[2]);else if (6700 != n) {var a = new Promise((function (t, a) {o = e[n] = [t, a]}));t.push(o[2] = a);var c = r.p + r.u(n), i = new Error;r.l(c, (function (t) {if (r.o(e, n) && (0 !== (o = e[n]) && (e[n] = void 0),o)) {var a = t && ("load" === t.type ? "missing" : t.type), c = t && t.target && t.target.src;i.message = "Loading chunk " + n + " failed.\n(" + a + ": " + c + ")",i.name = "ChunkLoadError",i.type = a,i.request = c,o[1](i)}}), "chunk-" + n, n)} elsee[n] = 0},r.O.j = function (n) {return 0 === e[n]};var n = function (n, t) {var o, a, c = t[0], i = t[1], f = t[2], d = 0;if (c.some((function (n) {return 0 !== e[n]}))) {for (o in i)r.o(i, o) && (r.m[o] = i[o]);if (f)var u = f(r)}for (n && n(t); d < c.length; d++)a = c[d],r.o(e, a) && e[a] && e[a][0](),e[a] = 0;return r.O(u)}, t = window.webpackChunkJDUnion = window.webpackChunkJDUnion || [];t.forEach(n.bind(null, 0)),t.push = n.bind(null, t.push.bind(t))}(),r.nc = void 0wp = r
}({78249: function (t, n, e) {var i;t.exports = (i = i || function (t, n) {var i;if ("undefined" != typeof window && window.crypto && (i = window.crypto),"undefined" != typeof self && self.crypto && (i = self.crypto),"undefined" != typeof globalThis && globalThis.crypto && (i = globalThis.crypto),!i && "undefined" != typeof window && window.msCrypto && (i = window.msCrypto),!i && void 0 !== e.g && e.g.crypto && (i = e.g.crypto),!i)try {i = e(42480)} catch (t) {}var r = function () {if (i) {if ("function" == typeof i.getRandomValues)try {return i.getRandomValues(new Uint32Array(1))[0]} catch (t) {}if ("function" == typeof i.randomBytes)try {return i.randomBytes(4).readInt32LE()} catch (t) {}}throw new Error("Native crypto module could not be used to get secure random number.")}, s = Object.create || function () {function t() {}return function (n) {var e;return t.prototype = n,e = new t,t.prototype = null,e}}(), o = {}, u = o.lib = {}, f = u.Base = {extend: function (t) {var n = s(this);return t && n.mixIn(t),n.hasOwnProperty("init") && this.init !== n.init || (n.init = function () {n.$super.init.apply(this, arguments)}),n.init.prototype = n,n.$super = this,n},create: function () {var t = this.extend();return t.init.apply(t, arguments),t},init: function () {},mixIn: function (t) {for (var n in t)t.hasOwnProperty(n) && (this[n] = t[n]);t.hasOwnProperty("toString") && (this.toString = t.toString)},clone: function () {return this.init.prototype.extend(this)}}, h = u.WordArray = f.extend({init: function (t, n) {t = this.words = t || [],this.sigBytes = null != n ? n : 4 * t.length},toString: function (t) {return (t || l).stringify(this)},concat: function (t) {var n = this.words, e = t.words, i = this.sigBytes, r = t.sigBytes;if (this.clamp(),i % 4)for (var s = 0; s < r; s++) {var o = e[s >>> 2] >>> 24 - s % 4 * 8 & 255;n[i + s >>> 2] |= o << 24 - (i + s) % 4 * 8}elsefor (var u = 0; u < r; u += 4)n[i + u >>> 2] = e[u >>> 2];return this.sigBytes += r,this},clamp: function () {var n = this.words, e = this.sigBytes;n[e >>> 2] &= 4294967295 << 32 - e % 4 * 8,n.length = t.ceil(e / 4)},clone: function () {var t = f.clone.call(this);return t.words = this.words.slice(0),t},random: function (t) {for (var n = [], e = 0; e < t; e += 4)n.push(r());return new h.init(n, t)}}), c = o.enc = {}, l = c.Hex = {stringify: function (t) {for (var n = t.words, e = t.sigBytes, i = [], r = 0; r < e; r++) {var s = n[r >>> 2] >>> 24 - r % 4 * 8 & 255;i.push((s >>> 4).toString(16)),i.push((15 & s).toString(16))}return i.join("")},parse: function (t) {for (var n = t.length, e = [], i = 0; i < n; i += 2)e[i >>> 3] |= parseInt(t.substr(i, 2), 16) << 24 - i % 8 * 4;return new h.init(e, n / 2)}}, a = c.Latin1 = {stringify: function (t) {for (var n = t.words, e = t.sigBytes, i = [], r = 0; r < e; r++) {var s = n[r >>> 2] >>> 24 - r % 4 * 8 & 255;i.push(String.fromCharCode(s))}return i.join("")},parse: function (t) {for (var n = t.length, e = [], i = 0; i < n; i++)e[i >>> 2] |= (255 & t.charCodeAt(i)) << 24 - i % 4 * 8;return new h.init(e, n)}}, d = c.Utf8 = {stringify: function (t) {try {return decodeURIComponent(escape(a.stringify(t)))} catch (t) {throw new Error("Malformed UTF-8 data")}},parse: function (t) {return a.parse(unescape(encodeURIComponent(t)))}}, p = u.BufferedBlockAlgorithm = f.extend({reset: function () {this._data = new h.init,this._nDataBytes = 0},_append: function (t) {"string" == typeof t && (t = d.parse(t)),this._data.concat(t),this._nDataBytes += t.sigBytes},_process: function (n) {var e, i = this._data, r = i.words, s = i.sigBytes, o = this.blockSize, u = s / (4 * o),f = (u = n ? t.ceil(u) : t.max((0 | u) - this._minBufferSize, 0)) * o, c = t.min(4 * f, s);if (f) {for (var l = 0; l < f; l += o)this._doProcessBlock(r, l);e = r.splice(0, f),i.sigBytes -= c}return new h.init(e, c)},clone: function () {var t = f.clone.call(this);return t._data = this._data.clone(),t},_minBufferSize: 0}), g = (u.Hasher = p.extend({cfg: f.extend(),init: function (t) {this.cfg = this.cfg.extend(t),this.reset()},reset: function () {p.reset.call(this),this._doReset()},update: function (t) {return this._append(t),this._process(),this},finalize: function (t) {return t && this._append(t),this._doFinalize()},blockSize: 16,_createHelper: function (t) {return function (n, e) {return new t.init(e).finalize(n)}},_createHmacHelper: function (t) {return function (n, e) {return new g.HMAC.init(t, e).finalize(n)}}}),o.algo = {});return o}(Math),i)},52153: function (t, n, e) {var i;t.exports = (i = e(78249),function (t) {var n = i, e = n.lib, r = e.WordArray, s = e.Hasher, o = n.algo, u = [], f = [];!function () {function n(n) {for (var e = t.sqrt(n), i = 2; i <= e; i++)if (!(n % i))return !1;return !0}function e(t) {return 4294967296 * (t - (0 | t)) | 0}for (var i = 2, r = 0; r < 64;)n(i) && (r < 8 && (u[r] = e(t.pow(i, .5))),f[r] = e(t.pow(i, 1 / 3)),r++),i++}();var h = [], c = o.SHA256 = s.extend({_doReset: function () {this._hash = new r.init(u.slice(0))},_doProcessBlock: function (t, n) {for (var e = this._hash.words, i = e[0], r = e[1], s = e[2], o = e[3], u = e[4], c = e[5], l = e[6], a = e[7], d = 0; d < 64; d++) {if (d < 16)h[d] = 0 | t[n + d];else {var p = h[d - 15], g = (p << 25 | p >>> 7) ^ (p << 14 | p >>> 18) ^ p >>> 3, m = h[d - 2], y = (m << 15 | m >>> 17) ^ (m << 13 | m >>> 19) ^ m >>> 10;h[d] = g + h[d - 7] + y + h[d - 16]}var v = i & r ^ i & s ^ r & s, w = (i << 30 | i >>> 2) ^ (i << 19 | i >>> 13) ^ (i << 10 | i >>> 22),$ = a + ((u << 26 | u >>> 6) ^ (u << 21 | u >>> 11) ^ (u << 7 | u >>> 25)) + (u & c ^ ~u & l) + f[d] + h[d];a = l,l = c,c = u,u = o + $ | 0,o = s,s = r,r = i,i = $ + (w + v) | 0}e[0] = e[0] + i | 0,e[1] = e[1] + r | 0,e[2] = e[2] + s | 0,e[3] = e[3] + o | 0,e[4] = e[4] + u | 0,e[5] = e[5] + c | 0,e[6] = e[6] + l | 0,e[7] = e[7] + a | 0},_doFinalize: function () {var n = this._data, e = n.words, i = 8 * this._nDataBytes, r = 8 * n.sigBytes;return e[r >>> 5] |= 128 << 24 - r % 32,e[14 + (r + 64 >>> 9 << 4)] = t.floor(i / 4294967296),e[15 + (r + 64 >>> 9 << 4)] = i,n.sigBytes = 4 * e.length,this._process(),this._hash},clone: function () {var t = s.clone.call(this);return t._hash = this._hash.clone(),t}});n.SHA256 = s._createHelper(c),n.HmacSHA256 = s._createHmacHelper(c)}(Math),i.SHA256)},
});function ts2format(ts) {const date = new Date(ts);const y = date.getFullYear(),m = String(date.getMonth() + 1).padStart(2, '0'),d = String(date.getDate()).padStart(2, '0'),h = String(date.getHours()).padStart(2, '0'),mi = String(date.getMinutes()).padStart(2, '0'),s = String(date.getSeconds()).padStart(2, '0'),ms = String(date.getMilliseconds()).padStart(3, '0')return `${y}${m}${d}${h}${mi}${s}${ms}`;
}function body(obj) {const F = wp(52153),K = wp.n(F),args_str = JSON.stringify(obj)return K()(args_str).toString()
}function secret_str() {var rd = '4LP439v0MSSD';var str = "".concat(_token).concat(_fp).concat(_td).concat(_appId).concat(rd);return CryptoJS.SHA256(str).toString(CryptoJS.enc.Hex);
}function encrypt_data(r, i) {function convertToQueryString(data) {return data.map(item => `${item.key}:${item.value}`).join('&');}const c = convertToQueryString(i)return CryptoJS.HmacSHA256(c, r).toString(CryptoJS.enc.Hex)
}function h5st(p) {const b = body(p)const jsonArray = [{"key": "appid","value": "unionpc"},{"key": "body","value": b},{"key": "functionId","value": "unionSearch"}]const secret = secret_str()const _encrypt = encrypt_data(secret, jsonArray)const dt = "".concat(_td),fp = "".concat(_fp),appId = "".concat(_appId),tk = "".concat(_token),encrypt = "".concat(_encrypt),version = "".concat(_version),ts = "".concat(_ts),unknown = "".concat(_unknown)return [dt, fp, appId, tk, encrypt, version, ts, unknown].join(";")
}e = {"funName": "search","version": "v3","source": 20310,"param": {"pageNo": 2,"pageSize": 60,"searchUUID": "e7fb274ce31247e689982c7375d29f5e","bonusIds": null,"category1": null,"category2": null,"category3": null,"deliveryType": null,"wlRate": null,"maxWlRate": null,"fromPrice": null,"toPrice": null,"hasCoupon": null,"isHot": null,"isNeedPreSale": null,"isPinGou": null,"isZY": null,"isCare": null,"lock": null,"orientationFlag": null,"sort": null,"sortName": null,"keyWord": "","searchType": "st3","keywordType": "kt0"},"clientPageId": "jingfen_pc"
}
hs = h5st(e)
console.log("h5st:", hs);

import json
import requests
import execjsthor = ''
_jdu = ''
_3AB9D23F7A4B3CSS = ''url = "https://api.m.jd.com/api"
headers = {"Accept": "application/json, text/plain, */*","origin": "https://union.jd.com","Referer": "https://union.jd.com/","X-Referer-Page": "https://union.jd.com/proManager/index","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
}
cookies = {"thor": thor}class UnionJD:def __init__(self):self.js_code = execjs.compile(open('unionJD.js', 'r', encoding='utf-8').read())def get_params(self, page):params = {"functionId": "unionSearch","appid": "unionpc","loginType": "3","uuid": _jdu,"x-api-eid-token": _3AB9D23F7A4B3CSS}body = {"funName": "search","version": "v3","source": 20310,"param": {"pageNo": page,"pageSize": 60,"searchUUID": "e47cfeb25c054a5886ca6f63449b0093","bonusIds": None,"category1": None,"category2": None,"category3": None,"deliveryType": None,"wlRate": None,"maxWlRate": None,"fromPrice": None,"toPrice": None,"hasCoupon": None,"isHot": None,"isNeedPreSale": None,"isPinGou": None,"isZY": None,"isCare": None,"lock": None,"orientationFlag": None,"sort": None,"sortName": None,"keyWord": "","searchType": "st3","keywordType": "kt0"},"clientPageId": "jingfen_pc"}h5st = self.js_code.call('h5st', body)ts = h5st.split(';')[6]params['_'] = tsparams['h5st'] = h5stparams['body'] = json.dumps(body)return paramsdef request_data(self, page):params = self.get_params(page)response = requests.get(url, headers=headers, cookies=cookies, params=params)return responseif __name__ == '__main__':u = UnionJD()p = u.request_data(1)print(p.text)print(p.status_code)

本文重点是h5st的逆向,其他参数都使用的固定值,仅供参考;

 另外cookies值需要登陆后手动填写,接口能正常获取到相应,但有时会403,尤其是访问频率快时,可能是网站有些校验,有需要的可以再深入研究

这篇关于京东联盟h5st(3.1)逆向分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/749154

相关文章

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC,即客户之声,是一种通过收集和分析客户反馈、需求和期望,来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下,VOC不仅能够帮助企业了解客户的真实需求,还能为企业提供宝贵的竞争情报,助力企业在竞争中占据有利地位。 那么,企业该如何通过VOC(客户之声)做好竞争分析呢?深圳天行健企业管理咨询公司解析如下: 首先,要建立完善的VOC收集机制。这包括通过线上渠道(如社交媒体、官网留言

逆向学习汇编篇:内存管理与寻址方式

本节课在线学习视频(网盘地址,保存后即可免费观看): ​​https://pan.quark.cn/s/3ceeb9ae6d98​​ 在汇编语言的世界中,内存管理和寻址方式是构建程序的基础。理解这些概念不仅对于编写高效的汇编代码至关重要,也是进行逆向工程分析的关键技能。本文将深入探讨内存管理的基本原则和多种寻址方式,并通过代码案例来展示它们的实际应用。 1. 内存管理 内存管理涉及如何分配

打包体积分析和优化

webpack分析工具:webpack-bundle-analyzer 1. 通过<script src="./vue.js"></script>方式引入vue、vuex、vue-router等包(CDN) // webpack.config.jsif(process.env.NODE_ENV==='production') {module.exports = {devtool: 'none

Java中的大数据处理与分析架构

Java中的大数据处理与分析架构 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来讨论Java中的大数据处理与分析架构。随着大数据时代的到来,海量数据的存储、处理和分析变得至关重要。Java作为一门广泛使用的编程语言,在大数据领域有着广泛的应用。本文将介绍Java在大数据处理和分析中的关键技术和架构设计。 大数据处理与

段,页,段页,三种内存(RAM)管理机制分析

段,页,段页         是为实现虚拟内存而产生的技术。直接使用物理内存弊端:地址空间不隔离,内存使用效率低。 段 段:就是按照二进制文件的格式,在内存给进程分段(包括堆栈、数据段、代码段)。通过段寄存器中的段表来进行虚拟地址和物理地址的转换。 段实现的虚拟地址 = 段号+offset 物理地址:被分为很多个有编号的段,每个进程的虚拟地址都有段号,这样可以实现虚实地址之间的转换。其实所谓的地

mediasoup 源码分析 (八)分析PlainTransport

mediasoup 源码分析 (六)分析PlainTransport 一、接收裸RTP流二、mediasoup 中udp建立过程 tips 一、接收裸RTP流 PlainTransport 可以接收裸RTP流,也可以接收AES加密的RTP流。源码中提供了一个通过ffmpeg发送裸RTP流到mediasoup的脚本,具体地址为:mediasoup-demo/broadcaste

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D

线程池ThreadPoolExecutor类源码分析

Java并发编程:线程池的使用   在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:   如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。   那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

ConcurrentHashMap之源码分析

集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅