From 03802b01759ca1a3058453d9d913ba65b00d1a84 Mon Sep 17 00:00:00 2001 From: liudongqi Date: Thu, 26 Sep 2024 19:06:42 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/service/static/fp/fp-crypt.js | 130 ++++++++++----------------- test/fp/chunk-npjg4qgmmrfrjl3r.js | 29 +++--- test/fp/chunk-vendors.5dea4a66.js | 3 +- test/fp/invoice-business.html | 64 ++++++------- test/fp/test_ueryFpjcxx.js | 30 +++---- 5 files changed, 109 insertions(+), 147 deletions(-) diff --git a/routes/service/static/fp/fp-crypt.js b/routes/service/static/fp/fp-crypt.js index 19d977b..faf5816 100644 --- a/routes/service/static/fp/fp-crypt.js +++ b/routes/service/static/fp/fp-crypt.js @@ -8,11 +8,11 @@ class FpCrypt { publicKey: "", tokenKey: "" }; - constructor(cookies) { + constructor(cookies, publicKey) { this.cookie = cookies - // if (publicKey) { - // this.publicKey = publicKey - // } + if (publicKey) { + this.publicKey = publicKey + } } /** @@ -30,7 +30,7 @@ class FpCrypt { s = t; l = this.Re(); // f = l['publicKey']; - // d = l['tokenKey']; + d = l['tokenKey']; // h = l['urlType']; p = l['urlYzm']; s = this.He(s, d, 0, e) @@ -40,52 +40,6 @@ class FpCrypt { } logger(`处理url后缀${t} 完成返回${s}`) return s; - // while (1) { - // switch (a[c++]) { - // case "0": - // // if (h && ("" !== h) && "1" !== h && (1 !== h)) - // // ("2" === h) && (s = function (t, e, r) { - // // var a = t; - // // if (t['indexOf']('urlyzm=') > -1) return t; - // // if (t = this.He(t), r) { - // // var c = t["indexOf"]("?"), u = t['substring']((c + 1)), s = u['indexOf']('ruuid='), - // // l = u['substring'](s + 6); - // // l = l['substring'](0, l['indexOf']("&")); - // // var f = t['substring'](0, c), - // // d = t["indexOf"]("?") > -1 ? t['substring'](0, t['indexOf']("?")) : t; - // // t = Ye(u, d); - // // t = ""["concat"](f, '?urlyzm=')['concat'](encodeURIComponent(t), '&ruuid=')['concat'](l) - // // } - // // return t - // // }(s, 0, f)); - // // else - // s = this.He(s, d, 0, e) - // if (p) { - // var u = (new Date)['valueOf'](); - // s += '&urls='['concat'](u) - // } - // logger(`处理url后缀${t} 完成返回${s}`) - // return s; - // case "1": - // if (!t) return t; - // continue; - // case "2": - // s = t; - // l = this.Re(); - // f = l['publicKey']; - // d = l['tokenKey']; - // h = l['urlType']; - // p = l['urlYzm']; - // continue; - // case "3": - // logger(`处理url后缀${t} 完成返回${s}`) - // return s; - // case "4": - // if (t['indexOf']('cssSecurity/v1/getPublicKey') > -1) return t; - // continue - // } - // break - // } } /** @@ -111,41 +65,31 @@ class FpCrypt { s = this.Ke(s); var l, f = (new Date)['valueOf'](), d = (this.qe()["num"] % 2) === 0 ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; + d = ((this.qe()['num'] % 2) === 0) ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; if ((d >= 0) && (d <= 50)) { l = this.Qs(f) + } else if ((d >= 51) && d <= 100) { + l = this.Qt(f, e) } - // (d >= 0) && (d <= 50) ? l = this.Qs(f) : (d >= 51) && d <= 100 && (l = function (t, e) { - // // TODO: 偷懒 - // return null; - // // var n = c; - // // if ('PwUOp' === 'PwUOp') { - // // for (var r = this.qe(), o = r[n(3123)], s = r[n(2049)], l = i[n(5528)](i[n(2694)](a, ""["concat"](t)[n(619)](""))["join"](""), a(""["concat"](s)[n(619)](""))[n(739)]("")), f = "", d = 0; i[n(3114)](d, l[n(6147)]); d += o) { - // // var h = l[n(6370)](d, d + o); - // // f += i[n(2694)](a, h[n(619)](""))[n(739)]("") - // // } - // // var p = "", v = e; - // // if (e) for (var b = 0; i[n(3114)](b, v[n(6147)]); b += o) { - // // var g = v["substring"](b, i[n(5528)](b, o)); - // // p += a(g["split"](""))["join"]("") - // // } else p = i[n(5434)]; - // // return p = i[n(2694)](a, ""['concat'](p)[n(619)](""))[n(739)](""), i[n(5528)](i[n(5528)](i[n(5528)](f[n(6370)](0, 5), p[n(6370)](5, 10)), f[n(6370)](15, 20)), p["substring"](20, 25)) - // // } - // // for (var m = _0x34c263[_0x383cd9], y = u[n(5694)](_0x30e1f9, 1); y < _0x181e94["length"] && u[n(4847)](m, _0x4913da);) m *= _0x12c36b[y++]; - // // for (m = _0x469f9b[n(1024)](m); u["tKkZS"](_0x4bdcfe, y);) if (u[n(5152)](u["wSsxC"](m, _0x4de108[_0x8b459++]), 0)) return !1 - // }(f, e)); var h = s['indexOf']("?") === (s["length"] - 1) ? "" : s['indexOf']("?") > -1 ? "&" : "?", p = s += ""['concat'](h, "ruuid=")['concat'](f); - // if (o) { - // var v = p['split']("?")['splice'](1); - // for (var b in v['map']((function (t) { - // return t["split"]("=")[0] - // })), o) if (!v["includes"](""["concat"](b))) if (i[c(2228)](i[c(315)], c(6715))) _0x2cc2bd("crypto"); else { - // var g = b["charAt"](0)['toUpperCase'](); - // b['length'] > 1 && (g += b['slice'](1)); - // var m = o[b]; - // i[c(2228)](void 0, m) && (p += "&"["concat"](g, "=")["concat"](m)) - // } - // } + if (o) { + var v = p['split']("?")['splice'](1); + for (var b in v['map'](function (t) { + return t["split"]("=")[0] + }), o) { + if (!v["includes"](""["concat"](b))) { + if (('NenAk' !== 'NenAk')) { + // _0x2cc2bd("crypto"); + } else { + var g = b["charAt"](0)['toUpperCase'](); + b['length'] > 1 && (g += b['slice'](1)); + var m = o[b]; + (void 0 !== m) && (p += "&"["concat"](g, "=")["concat"](m)) + } + } + } + } var y = ""["concat"](l, "+")["concat"](p), x = this.he(y); return s + ""["concat"](s["indexOf"]("?") ? "&" : "?", "urlyzm=")["concat"](encodeURIComponent(x)) } @@ -165,6 +109,30 @@ class FpCrypt { return (((l["substring"](0, 5) + l['substring'](15, 20)) + l['substring'](5, 10)) + l['substring'](20, 25)) }; + Qt(t, e) { + var r = this.qe(), + o = r['num'], + s = r['tokenVal'], + l = (this.a(""["concat"](t)['split'](""))["join"]("") + this.a(""["concat"](s)['split'](""))["join"]("")), + f = ""; + for (var d = 0; d < l['length']; d += o) { + var h = l['substring'](d, d + o); + f += this.a(h['split'](""))['join']("") + } + var p = "", + v = e; + if (e) { + for (var b = 0; (b < v['length']); b += o) { + var g = v["substring"](b, b + o); + p += this.a(g["split"](""))["join"]("") + } + } else { + p = 'wk123med876dfesd57m72hnb3yfm98fs'; + } + p = this.a(""['concat'](p)['split'](""))['join'](""); + return (((f['substring'](0, 5) + p['substring'](5, 10)) + f['substring'](15, 20)) + p["substring"](20, 25)) + } + Ye(t, e) { var o = this.ke(32), a = "".concat(o).concat(t), c = this.Ue("", e); return this.de(a, c) diff --git a/test/fp/chunk-npjg4qgmmrfrjl3r.js b/test/fp/chunk-npjg4qgmmrfrjl3r.js index a244386..7c3ff07 100644 --- a/test/fp/chunk-npjg4qgmmrfrjl3r.js +++ b/test/fp/chunk-npjg4qgmmrfrjl3r.js @@ -1,5 +1,5 @@ // fp底层js -logger = console.info; +logger = console.log; //去除解密函数 // function _0xf207() { @@ -5160,19 +5160,12 @@ logger = console.info; }) return _0x534587; } - this["$_y_ds"] = ""; this["$byno"] = () => { - let _y_ds = ""; - let _0x475ce7 = document["querySelector"]("head meta[name='_y_ds']"); - if(window.$_y_ds != null && window.$_y_ds !== ""){ - _y_ds = window.$_y_ds; - logger('1.获取传入数据 _y_ds', _y_ds) - } else if (_0x475ce7) { - _y_ds = _0x475ce7["content"]; - logger('1.获取meta标签 _y_ds', _y_ds) - } - if (_y_ds){ - var _0x4a87cf = _0x2c29b1(_y_ds, window); + const _0x475ce7 = document["querySelector"]("head meta[name='_y_ds']"); + if (_0x475ce7) { + var _0x13f88b = _0x475ce7["content"]; + // logger('1.获取meta标签 _y_ds', _0x13f88b) + var _0x4a87cf = _0x2c29b1(_0x13f88b, window); // logger('2.获取密钥', _0x4a87cf) if (_0x4a87cf == null) { return; @@ -5180,14 +5173,14 @@ logger = console.info; _0x4a87cf["run"](); _0x475ce7["content"] = ''; _0x475ce7["parentNode"]["removeChild"](_0x475ce7); - // const _0x1031c9 = document["querySelector"]("head script[id='_y_ds_s']"); - // _0x1031c9 && _0x1031c9["parentNode"]["removeChild"](_0x1031c9); + const _0x1031c9 = document["querySelector"]("head script[id='_y_ds_s']"); + _0x1031c9 && _0x1031c9["parentNode"]["removeChild"](_0x1031c9); } const _0x1c8f5a = document["querySelector"]("head meta[name='_x_ds']"); if (_0x1c8f5a) { - var _x_ds = _0x1c8f5a["content"]; - logger('4.获取meta标签 _x_ds', _x_ds) - var _0x4252bc = _0x15817b["decode"](_x_ds); + var _0x4252bc = _0x1c8f5a["content"]; + logger('4.获取meta标签 _x_ds', _0x4252bc) + var _0x4252bc = _0x15817b["decode"](_0x4252bc); logger('5.解密_x_ds', _0x4252bc) _0x4252bc["length"] > 0 && (window["zextdata"] = _0x4252bc["split"](",")); } diff --git a/test/fp/chunk-vendors.5dea4a66.js b/test/fp/chunk-vendors.5dea4a66.js index fa69bf9..c8d247a 100644 --- a/test/fp/chunk-vendors.5dea4a66.js +++ b/test/fp/chunk-vendors.5dea4a66.js @@ -84323,7 +84323,8 @@ logger = console.info; var xe = [_0x27c221[r(1772)]], _e = r(3236), we = _0x27c221["AJhNq"], Oe = "4889e050", je = _0x27c221[r(6919)], Ce = "efdcb0cc", Se = _0x27c221["eeJzi"], Pe = _0x27c221["qxWSp"], - De = "", Ee = 12, ke = function (t, e) { + De = "", Ee = 12, + ke = function (t, e) { var n, i, o = r, a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"["split"](""), c = []; if (e = e || a["length"], t) for (n = 0; n < t; n++) c[n] = a[0 | (Math["random"]() * e)]; else for (c[8] = c[13] = c[18] = c[23] = "-", c[14] = "4", n = 0; (n < 36); n++) c[n] || (i = 0 | (16 * Math["random"]()), c[n] = a[19 === n ? 8 | (3 & i) : i]); diff --git a/test/fp/invoice-business.html b/test/fp/invoice-business.html index 143ac17..7657c30 100644 --- a/test/fp/invoice-business.html +++ b/test/fp/invoice-business.html @@ -1,45 +1,45 @@ -纳税人端WEB应用
纳税人端WEB应用
\ No newline at end of file + } +})(); \ No newline at end of file diff --git a/test/fp/test_ueryFpjcxx.js b/test/fp/test_ueryFpjcxx.js index c174033..274c542 100644 --- a/test/fp/test_ueryFpjcxx.js +++ b/test/fp/test_ueryFpjcxx.js @@ -4,28 +4,34 @@ const fs = require("node:fs"); const FpCrypt = require("../../routes/service/static/fp/fp-crypt"); -var baseUrl = 'https://dppt.hubei.chinatax.gov.cn:8443' +var baseUrl = 'https://dppt.guangdong.chinatax.gov.cn:8443' // TODO 需要文件内的 meta name="_y_ds" content 标签内容 var html = fs.readFileSync('./invoice-business.html', 'utf8').toString(); let js = fs.readFileSync('./chunk-npjg4qgmmrfrjl3r.js', 'utf8').toString(); // TODO:用户登陆token 测试时需要替换 -var loginCookieStr = "tpass_p3d8j63p8b6p4bbab8dca4832a7fj9cc=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImJjNzUxNmI4NWI0NjRiZjlhMDJlNzg2NWIxZmViMGE3In0.xMmdn82GoF9NH8ldYx5mCrHFZhP13041_34uZ51kF9INM7MB33rARWCqhCZiqNZUKwB1WkTH5jDIZLwh_bRYyw; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221920330690e83a-0f487f8b21c83b8-26001151-3153384-1920330690f1823%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkyMDMzMDY5MGU4M2EtMGY0ODdmOGIyMWM4M2I4LTI2MDAxMTUxLTMxNTMzODQtMTkyMDMzMDY5MGYxODIzIn0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%221920330690e83a-0f487f8b21c83b8-26001151-3153384-1920330690f1823%22%7D; tpass_mcsc7e2ssscb4sfmbsmas35sass2753b=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijk3ZjQ1NjU5MzA4ODRhNmFiOWIxMjNhZDY5MDdkYTU5In0.NABIuYcca0UKpWOwvjiut7f3yn-tIIGZyBBni7S1jFAoaRR_kaH8CTZLxSxfc6-Q6n5hcG1l94prwDFGgzZWYw; tpass_k238ck9eedkb48a9a5d7k5c2c5kkka58=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImZkZTE4NTFkZGJhNDQ0MWE5ZWJlMWFjODU5NTNiNjM0In0.qHK5SMznOicFnrhi-1MnF16y2QypCSNLtbi3KE2pD1kyz4yRpLE8Fm4aHQMJ5hMa5aO1ibB-iQ-npD7QkoP3qA; tpass_te95ftefe59243cbafta4fb82bbtfcte=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImViYTMzNDVhYTU0NjQ0NWZhOTdlYmViY2Q3MWNiNWQ4In0.Rk1-kzwo4fneL4FapgQzhzxC-vBVu2zpLHQVfnylQ88x6Ik5QNt3PuyfmqLdoenoR7y69BgAOM3GvLi_KFcsoA; tpass_q4q6b8aa469v4369ae7483c4vb45cvca=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijg3MWNhNzIyMmRmZjQ1YzQ4YmFjYzViMDExYTY1MjU2In0.rUzqjvnFTAwRxRa49yeiPWqHWNF8WRmsKPayVfGRLuMja5huBOmlpHc-kEXBiGh43ei3t-ZbT7EcvGRga0aZkQ; tpass_mb29dc78543X4X769Hd7d8a35Hdd5236=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjgxYTYwZjIxZmMwZTRlMDY5NTFkNDI1YWUwOWM3MjFjIn0.V1-LfcMe6VM9W4q_F15gqOxNbA2jRLRVpCml0WFvKTYAGdFqsi3JEgGBvMCL0SEkAOSVhGIn1A9ILjCAuiJ_hg; tpass_c5djdncfa7nj4n2cajna2j68cndbj2fc=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImI1NzM2MjUwMDE5MDQyMTNiYzViNmQ0NGI1MGRlMTZlIn0.Es7Q_0jUPcvGddK90anCqeEIBjtl52YZ3669quo27iVjnObAt580ZEHJPjCSLw9vu3HAtPY2SkjYuquc0tItqA; tpass_ue7c9954acea492784ac6g78939gc2e9=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImM4Y2Y1ZGZkYjJkMTQ0NGJiYjM0NGM1ZGJjZDlhY2UwIn0.dfWdZX2tAHcB5Xgb36Y5WQJabicYJYoURhAhWzKu4cSklCYc1lK6-fjbTbiRUNmW3hAQ0lUDUkH3DHVVTuvOjA; tpass_x774e745d5k24ex5a7kkk375x933f654=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjM0NjljNWY5MThkZTQ4M2JiY2QwNDcyMjgwMzgwZWFkIn0.NKypnkLFaewOcawUAg_fZQdbFAbgFU1Nqj3ibv3FumIKIW6AZXiD7c0ASR16aTa4B4XUBjrysQiXrHksxRX-OQ; oauth2_referer=etax.hubei.chinatax.gov.cn; tpass_tct8zta97w6c46zdt9zc2648227df5z2=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjVkNTg4ZjBmN2QxNjQ0NDdhZTczYjBlMzM2ZWIzMGYzIn0.Lmt8PQ7SLdivPrcoa6hxEIW2osZBMFc34ate7WKZ31AtSaOYDDMy1lzVmlBmqaIRNIJUhS18N_jJulWz4XAcJA; tpass_sa67ddd29sc94cga9f96s7da2772s6d7=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjVlZjcyMTNmYWYwZTRkYmRiNDMyODU5MmY2NDBjM2EyIn0.jSXIt0ul0pp0Qnb7s7VSdJxVmyfY7fPqzQQg4s2ATS1dluuM49H9Q93oveAxy7URB0s4nMTtWwyTq3mqB_5mpA; tpass_b6edq5qqc5cb4c3288q6aq6fab5qc3b4=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjFlYzI1Zjc4ZGQyMDRmNTQ5MTAxZGEyNDM2MjFmOGU1In0.0VH-6AoQlwsdXMCV6u9nAWCDBWw_sknQQbZy_IzhlrxXkanffsVByh63GYra3awUBma2w-c6WfCwQBdcJGukMg; znhd-ssotoken=a8a7bf26beac4fd4929980b20971b228; ZNHD_SECURITY_CHECK_TOKEN=e4dd8ea2c69440169aede2fdce9a3180; lzkqow39189=2bb488d931034436b6248e9f304424ec; DTSwUOYx7MiWN=ab2bb065ae0ed58c8a84593bb5a3028cb6197c4c212230fce7fbf44bb130b09; dzfp-ssotoken=684d411b247b45c3bcc27ab2e6f8fe68; SSO_SECURITY_CHECK_TOKEN=1100ce6e65af4dd7bb5cf78f795e16a5; lzkqow38189=1727141642601; c_time=12; MKls83gqduGS=0fce79cac178fb6e9a66ca06fa3610191e8668277ba8c269ff723d98e73fd12d893bf51bac776eed80b13155ab4b96ea" +// var DTSwUOYx7MiWN = "bd232e748674a385df6c5e99901a43b4dc24fb3112038672608a42924006a46a" +// var dzfpSsotoken = "9a0759a97f3742449ea38701a5c19717" +// var lzkqow38189 = "1727331696505"; + +var loginCookieStr = `oauth2_referer=dppt.guangdong.chinatax.gov.cn; dzfp-ssotoken=fa284f7756fd4d94b850d233a3545a38; SSO_SECURITY_CHECK_TOKEN=66ed9c58a548466f86f0f01462104519; c_time=12; lzkqow39189=6ebec9d6f48b4739a20bdf6664af0954; DTSwUOYx7MiWN=e19a43e42435051de9e20836c2f7b13bfaaeffb2a0f94b649b61d584cba7d7e; lzkqow38189=1727348343254; MKls83gqduGS=023d54cd5928041edd03ea399186756763ca1cb446a65a26cb50ec6b56fc2c2f2ee43ca9eb0fa6c2c5888aea7763550c` + var urlPath = `/szzhzz/qlfpcx/v1/queryFpjcxx?t=${new Date().getTime()}` // var urlPath = `/szzhzz/qlfpcx/v1/queryFpjcxx` // TODO:如果有 param 加密后得到 enParam var param = '{"gjbq":"1","fpztDm":["01","02","03","04"],"fplyDm":"0","fplxDm":[],"kprqq":"2024-09-09","kprqz":"2024-09-25","tfrqq":"2024-09-09","tfrqz":"2024-09-25","sflzfp":"","dtBz":"N","pageNumber":1,"pageSize":20}'; -let fpCrypt = new FpCrypt(loginCookieStr); +let fpCrypt = new FpCrypt(loginCookieStr, { + publicKey: "MIGf1MA0GCSqGSI2b03DQEBAQUAA4GNADCBiQKBgQCf1rfXNEN4DhiBwUArI95aomsBQUb/zmCrohl3Sye2jkySQ4dZi21oIqTjwkOGp31NmoScCA+dtZpER1N1sbkZjIO9etgdFtGMjRNvGw2stuAOUPa0RUQ0wXHlhzJktoDd3R0EV9ztpaACq2KhpYheh1sZnrf5NHqszR9vC9nvoQIDAQAB", + tokenKey: "0706aeab77e14192853af569233c0e0a" +}); let handleParam = fpCrypt.handleParam(param, urlPath); var enParam = JSON.stringify({'Jmbw': handleParam["enVal"]}); // headers['security-mes-key'] = $e["enMesKey"] let handleSuffix = fpCrypt.handleSuffix(urlPath); -get_los(handleSuffix, enParam, - // "049321f152561c47bcf6d9f7dc6ae07f6785245ce823f41bf949488d9eb12266b089a7ad22c86efd8a65d0b4b81fe6e84e149ce03517dcaf8309b5eb60083df482d29e9df5c08105d68bc6deebd5f8ffeac7809ed38227563e5f12e685effd69fcaf6af27e1611be32c3bb3ed6673f610fd082b79645ac4715b3d64e94f87dbf96f268d17713bcf3746dd09968291ee2951ac7967d30db691239938fa5ea935abe335f9116c66a6844349fa75cf0b727a2b1f7863d3b297cccf76a67c6189187739fd244e0f6281b2c082dea71f40de76f857a3198a07f5627765ca2506c7c63dc7deaf2427332f7625d6d05a24ebb3fb12c3b7624c1bc741449c6739b6e2e9d22ae94ee601c92aee0caaeb3f78f2695ebe9c30304c2e6d2faa63985ca77dfcc939bfcd7b55997216f00c961adbef5783d52c92767bf7e8cef2e8bb6240b16177451e02429ef4a1274a4217826b77357df602baa0dd72190ae77500ee316d98663fa540cb64b61c7e944ef13ee877eae6a4da06c908860c7bf53cd0675755131b30e5bfd30cae49a33304f0ce0369d21640d4f8d026c51734321f60d3f8ff5f6c41263497b671d487d5a0d1f25f69f14c26cf1edde2a2c4834260730d3ec911148c1d93f1af4ba06d2ed00f5d76168b6169bca08d9a543ddd0861e6b14275ddb06d097f3944311bf3fe0005c3991cbd1883335c40cf5b08fc7b8bd09a4419357e5af7383cd695373f5b147887614fb826933aa9fe94c1b01d0657ab35f07ee9d90fb80d8853913d62d87132c32c5bd729585384cab9257dd122e7c2943e97757ddd0f66fdb0cb9b4958a7c69d753551d984e03dd1ea839dd65ec8db03c4534f2de8f9ed7c305a0c0d68d6a06bbc43fbd00bb20a42d44767f3447c2af59615d9f495e24629074eac51694294ec9099bab14194279179424958f25e8a7d287c391f71da7ff776b27474cbf4590a61d5ae541f9bf3494b97d1c8d2657ff03b58c5d885807a86a87baa8be5af611ddc95a33909c90d37ba55c7edce194a98c1213346602cdd2937ac0e1cd0336683088e4461e24a220769cc8e31c7fb8c8eb86c31711b98f21b5c50958205350635927c31d49ea549ddfae9a059a1d3943a030b26033d9d02bc1d719c07ab8c58843c9ea6befcd3632b0cc76215deb2791289b583c15982350d29cada52a810efa583fb560bb90fb50bea50de5954a24a6203495bf756a1c09f52bf0720c1d08c19c4d4269f5536c7b75c44a69d1f1224e444928e28aa2886161daa634384c59905a69bd9a80d1dd9d4fd2a3cd71784e983fb58fd0a2e6d7c776f16882aedadf39af28891c1d7411c5afc99ce9f72509789f7cf89218b5820aa83a8756c413584f0f9658b6862ab69374fecae8344d38751bfa296645d7dbe01cd3fb76f9180234968d8078f4b6cf40e956c7cfec7e43fd55861534c0e04f4093dcd2956e4096ed23b5b12b6c42c14c6cff7479b4de92058de47144f7a46324849fd23fde31cdfeda47d95d61a4b0e09bbc01e9be2ac9ca4b87c10f0326f7996f45dbd02ff9ff2fab3da92570e8dd720e91d0c1ea3143b1b663240fef6e864627fc6dd4b5348a2b3233ac85f141982409758dcece1da7ea4427fb777a33a40d6d3de23b9467e66070b3607165c124de349b846e0ea6804b8533023f68c68596f830c75330f3611e8c3443c45e5fc15a832a51e790f975dbf2d8c0c1e9a7452df5df45402d758edfa24c2d4167deebc98dc4ced2f4ec203476ad47c05e19e5f17483dffcb7daa8a6c51b068e31f75c2bafc2a338ebbd9bbc4c42e51058434bf530e893edb981de0b002d756da6c70770050f94a5e1450b64c5e7df67580438d325d454b243b3e9b6fdc31e1ada5f55bbddc19f026fc614d9facd2e49301ed9e65e6fd93ae47b8f028400a09a42759666c9e8c50e7087579440a83fcb2b1518b0b700c39f6df2d75189db918174bf1e1c13e796c1f7c675669c00158a70fe93faef1e20d2235a67d919825841c21847e9503a9e0a1ec8e71bedc58d520aa7b88ff18745b816a7395236f5b18a848c64ecc6fc7edf18498b45d5e65ecd19f9fa246a41853cd550f967a0db97d465b05d2120fe4499ffcce36dcb88b3079a9c0dc5e3c757703f91ff1cb58c6650ca6196ddd6b17b9639939717dc0a6267f8863476a266313fdd632220c051b0cda44aab5983283e5784cc47bba1a3a1e8ce10c85618b8923106e5bd763c43882e5aefe7ab5d70e797b819bd2a84cf296705a1fd8e1f966aacda30c27cc7b89e06c39a849d8cdfe3ccfaed0203f32b3609cd0ab7c01699d3879059fa5d7891f91c15a859fc4698669a50171fc423f13d7823da04ad31e9702f40b626f18a7adab8a54e18ea22343433c04aa4dec2ecd079f2c583d3799c0058d2ef14953b45c938f08acd2b190a3fab7e5ab64f5edd228df6174474f517c8b7512df790e3235f41d443589fc51af8fc19b2e1d17b3f7a09b15270633c5f1b6db695d014003e51f4bf1409863848894c1c1dd76532334163a9f9c388ea021219835ba5eb2bc08e12a31cf647ab069204389ef7b995d4338bd1c8d35e976ed326df8843ce250b47fe690d4e756c2a2900bcbee716dbcb0866a06095b4d77ca7f7bade15b294c4ceb2390774e5cb516d2a0ab55816e5e8abfa0b256b72077d45d9972ad5df64973505372aec6e203d50c3c2032fb05359dad7bf1a284d9453306d1f8c5112c50c4e51e1eda0dd58ef57197419d2a9191296b2a42ceecae019526ad7168637620472c11ffc58c15171a27ab82e15c1cb8f0f0711354a0f22853615b4bccee1772899c3b7c9a873caea0a1a9d5f9b2041680b60890e38c84009b77d0cc779782624f5b7de302923cafab9591aa0fb079237eb7007179f07f1580a16e3101eb8ea2d1f55fd5365bb1ea6f778c59596cb36ee11a59dc24d372b36ae31ebd49cf524903e984dd2cfee489b91b483d39988484e7e5d3c023bab5b8723933c93febb017c53e2dc4c0fc53ac620ee494f1595c219c2d741b0412d1d6e362e2f3dc36955f178689a1120816743fcc600f3534af022defc86291a6f09f5001ee6b1cefe414ffca6717af8718ae56fd8eb9aae4529f3e1680d304b477af15894cd78aabd130eb3d8e3d2fb68329735c3924f6e394d815ec31d7d93d318f405b70728d6305c5b6f2e21b84b9639e67ae8ad13842fdf506005f03e0d0ed0fa2348d59ffa0955ee59d2bb57f7ec8706a1449567fc61a491c3e35a22cb2aaf7a3364f8daee23564063bc2414fdd6bb25a392571b8b1e4045abe58e1554b01b2d8d9ee506a01614b48c3c2cf0382f500bcbb85008bb1770592438ebfdf0f37904a3ae975db314063252ba0904535f9a2f5e99f7490d4df822ee6893390877f99edbcc0e355f019f2b77fec3b857bee0b09a98b6490e17c9dd3a33a83b0ea7e16aa1ebc284bd079eff1a7d8386f4f85f206b77a39ced31d45df171a5d493c8d3bde83a6bcb6fbeae70ffb89fa42f96ea38008d7b2be8f4f7e8314e025230bcba94ea2989e63c405603c501bbb7bf6ca443d6304f61128436801447ab0edfe87dd8b35586f6b55869996a3e42fe00d835cc5cf3153516883269c2764c4cf148eb06fe8658b9c8332cc5a43c5411c01b4bd2505a0f6a3b9a51c1fa1bc8648aa2e384f060b950550adea66d2912672b95760d76a4e94ad1941c2aedf4998855bade4bb1f87c2b15b4e90d7d6d170401a7a560e873c89a82af147c98a12740aea158a0aad518de3708891ddf10b3670b37b8a48dbfba2c4a42abc4a2135b4d9bcda3ad15421c64d0081aff73291c43db2b9e6c302a19fb4f385eb0454af7758dac9fc73e56e0041d4d2fe1cf60c42f91feb9ca1e9e9dbbb4413c84294f7672208f8056b6067e78b894aab9816bd5a353bae728dddeb700191fb3429e0e05625892e309b827b0f73fb1ff7e7c0dac0c603c1f08b5afddecc153cdc446daef935a43cf190a3962fd333f2399d73010fd6f1ad81bdc163cc8beaf2fb12a8cb72f87beb9e8dc05d6fda775fa2ccb393c1b72c61e614062f9bcf2a1aa1e849909ff4da976af182031ab584660d2033f8eb4a1a0c9d16521a182c78169a9047718b7eafee6d1e8a0be1fe33d3ec807431009797d833e13d900aaa356379dc28b9da41006ea3b7af4bd3d32d5bf94dfbdc524ebcc72c701800f39bbcc9401b852559ae09544ca9c058014acb566bbf06bd53d289335c633561b6ba3b11b1b425aec5275f186a53b439aad6bcd6754168986e36d6cbae76f0b7bfa52b5473a75f19a85617931b2e11849ae67782433c0af49aebbaea5ed7ca4a5f137ca0155ac9ccc127f160b6bbb7ee6e732a6f3793334fad4c662b539d220279b6aef742864b2cd3a71facf9756d661e3836a3067f614b086d19e74ea362e8312221e898891d3535f8fdde44be5845c43e9c11d3ca25fc308506ba760ff654be2999e022deda34b5dad1981ab22bdeccb7d57bb8bafe26479774b2204c3bb96a19875812a6084c5b66fe3265f7dd9be3ffdcb66f100c87a02e43b5bf146ce4bf88faba5791274a5c9c17cefd320e8e55dcd73dd9d8eb39526ec27b701810cf164cc2101d2e861325517fd4be55c62980dd1c80ef0581a00d8ae993bb4cccb41cf3114e67868b2633b795d2a28292637abefd08367244d87fda8ba57bfb970072a03c932ede5a846aa8749043eff5f08bfa60c4145f2c2612cf24f2aba62836dd10cf4606223e5052c7a48c94852773fec33f27fb56a13142f6ccc43c7445a66ea75ed111fb14dd27d213cc072e79d3f04dd60aba5c8f6ce34015812bd535b4e3b9909256d950507fb5f3f199cf83984db22de3ededf049663ad0eba7c4ffc4dcdee9e54b348ae07dfc5ffd917aa94eb76d7328df7793c2a615defdef1838e61c609ad264cbccd8da4c4a42a0ee10050882c3ab0f3c86ee068d6d2eea428e85f47c37c17ee7d64de3382dac8eee92baa77bba4265af7a49046694ae4c4cb833cfadace0cef9c75990bd94079331984a8585441c29a7c837e890ac848fa9a1f137a344de1963949eca3f65c79d1f634d217cffbb5a6daa31f708e64eae23408a06a54df72579be43df17558e9dd7c41c72bb171669a45bee8b94e8615777a8c17569288f57c8407798f2422f2fa0517ec63a4f225aff538feb3b45d300a6c494514331250f1b4aad1598b6fa3b2c5b36edbe9d6510cfb28bd1b1691492d4ed807bf5ec2ba21d9d6d5f056960897be7cfc4ac751d0b309e156eb29c70a142af29b5861801bbf6ee46242e0e76b9053c104600b202faaaa0542aa5aa9604ecee1bc788e29ee4c404da467926096d08939dab9af7e7260aa66c0be5802393c41fc05b1a6b5aed1b0d35d528310f3aaf8a8dfe95451a96e9b26ffbe396a56414e4499bd9493fd14b7f5a71093771a49a9193d16cb0aca4efc4a143839ff0c75a3d9f8e35a9cfcbcc314420745aaa874a76496489ea01422a013a10fbb5db48bcd81e1428b66b2908fa29de2fd5c7a931fb83f92fd0201f27d62132e07bf83fb37d20eee48b873f0c4fa0e696602f4040164e6707f90de687c4eeda0fa777eebcf7a2a455f758c9717b009b753045c274f667c5be1b4098aa5e7152ed7c6d3be64a35b3cf616c38eca8ec5c4fc826c9a5ec6a24737a7ba1ff2baf9ff851818b2fc0d0ed97830cd647d74961dc49c37484278bf10e8afe1be9ac3027b91464c8be67b1fe29b2475952f021ccd07958b89cae0822df95eb531c0f37ebabd81bd117ac4f55bbe5f82dd3e242c7e2cf75f79aa4b4edc3c8464a3a41689bc4cd8977aad934ab3d22a76ad58aa7260b38814895d64de5a3da4ad4980160aff8be0380710e2246577d33b8a9f26ec5be2a02e07e6ebc6041cf8555e6765f95a0ec0d119ce65813d279c1933b7f52147655ebea0e67547a12e26ef90307eb83c05026877c017a3d3cabc3667da941a93db10920de1fbd935cdb7fa33a90c9cdacc7b2ecd2e6d5b06e07b21704ff04cdc780881dcd0d11dcb8e3889d7e3c5f4a691afb600e16bf63a6e3c489e9a7ce731eb689144888a6a82bef61fb87792d4717b5aaf4bf10813c11732021614dab31003f5bac17d7a113694976d40733e68deb2c0ace7b0e8ab024053fd7d3e8d2dd83ed79f594c03fdb739253d458011b888fa27e5ee1ffca93bc34d904dd5777c018491d112754dffccdd0bff6967a54fa119dde484b78d5f8fbf250d503f610f1cdeb480868110a0a5efbec57ce2b40afdae25d13d640346205219bce6ef67dae48c894bc2786e137d0e78d5f27890d420374c3fa0a5834d82c19878adf2ca135fb9b7484e7acf143b48079bb95a88735d14fd9b7b5dc56ef0721dfb07b4296949d32cdde23665ea50d2aad376321e8cf804f04ceaad7efca5369b809242eb412f237cb908fe89a27a7c9227862d5725da46ffd6c111700f94ac1396cd4cd42767f95094c2cca9bd70c27afc5e9ee8e4a6d368e0f4600227b4fd30a04ff0c63cd9d4e438f5b0391de6a8daf646429d6124f13096b630a77771b14b66c35d6fcbcefcdf7aec803a13a4b3113238c12639b628ed8810432e8b62f6d176474d3a053d16282cc9c0c76a618f18e89a894ae2d182925cb4e34cd8feb0055ed36f6c5fad00a26c8c7556cfd713e9d4424a12e00850ef2b52ab5d39a5008f4deec8e14f3705d195d3b5ed5eda849b331ecc0c3cd361d3c75245104e139aaef30dcf0cbd063150906ed1f1fa89dbb47f0cc9a7b59766fa477580208a716f31ec57500a0ccd7aeedb3678e80cc52c003747d7886d18bf1a8209740c6e01d71a74630a53d0e1cd638ffd95f6824f06f85e6bbd51dfa2f38b717ac42ec9e030577e6bbd9b4d39424aad83db61be11aa37eeb662aec7a99282eb32b9fd996c829bc9fea04eeb159012a92fa6e975d33249a91a2081f9389a390ff96da8529aa02bdc5393c4cd5bda2dc888820739ac3addfcded9550d6e091106b30d8cdbcd6ca2a93be37d8333b146f69c461a9b40ab17a18caaa81547f7da845ea0e9d31d11654ce1817ab1623635d1d9076ef9d36f041a7139d482203e93afae67d75d01442c6455aa6e3fbf518602db75e91f3606f8be7ef53a54524e1018af32ab94e9e311ab4b22a18c40e155e79dba038bb25cf62465c528784d30802519c3e98f3565797e7f720f8dc8a8faf9e2233b9b667b50453145a9b415cc86bd040dbe344c7971953ec15a4a0d99c2929608b7b2a5e16656614bfea125edb68c70ac5e3197604fc9f82a8e33e8f9e7808fd685880064604a9de83fbda77e05da56ff8b7fa2372a1bb706d22068969267c04bddbb42d5f50ddbc958719af4e287b0dd5f4e0d72218378a46aa1365c8555714f21e547b5d39daa531270b9439da02be2a42ba8d0759bf53830c471deed7e47bdf7d6a196b61e0854a78fc1a4100c9353ce64b51b98f05ee84f673d88c1ba2120b78900d14365c0168188303d81dd2ce34f79a61c100c78937e1b38766e29e82f7437778f78a2058f6247251c2bc0e206be3e5f830493ac14fdf76f4a0dc6e860bc110171768ed7b323770b945d5951796336077a8f501977aa268bcaa1fe2f7e80a9599a7e6a2c628ee8a62d15c99bcc68694f0956c63cd284baa786f4db9ee0da0ddc6fa96818a26f961b30139fe909c404c735e706b00178418e9121bf498ea06b9da1567b56353bb8ceeee9755c3187208e2fda69ca26831b554daad530e37477bdff9685279450423cca7375268925386bee850fcc872d0c23da33710e0ce227bb0429b98715ee195002f1620313d8287b7152b01dbc278a9b22f35ac417a6afef02d8327dbb595582d1ece051beeae1848000c346665a6ebfae3aae557a56bb1bc1ee2a2fe4e623c5839db29b294af5855daeea47605196a11038d0c12a5d8a7cf46a9f1484f50e34f8bc3b30376ce1e387ad80f607b98c94714c461d80230cdb59056c168bc2510ddfaa44103222950d0b32b4bf313805eeb3e14d682d8f935d7b651425c3bae831fc8e6ea55d99d535d4ab1ebe7e26bf584f111d3042c03e254a20f063d23a4c925330d45c15e56e304bf6ed4f10244e255fe00c121c7e09f39f8ecfaa0bd27a953bd9262c502124181af3fd213efa400e17ea777e6ed34ed8ec723f8bc99c81fc5994d6c8e99d7c708c13b948b4e9bdde057ca70bf057533b9d1b932a90f4882823c6e01a7c3f2ebe9cd469afd73fc0e26d11ba932ee9755313ca8effdf1f7ff1fa5b2960f57b0734bb7201bae3ec930cc2f02b2a73c7bddb87023508d0f9c036b36624f25298802571ce62edf555897a0bb2f224d5da5d31faceb49328c5799baf5072058467cea9a2a81e3a85724266912604e904a4e2796abe93d2bcb50c4e38b6efd391658551975c255f06b76e31e431dcda25bb41c5bc3ce8b4cca74b768afc44e34a49617066ec17e27219d436beee8a9a27054bf81bd9240b13aa678eb4eb4fe2f6eae0a5cee3e8daf6334c57cc47d28ab59a0e8d6632e756414e0e6650c27cfbc9e4445daa374286c2d9d51aea4927d60438e138f40566d2107ea72615b7ddf0289e02369bf0377c11821bf1a8e5b550a5e374309ba59fa1b7e75a37386d801b2627e39713513d2195a935fbdcc1072e8bb796b8e5ce5a3f2080a74f7c565e1f8c33a7fdb0f3875ba41ceec54600690c4a526ae47bfb9d3d708e89e8eb9a0e0b874a29baf59f5e6cd0cedc8f513ca618bd832690db081be06ae6299308ca020a6216be8f3b14dfe18f7e37f2ac8162aa7abf17b5e37db04a9fbbc76546f99e5ddf1dd5f98606ef0a1fc4ca52ce5bbf62bccf86f5e203d081357c2f6c7b14cfa84168203f09f65083f51c0dcbe3a3cf1ecb6ff65019cdd51c3bcc9a6318d679685aef5eb42799fcd58bbb10ebefa3bbd26680c22c520e79cd655b0febcb48727f04af3efba4557bd1ee97a8b2154c467b3f84c75bc41fe85e8c32201f60765e7da498518ff82b96ba4c2411ee64fb128b1544c2175c8f9ac7d264f85e868c4c729c279285b77cca914e6cb6e05366e599877aea866176875e090813f52bc1370c284931a76079a069187d1012583bac1d6eca3b3beba24d851858fb39670125da51adff7e5dc981a2c14458c2da415020f8981d018b99f2459d37bc3e0b21245c9e6cd55e10538128fc95b31c0042be57db0a64b52bda5dc65171b669034ec329e665e0502a19d838871132d361b7af2df582ed8a6c3828fd445bc980d071fa1ece7f3394c02e3d386a93390c837f0b0aa3048749b263c533626f01a9fbfaaa874b9c2e9a17c947f202884bd8ecd5246d0cf8a31756babc86c46bc7ed8cb9f06cc99aa95b12fa1c8ca77678467bb4e0680bb6f75807ab477f368a48d328c09a39a7aee15a66ca0209dea0cd6a93bc8b8a13df7f55f22e9fb92e09bf35e812640b212c2db0a27ee9636030c57e5f9d035b4cdadcb50d75d3eb6d273062501b9188a2f05eec8a1b03278addf081fe67beeea75116d09a38e0f6ea9cbc3c0938b5f85b01ed1a7c5144029bf656ebf83b08ae20f601a14fe0dcaa4fe89f84d8ab04c5195d7e279f07e8d56b2eb9c2a9bc5ed1807c590bf74cf412fd6ab7a90803a17438975002376b01e2f8706bfc017970f0a41a418ed758e94d043f0ae153d09199eea6fc5fa672f92d363f54f21660eefa276782a5fd373b92fc158a6fa7bec0770f22e0522eb665e112e0ad13c5afa978651157d5ee9b30c365159c7427854486d49047735c98f74bd297d14793f546b06e4fb5c635bfc98fb981b918bf98a257af7b35ff59a64dcfbdc0c828982b8e89dee30cde3adbdc0216ed0be9885024601e57d93729e0ea17306c686558a471f993f0be9ca0590c2faa3b0aceb67b7c417ee68f5fde1df36bd4ac1bb6919933033cd9ee781fe2d1c85310b64f2317fb736a1dbf4bb72b26fc2e7cb59fb2cf562eca33a40410810037988734855208d4d08bd162768ec90201289d18712e6910694fceb6c93d26d4ff4df1c518ec335c0c5ebb78ea766e31dd4946beac79f571a8e61104bbf9640c5af14080ce0a7a190bd318e862ded89f46b76c92353f911a4507b2cb02d4a3374fcd317a51cb3859398951c99dd7c6040c0e106c715a91fb2e3e3ece8cf09e1ed137cc2ba0ba180aebf2d049b19c958da72533b154ae872957feeb5c5a6f2021dec42d96826f6bb9cd1b11b869c85a879520f0d4340dc30c3cc5779f98fdb64dc8dda6e91113102447b3f2dfbfc3acc09da9e8e77b2773b5eafb73cc2439fc62312902cc7e6f57d263bf8b1acf7272e41d2453d4bba7a15890607fd661bb8ec330feee01252f8bb0125b3944219b76811f5c3e1e289d83c9bba7179a474e028f67f3e96407ae0f90e61ff9c06125b17017e33d391c4b915931b3ba82cea4da6ab50137eb9edb151d74782da32c406fb777d5191d9417bd13e7787dbb092bc60e7bc6b664515f7825cebf0bd265f5f68a5aae324eae3e91216423d868ea6f03920ab3bac04be5da9e73ce7778b01da57e27b354ab0e41f896e25a47ed57d1da207dcac893f3715adb3de8ee142076c596810c05bf60d3c9039c9247b8d87ba22be04eefb6039c5b99883e5dfabffdb0a079d94f506c4750aee513fcaed501abdf246b9f664fa8eb8733f72e772113d347bd5aa7632055fb4f6d7fc92f00f5ea1cbd959242c7e030abe21775e7d85b891fa0f601d2e8da7568385e51d3b9ef3ebc40b4913bdccc1653e09580cd382708a997b954b618a9f8b1504cd99a51f5aca90a9f202f8ab4c7b59714d34678419ca5ec4a68956c516b9aac48380d205db7bb748f89e36f2a2971205bc75fcdc944d007e4fa40ee0cc25c12a743aed9a2c42eaa12fd46dddc9d930d676a43f86dc66db7e9b465c849618dc96c29d4ea5cd95e00eae75f681d7167bf7fe61b67d4c943dc490d0d570bc239f98862e3d23da2eb80a1ddfeedbc7bfe3c747211b2b65c8d492befdcecdd6f0c09c5a41730b54a8a119b4014f4a3ddc45d069693f1b59f5d5cc38cc37d176419e9e477745a57fdc1529d61570966ef7f3b3d4b393ae91cafe3b20f5276a45ea60b7a8497dcf76b80b34fb6703a3f98eac9bd599c10093630b815ce89ef38d2c22c0a0ac7ab29e41a20ede5bf62ce9c50b0d8250b198b5c3e39983d2a1e26a96993dc63c3c78b1e5419ef203bb0c0146d3def2f000687dd9ed7212674f876d717a8f65684ae073993108f9e9aa552a1091f42ae9345c1f9830433a0f4fd3ba77156c80fe6b488a26a37a6a648d8e0400707a7570c0beeb1ddd21803e302f93f6c8fd95f8464fab04f9547b4fca6bceca82ba17603aa5446200056abb292d75b3afe3a8975502802d4ea3a884849428d7adb87fa51a11ae5c0a5dff30878c38fe09f16f5d266e2cd494907068a85e583e4d0983115d0a23b0c04f73a9c87579aaaf50038ab66d3a86b2c5f5445232281ff09cf2258608afd12011258b138772796176e2c93a5dacacd62c2e6123b090823a89a12373895cea0cce0da6088b9ea40f5f903371348b20cc5442ba01d8eee61e0de7d5f635683162277826acca09f8a2e6eef31b673275c0735e3a79eee0f48579810bc7817ac7d5d9107b2d5add02da58b090f39e17057903e342ea295230270dfcf03fe1d769632ec97e8dc89cddc67ee23d04829fb9660208653f6c3c5882adb36c9e5608c5216f6bc93bc576d66ced37578876426a5a6c1aa809f4fc8b2fa49d26716bebf3799106ecb15adfd6e4aae8e052fb8c662331adff0b1f466039d710a6a404a80cef9ce720734e7e68dea881606ebf50278e00b4dd24c636293aa82b3680a3f00df8ec878b8e6c89c676c3f5ebcfc473cdfc3d418b4b8dd5a4daf0ec63df4ef2fc670aa84f4bb80fe6a61b05c87c4cdba30f209839a1d4b05daf105f0bbed3aa378d09d2e2c051eb38784215543503f42efc645f8950c1d331a95f809e5f00d5d08602b058007740a03fd907a3cfc16dec6c5c9a35a0c5368d0bf7b2b5b204dc138f32de5d440f350a8e5e06a65c1e7236ef91770c6a4f71412c3b41c685271d83c34aed99ffb92164af939cf339da64507855425a1c65cc7cf0f7f5e1c936cce51e25ca02c89c8d50c63d8a28c6a1c058ca8467a8110df6a3a612bb327698996814df4a4a2dc89e8e8482e15d509b782a8e52c3b42fa03623c06105971c0ac023b9157778a9c7b68eb37f1aa41011aa894747d02316803571bef6a64f82af44ce0a9251c59c0d4969c056ffd1d0f85f331fac8213322a5637a76730a0a4d60c5f07c61ea8da5d26e233b92287250793cce5d771853dddacbde59d99a3547076567544c1467d8d901dbb05f6428986419a9771b4f06c9f9bf4ea6fc70c31338e020c978c75b1ed619b13f6faa916ec8a8dd3e595d782d5469943ba6c441b528e7fff0255ac8a1d72b8f99f80969227aa663bbd4e82a51380c7186d74f1edb4c0476a9fd2709cc9ad5948b622fa90b6781080f3edc062e0fe07633f79aaae3aaeadfc9663e9df2b627efa82b9e626943abaab0015ef3b95c292ca26a040f875bb24f36d539abcc54483878254e019f513c5d93e22ccb13e26f5ef524123f0fbb5539d2701611d43072b81dcfb50ce68a2a1bf61657e974e90a00f47580f3ddcaae8807e1a3f663029e32ed1ae33346552f14adc4c06f227177ea9596f57dd036f3a453a961b6212be59bec89c93731c22641d3836fba0d2d8bbb1007918a347011fd5d0c8d4aa4a0bc0d6d9f391836ad4d3d77c2a864484174d43c81bd45f321178a1ac9db785fe00d029afc9e58ffc8b6a3aaffed50a65f23e555492018b0b4191f6640292e5f906963146ee78b0f88fcf0fc33679e95997225c9f61c1d8dc0d26c360d4d8631cf3b94a60be6a14305aa3212bf9a05e65a35499081ccf4aa54c00f4a8eedfe36c29784da54af1d61351bf6edf7abab9b753baf5548a8dab7edec8054ef1aacdd780115c174d455ca3050a74109532b10990af5302b9a6dbd5b726a478b0a3f61213ab2d15576b2ad8bed54b78a03a94f1a7b2d1440da214394330a6d3dd6a0cd2af7d6793fd654913d2cae45019389a4d0398ba4f9f50df5b134093a42a428de4804330f6ec373f2957c7a3002ca55a02d047bc61a30f48e824cca8ac4353c9b5500f7aa65c99de21b975437ff255a383ba8682890a31c3df5deade5ab6489c3320156f2bc575e7bafbd7b7690653c96191c557d8a594c3093cd720e63a1b46fb51354dc786d495c78a14c348a3236cdf9cc3de932db62b50437395435c114fe6166bf3ed73d81724fdd3514513830b4721dc08e1bfbbf5904828a43da53aca8037b6e26973caf345506bf9ccbdaf6cc3d16a1cb1e2a2650b62ae5d0a36b725a3d52ff" -); +get_los(handleSuffix, enParam); // fpService = new FpService() @@ -57,7 +63,7 @@ get_los(handleSuffix, enParam, // // "sec-fetch-dest": "empty", // // "sec-fetch-mode": "cors", // // "sec-fetch-site": "same-origin", -// "sso_security_check_token": "e133ba1f6f124599af5fa5262e1adf02", +// "sso_security_check_token": "0684966ef19e4ee286caa4255c336517", // "x-requested-with": "XMLHttpRequest", // "cookie": cookieJar.getCookieStringSync(baseUrl), // // "Referer": "https://dppt.hubei.chinatax.gov.cn:8443/invoice-business?ruuid=1726970597058", @@ -71,7 +77,7 @@ get_los(handleSuffix, enParam, // console.log('测试getPublicKey请求', await getPublicKey.json()) // } -async function get_los(url, param, _y_ds) { +async function get_los(url, param) { console.time('js执行时长') const [jsDom, cookieJar] = jsdomFromText({ url: `${baseUrl}/invoice-query/invoice-query`, @@ -95,9 +101,6 @@ async function get_los(url, param, _y_ds) { let internalVMContext = dom.getInternalVMContext(); // 执行 js script.runInContext(internalVMContext, {timeout: 1000}); - if (_y_ds){ - window.$_y_ds = _y_ds - } if (window.$dunm.$byno) { window.$dunm.$byno(); @@ -125,7 +128,7 @@ async function get_los(url, param, _y_ds) { "lzkqow23819": `${los.hd}`, "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36", // "x-api-type": "xhr", - "sso_security_check_token": "91081171bc604d16910500c4982e74ea", + // "sso_security_check_token": "0684966ef19e4ee286caa4255c336517", "x-requested-with": "XMLHttpRequest", "cookie": cookieJar.getCookieStringSync(baseUrl), // "Referer": "https://dppt.hubei.chinatax.gov.cn:8443/invoice-business?ruuid=1726970597058", @@ -142,7 +145,4 @@ async function get_los(url, param, _y_ds) { let newVar = await getPublicKey.text(); console.log('测试请求', newVar) - if (newVar['data']) { - console.log(newVar['data']) - } } From 3be5b824893341c6f97672f0397ebd49b14413ad Mon Sep 17 00:00:00 2001 From: liudongqi Date: Thu, 26 Sep 2024 19:07:15 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/fp/chunk-npjg4qgmmrfrjl3r.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/fp/chunk-npjg4qgmmrfrjl3r.js b/test/fp/chunk-npjg4qgmmrfrjl3r.js index 7c3ff07..c655f24 100644 --- a/test/fp/chunk-npjg4qgmmrfrjl3r.js +++ b/test/fp/chunk-npjg4qgmmrfrjl3r.js @@ -5178,9 +5178,9 @@ logger = console.log; } const _0x1c8f5a = document["querySelector"]("head meta[name='_x_ds']"); if (_0x1c8f5a) { - var _0x4252bc = _0x1c8f5a["content"]; - logger('4.获取meta标签 _x_ds', _0x4252bc) - var _0x4252bc = _0x15817b["decode"](_0x4252bc); + var _x_ds = _0x1c8f5a["content"]; + logger('4.获取meta标签 _x_ds', _x_ds) + var _0x4252bc = _0x15817b["decode"](_x_ds); logger('5.解密_x_ds', _0x4252bc) _0x4252bc["length"] > 0 && (window["zextdata"] = _0x4252bc["split"](",")); } From 25d6162bc1febe04acb844fc843e61d34c0bdf4a Mon Sep 17 00:00:00 2001 From: liudongqi Date: Thu, 26 Sep 2024 19:09:10 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/Fp.js | 9 +++++---- routes/service/FpService.js | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/routes/Fp.js b/routes/Fp.js index 9152c0b..e712bfc 100644 --- a/routes/Fp.js +++ b/routes/Fp.js @@ -13,17 +13,18 @@ router.post('/getLos', async (req, res) => { let param = req.body.param let html = req.body.html let loginCookieStr = req.body.loginCookie - console.log(`${uuid};接收到 ${param} 请求:${url} loginCookieStr: ${loginCookieStr}`) - if (url==null || url==""){ + let publicKey = req.body.publicKey; + console.log(`${uuid};接收到 ${param} 请求:${url} loginCookieStr: ${loginCookieStr} publicKey: ${publicKey}`); + if (url==null || url===""){ return res.status(500).send("url为空") } - if (loginCookieStr==null || loginCookieStr==""){ + if (loginCookieStr==null || loginCookieStr===""){ return res.status(500).send("cookie为空") } let start = new Date(); try { // 执行 - let los = await fpService.get_los(url, param,html,loginCookieStr); + let los = await fpService.get_los(url, param,html,loginCookieStr,publicKey); console.log(los) res.status(200).send(los); } catch (e) { diff --git a/routes/service/FpService.js b/routes/service/FpService.js index 79d5f42..ab9760b 100644 --- a/routes/service/FpService.js +++ b/routes/service/FpService.js @@ -17,7 +17,7 @@ class FpService { * @param loginCookieStr * @returns {Promise<*>} */ - async get_los(url, param, html, loginCookieStr) { + async get_los(url, param, html, loginCookieStr,publicKey) { let baseUrl = new URL(url).origin; let urlPath = url.replace(baseUrl, ""); let headers = {}; @@ -56,7 +56,7 @@ class FpService { window.$dunm.$byno(); } - let fpCrypt = new FpCrypt(loginCookieStr); + let fpCrypt = new FpCrypt(loginCookieStr,publicKey); let handleParam = fpCrypt.handleParam(param, urlPath); var enParam = "" From 3db4a38f174efc1881a730a9a942ebd37f6b635b Mon Sep 17 00:00:00 2001 From: liudongqi Date: Thu, 26 Sep 2024 19:14:40 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/Fp.js | 8 ++++---- routes/service/FpService.js | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/routes/Fp.js b/routes/Fp.js index e712bfc..670c023 100644 --- a/routes/Fp.js +++ b/routes/Fp.js @@ -14,17 +14,17 @@ router.post('/getLos', async (req, res) => { let html = req.body.html let loginCookieStr = req.body.loginCookie let publicKey = req.body.publicKey; - console.log(`${uuid};接收到 ${param} 请求:${url} loginCookieStr: ${loginCookieStr} publicKey: ${publicKey}`); - if (url==null || url===""){ + console.log(`${uuid};接收到 ${param} 请求:${url} loginCookieStr: ${loginCookieStr} publicKey: `, publicKey); + if (url == null || url === "") { return res.status(500).send("url为空") } - if (loginCookieStr==null || loginCookieStr===""){ + if (loginCookieStr == null || loginCookieStr === "") { return res.status(500).send("cookie为空") } let start = new Date(); try { // 执行 - let los = await fpService.get_los(url, param,html,loginCookieStr,publicKey); + let los = await fpService.get_los(url, param, html, loginCookieStr, publicKey); console.log(los) res.status(200).send(los); } catch (e) { diff --git a/routes/service/FpService.js b/routes/service/FpService.js index ab9760b..ae2eb92 100644 --- a/routes/service/FpService.js +++ b/routes/service/FpService.js @@ -15,6 +15,7 @@ class FpService { * @param param * @param html * @param loginCookieStr + * @param publicKey * @returns {Promise<*>} */ async get_los(url, param, html, loginCookieStr,publicKey) { From 9eba7eeb8aab68cd194eb35900f767564443e817 Mon Sep 17 00:00:00 2001 From: liudongqi Date: Thu, 26 Sep 2024 19:36:36 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/service/static/fp/fp-crypt.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routes/service/static/fp/fp-crypt.js b/routes/service/static/fp/fp-crypt.js index faf5816..3b7166f 100644 --- a/routes/service/static/fp/fp-crypt.js +++ b/routes/service/static/fp/fp-crypt.js @@ -65,7 +65,8 @@ class FpCrypt { s = this.Ke(s); var l, f = (new Date)['valueOf'](), d = (this.qe()["num"] % 2) === 0 ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; - d = ((this.qe()['num'] % 2) === 0) ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; + console.log("tokenKey 加密方法选择", d, e) + // d = ((this.qe()['num'] % 2) === 0) ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; if ((d >= 0) && (d <= 50)) { l = this.Qs(f) } else if ((d >= 51) && d <= 100) { From 538c924138a8f1f59ca35717c124b99606704185 Mon Sep 17 00:00:00 2001 From: liudongqi Date: Thu, 26 Sep 2024 19:45:04 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/Fp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/Fp.js b/routes/Fp.js index 670c023..fde12c2 100644 --- a/routes/Fp.js +++ b/routes/Fp.js @@ -14,7 +14,7 @@ router.post('/getLos', async (req, res) => { let html = req.body.html let loginCookieStr = req.body.loginCookie let publicKey = req.body.publicKey; - console.log(`${uuid};接收到 ${param} 请求:${url} loginCookieStr: ${loginCookieStr} publicKey: `, publicKey); + console.log(`${uuid};接收到 ${param} 请求:${url} loginCookieStr: ${loginCookieStr} publicKey: `, JSON.stringify(publicKey)); if (url == null || url === "") { return res.status(500).send("url为空") } From 0e07937fe29f82110a9d227da02fca2fb446f81d Mon Sep 17 00:00:00 2001 From: liudongqi Date: Fri, 27 Sep 2024 09:18:58 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/service/static/fp/fp-crypt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/service/static/fp/fp-crypt.js b/routes/service/static/fp/fp-crypt.js index 3b7166f..fa90994 100644 --- a/routes/service/static/fp/fp-crypt.js +++ b/routes/service/static/fp/fp-crypt.js @@ -65,7 +65,7 @@ class FpCrypt { s = this.Ke(s); var l, f = (new Date)['valueOf'](), d = (this.qe()["num"] % 2) === 0 ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; - console.log("tokenKey 加密方法选择", d, e) + logger("tokenKey 加密方法选择", d, e) // d = ((this.qe()['num'] % 2) === 0) ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; if ((d >= 0) && (d <= 50)) { l = this.Qs(f) From 98c6962ec755ad37c99bc01fda867e12b8f09641 Mon Sep 17 00:00:00 2001 From: liudongqi Date: Fri, 27 Sep 2024 10:22:33 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/Fp.js | 9 +- routes/service/FpService.js | 103 ++-------------- routes/service/static/fp/fp-crypt.js | 175 ++++++++++++++++----------- 3 files changed, 120 insertions(+), 167 deletions(-) diff --git a/routes/Fp.js b/routes/Fp.js index fde12c2..c570083 100644 --- a/routes/Fp.js +++ b/routes/Fp.js @@ -14,7 +14,7 @@ router.post('/getLos', async (req, res) => { let html = req.body.html let loginCookieStr = req.body.loginCookie let publicKey = req.body.publicKey; - console.log(`${uuid};接收到 ${param} 请求:${url} loginCookieStr: ${loginCookieStr} publicKey: `, JSON.stringify(publicKey)); + console.log(`${uuid};接收到 ${param} 请求:${url} loginCookieStr: ${loginCookieStr} publicKey: ${JSON.stringify(publicKey)}`); if (url == null || url === "") { return res.status(500).send("url为空") } @@ -25,8 +25,11 @@ router.post('/getLos', async (req, res) => { try { // 执行 let los = await fpService.get_los(url, param, html, loginCookieStr, publicKey); - console.log(los) - res.status(200).send(los); + if (!los || los['hd'] === '') { + console.error(`${uuid}; 生成错误!请检查 html 或 cookie, los:${JSON.stringify(los)}`) + return res.status(500).send('生成错误!请检查 html 或 cookie') + } + return res.status(200).send(los); } catch (e) { console.error(e.stack) return res.status(500).send(e.message) diff --git a/routes/service/FpService.js b/routes/service/FpService.js index ae2eb92..a4cd5b1 100644 --- a/routes/service/FpService.js +++ b/routes/service/FpService.js @@ -18,18 +18,12 @@ class FpService { * @param publicKey * @returns {Promise<*>} */ - async get_los(url, param, html, loginCookieStr,publicKey) { + async get_los(url, param, html, loginCookieStr, publicKey) { let baseUrl = new URL(url).origin; let urlPath = url.replace(baseUrl, ""); let headers = {}; -// if (param != null || param !== "") { -// let fpCrypt = new FpCrypt(loginCookieStr); -// let $e = fpCrypt.$e(param, urlPath); -// param = JSON.stringify({'jmbw': $e["enVal"]}); -// headers['security-mes-key'] = $e["enMesKey"] -// } - console.time('js执行时长') + console.time('los生成时长') const [jsDom, cookieJar] = jsdomFromText({ url: `${baseUrl}/invoice-query/invoice-query`, referrer: baseUrl, @@ -57,103 +51,30 @@ class FpService { window.$dunm.$byno(); } - let fpCrypt = new FpCrypt(loginCookieStr,publicKey); + let fpCrypt = new FpCrypt(loginCookieStr, publicKey); + // 处理 Param let handleParam = fpCrypt.handleParam(param, urlPath); var enParam = "" - if (handleParam["enVal"]){ + if (handleParam["enVal"]) { enParam = JSON.stringify({'Jmbw': handleParam["enVal"]}); + headers['security-mes-key'] = handleParam["enMesKey"] } - // headers['security-mes-key'] = $e["enMesKey"] + // 处理 xhr 后缀 let handleSuffix = fpCrypt.handleSuffix(urlPath); let los = window[window["_d_ts"]](handleSuffix, enParam); - console.log(urlPath) - let cookies = cookieJar.getCookieStringSync(baseUrl); - los["cookies"] = cookies + headers['lzkqow23819'] = los.hd + los["headers"] = headers['security-mes-key'] + los["cookies"] = cookieJar.getCookieStringSync(baseUrl); + console.log('js执行完成,返回结果 ', los) // 关闭 dom.window.close() - console.timeEnd('js执行时长') + console.timeEnd('los生成时长') return los } -// random_32(enParam) { -// var n, i, e, -// a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), c = []; -// if (e = a["length"], 32) { -// for (n = 0; n < 32; n++) { -// c[n] = a[0 | Math.random() * e]; -// } -// } else { -// for (c[8] = c[13] = c[18] = c[23] = "-", c[14] = "4", n = 0; (n < 36); n++) { -// c[n] || (i = 0 | 16 * Math.random(), c[n] = a[19 === n ? 8 | (3 & i) : i]); -// } -// } -// console.log(`生成随机 ${e} 位字符串`, c["join"]("")) -// return c["join"]("") -// } -// -// get_cookie(key, loginCookieStr) { -// var key_list = loginCookieStr.split("; ") -// for (var k = 0; key_list["length"] > k; k++) { -// if (key_list[k].includes(key)) { -// return key_list[k].split("=")[1] -// } -// } -// } -// -// reverse_str(t, loginCookieStr) { -// var i = this.get_cookie("dzfp-ssotoken", loginCookieStr), r = this.qe(i), -// c = t.split('').reverse().join("") + i.split('').reverse().join(""), -// u = ""; -// for (var s = 0; s < c["length"]; s += r) { -// var l = c["substring"](s, s + r); -// u += l.split('').reverse().join("") -// } -// var res = u["substring"](0, 20); -// console.log('倒叙处理字符返回20位', res) -// return res; -// } -// -// qe(n) { -// null === n && (n = ""); -// var o = n["match"]("[0-9]+"); -// if ((null === o)) o = 3; else { -// var a = o["index"]; -// o = parseInt(n["substring"](a, (a + 1)), 10) + 3 -// } -// return o -// } -// -// get_url(url) { -// return url + "?" -// } -// -// hex_md5(reverse_str, url) { -// var strlist = reverse_str + "+" + this.get_url(url) -// var res = CryptoJS.MD5(strlist).toString() -// console.log('md5:', res) -// return res -// } -// -// aes_encrypt(value, key) { -// const srcs = CryptoJS.enc.Utf8.parse(value); -// const key1 = CryptoJS.enc.Utf8.parse(key); -// const cipherTxt = CryptoJS.AES.encrypt(srcs, key1, { -// mode: CryptoJS.mode.ECB, //ECB模式 -// padding: CryptoJS.pad.Pkcs7 //padding处理 -// }).toString(); -// console.log('aes:', cipherTxt) -// return cipherTxt -// } } -//fp = new FpService() -//fp.random_32() -//fp.get_cookie("dzfp-ssotoken","tpass_p3d8j63p8b6p4bbab8dca4832a7fj9cc=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImJjNzUxNmI4NWI0NjRiZjlhMDJlNzg2NWIxZmViMGE3In0.xMmdn82GoF9NH8ldYx5mCrHFZhP13041_34uZ51kF9INM7MB33rARWCqhCZiqNZUKwB1WkTH5jDIZLwh_bRYyw; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221920330690e83a-0f487f8b21c83b8-26001151-3153384-1920330690f1823%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkyMDMzMDY5MGU4M2EtMGY0ODdmOGIyMWM4M2I4LTI2MDAxMTUxLTMxNTMzODQtMTkyMDMzMDY5MGYxODIzIn0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%221920330690e83a-0f487f8b21c83b8-26001151-3153384-1920330690f1823%22%7D; tpass_mcsc7e2ssscb4sfmbsmas35sass2753b=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijk3ZjQ1NjU5MzA4ODRhNmFiOWIxMjNhZDY5MDdkYTU5In0.NABIuYcca0UKpWOwvjiut7f3yn-tIIGZyBBni7S1jFAoaRR_kaH8CTZLxSxfc6-Q6n5hcG1l94prwDFGgzZWYw; tpass_k238ck9eedkb48a9a5d7k5c2c5kkka58=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImZkZTE4NTFkZGJhNDQ0MWE5ZWJlMWFjODU5NTNiNjM0In0.qHK5SMznOicFnrhi-1MnF16y2QypCSNLtbi3KE2pD1kyz4yRpLE8Fm4aHQMJ5hMa5aO1ibB-iQ-npD7QkoP3qA; tpass_te95ftefe59243cbafta4fb82bbtfcte=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImViYTMzNDVhYTU0NjQ0NWZhOTdlYmViY2Q3MWNiNWQ4In0.Rk1-kzwo4fneL4FapgQzhzxC-vBVu2zpLHQVfnylQ88x6Ik5QNt3PuyfmqLdoenoR7y69BgAOM3GvLi_KFcsoA; tpass_q4q6b8aa469v4369ae7483c4vb45cvca=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijg3MWNhNzIyMmRmZjQ1YzQ4YmFjYzViMDExYTY1MjU2In0.rUzqjvnFTAwRxRa49yeiPWqHWNF8WRmsKPayVfGRLuMja5huBOmlpHc-kEXBiGh43ei3t-ZbT7EcvGRga0aZkQ; tpass_mb29dc78543X4X769Hd7d8a35Hdd5236=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjgxYTYwZjIxZmMwZTRlMDY5NTFkNDI1YWUwOWM3MjFjIn0.V1-LfcMe6VM9W4q_F15gqOxNbA2jRLRVpCml0WFvKTYAGdFqsi3JEgGBvMCL0SEkAOSVhGIn1A9ILjCAuiJ_hg; tpass_c5djdncfa7nj4n2cajna2j68cndbj2fc=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImI1NzM2MjUwMDE5MDQyMTNiYzViNmQ0NGI1MGRlMTZlIn0.Es7Q_0jUPcvGddK90anCqeEIBjtl52YZ3669quo27iVjnObAt580ZEHJPjCSLw9vu3HAtPY2SkjYuquc0tItqA; tpass_ue7c9954acea492784ac6g78939gc2e9=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImM4Y2Y1ZGZkYjJkMTQ0NGJiYjM0NGM1ZGJjZDlhY2UwIn0.dfWdZX2tAHcB5Xgb36Y5WQJabicYJYoURhAhWzKu4cSklCYc1lK6-fjbTbiRUNmW3hAQ0lUDUkH3DHVVTuvOjA; tpass_x774e745d5k24ex5a7kkk375x933f654=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjM0NjljNWY5MThkZTQ4M2JiY2QwNDcyMjgwMzgwZWFkIn0.NKypnkLFaewOcawUAg_fZQdbFAbgFU1Nqj3ibv3FumIKIW6AZXiD7c0ASR16aTa4B4XUBjrysQiXrHksxRX-OQ; oauth2_referer=etax.hubei.chinatax.gov.cn; tpass_tct8zta97w6c46zdt9zc2648227df5z2=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjVkNTg4ZjBmN2QxNjQ0NDdhZTczYjBlMzM2ZWIzMGYzIn0.Lmt8PQ7SLdivPrcoa6hxEIW2osZBMFc34ate7WKZ31AtSaOYDDMy1lzVmlBmqaIRNIJUhS18N_jJulWz4XAcJA; tpass_sa67ddd29sc94cga9f96s7da2772s6d7=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjVlZjcyMTNmYWYwZTRkYmRiNDMyODU5MmY2NDBjM2EyIn0.jSXIt0ul0pp0Qnb7s7VSdJxVmyfY7fPqzQQg4s2ATS1dluuM49H9Q93oveAxy7URB0s4nMTtWwyTq3mqB_5mpA; tpass_b6edq5qqc5cb4c3288q6aq6fab5qc3b4=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjFlYzI1Zjc4ZGQyMDRmNTQ5MTAxZGEyNDM2MjFmOGU1In0.0VH-6AoQlwsdXMCV6u9nAWCDBWw_sknQQbZy_IzhlrxXkanffsVByh63GYra3awUBma2w-c6WfCwQBdcJGukMg; znhd-ssotoken=a8a7bf26beac4fd4929980b20971b228; ZNHD_SECURITY_CHECK_TOKEN=e4dd8ea2c69440169aede2fdce9a3180; lzkqow39189=2bb488d931034436b6248e9f304424ec; DTSwUOYx7MiWN=ab2bb065ae0ed58c8a84593bb5a3028cb6197c4c212230fce7fbf44bb130b09; dzfp-ssotoken=684d411b247b45c3bcc27ab2e6f8fe68; SSO_SECURITY_CHECK_TOKEN=1100ce6e65af4dd7bb5cf78f795e16a5; lzkqow38189=1727141642601; c_time=12; MKls83gqduGS=0fce79cac178fb6e9a66ca06fa3610191e8668277ba8c269ff723d98e73fd12d893bf51bac776eed80b13155ab4b96ea") -//fp.reverse_str("","tpass_p3d8j63p8b6p4bbab8dca4832a7fj9cc=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImJjNzUxNmI4NWI0NjRiZjlhMDJlNzg2NWIxZmViMGE3In0.xMmdn82GoF9NH8ldYx5mCrHFZhP13041_34uZ51kF9INM7MB33rARWCqhCZiqNZUKwB1WkTH5jDIZLwh_bRYyw; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221920330690e83a-0f487f8b21c83b8-26001151-3153384-1920330690f1823%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkyMDMzMDY5MGU4M2EtMGY0ODdmOGIyMWM4M2I4LTI2MDAxMTUxLTMxNTMzODQtMTkyMDMzMDY5MGYxODIzIn0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%221920330690e83a-0f487f8b21c83b8-26001151-3153384-1920330690f1823%22%7D; tpass_mcsc7e2ssscb4sfmbsmas35sass2753b=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijk3ZjQ1NjU5MzA4ODRhNmFiOWIxMjNhZDY5MDdkYTU5In0.NABIuYcca0UKpWOwvjiut7f3yn-tIIGZyBBni7S1jFAoaRR_kaH8CTZLxSxfc6-Q6n5hcG1l94prwDFGgzZWYw; tpass_k238ck9eedkb48a9a5d7k5c2c5kkka58=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImZkZTE4NTFkZGJhNDQ0MWE5ZWJlMWFjODU5NTNiNjM0In0.qHK5SMznOicFnrhi-1MnF16y2QypCSNLtbi3KE2pD1kyz4yRpLE8Fm4aHQMJ5hMa5aO1ibB-iQ-npD7QkoP3qA; tpass_te95ftefe59243cbafta4fb82bbtfcte=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImViYTMzNDVhYTU0NjQ0NWZhOTdlYmViY2Q3MWNiNWQ4In0.Rk1-kzwo4fneL4FapgQzhzxC-vBVu2zpLHQVfnylQ88x6Ik5QNt3PuyfmqLdoenoR7y69BgAOM3GvLi_KFcsoA; tpass_q4q6b8aa469v4369ae7483c4vb45cvca=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijg3MWNhNzIyMmRmZjQ1YzQ4YmFjYzViMDExYTY1MjU2In0.rUzqjvnFTAwRxRa49yeiPWqHWNF8WRmsKPayVfGRLuMja5huBOmlpHc-kEXBiGh43ei3t-ZbT7EcvGRga0aZkQ; tpass_mb29dc78543X4X769Hd7d8a35Hdd5236=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjgxYTYwZjIxZmMwZTRlMDY5NTFkNDI1YWUwOWM3MjFjIn0.V1-LfcMe6VM9W4q_F15gqOxNbA2jRLRVpCml0WFvKTYAGdFqsi3JEgGBvMCL0SEkAOSVhGIn1A9ILjCAuiJ_hg; tpass_c5djdncfa7nj4n2cajna2j68cndbj2fc=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImI1NzM2MjUwMDE5MDQyMTNiYzViNmQ0NGI1MGRlMTZlIn0.Es7Q_0jUPcvGddK90anCqeEIBjtl52YZ3669quo27iVjnObAt580ZEHJPjCSLw9vu3HAtPY2SkjYuquc0tItqA; tpass_ue7c9954acea492784ac6g78939gc2e9=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImM4Y2Y1ZGZkYjJkMTQ0NGJiYjM0NGM1ZGJjZDlhY2UwIn0.dfWdZX2tAHcB5Xgb36Y5WQJabicYJYoURhAhWzKu4cSklCYc1lK6-fjbTbiRUNmW3hAQ0lUDUkH3DHVVTuvOjA; tpass_x774e745d5k24ex5a7kkk375x933f654=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjM0NjljNWY5MThkZTQ4M2JiY2QwNDcyMjgwMzgwZWFkIn0.NKypnkLFaewOcawUAg_fZQdbFAbgFU1Nqj3ibv3FumIKIW6AZXiD7c0ASR16aTa4B4XUBjrysQiXrHksxRX-OQ; oauth2_referer=etax.hubei.chinatax.gov.cn; tpass_tct8zta97w6c46zdt9zc2648227df5z2=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjVkNTg4ZjBmN2QxNjQ0NDdhZTczYjBlMzM2ZWIzMGYzIn0.Lmt8PQ7SLdivPrcoa6hxEIW2osZBMFc34ate7WKZ31AtSaOYDDMy1lzVmlBmqaIRNIJUhS18N_jJulWz4XAcJA; tpass_sa67ddd29sc94cga9f96s7da2772s6d7=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjVlZjcyMTNmYWYwZTRkYmRiNDMyODU5MmY2NDBjM2EyIn0.jSXIt0ul0pp0Qnb7s7VSdJxVmyfY7fPqzQQg4s2ATS1dluuM49H9Q93oveAxy7URB0s4nMTtWwyTq3mqB_5mpA; tpass_b6edq5qqc5cb4c3288q6aq6fab5qc3b4=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjFlYzI1Zjc4ZGQyMDRmNTQ5MTAxZGEyNDM2MjFmOGU1In0.0VH-6AoQlwsdXMCV6u9nAWCDBWw_sknQQbZy_IzhlrxXkanffsVByh63GYra3awUBma2w-c6WfCwQBdcJGukMg; znhd-ssotoken=a8a7bf26beac4fd4929980b20971b228; ZNHD_SECURITY_CHECK_TOKEN=e4dd8ea2c69440169aede2fdce9a3180; lzkqow39189=2bb488d931034436b6248e9f304424ec; DTSwUOYx7MiWN=ab2bb065ae0ed58c8a84593bb5a3028cb6197c4c212230fce7fbf44bb130b09; dzfp-ssotoken=684d411b247b45c3bcc27ab2e6f8fe68; SSO_SECURITY_CHECK_TOKEN=1100ce6e65af4dd7bb5cf78f795e16a5; lzkqow38189=1727141642601; c_time=12; MKls83gqduGS=0fce79cac178fb6e9a66ca06fa3610191e8668277ba8c269ff723d98e73fd12d893bf51bac776eed80b13155ab4b96ea") -//fp.get_url("/szzhzz/qlfpcx/v1/queryFpjcxx") -//fp.hex_md5("2e6f8fe68c3bcc27ab11","/szzhzz/qlfpcx/v1/queryFpjcxx") -//fp.aes_encrypt('aebb350059d1768250bc36a5320d180e{"gjbq":"1","fpztDm":["01","02","03","04"],"fplyDm":"0","fplxDm":[],"kprqq":"2024-09-08","kprqz":"2024-09-24","tfrqq":"2024-09-08","tfrqz":"2024-09-24","sflzfp":"","dtBz":"N","pageNumber":1,"pageSize":20}',"714acfe38a3df9da5651d01fd223d74d") module.exports = FpService \ No newline at end of file diff --git a/routes/service/static/fp/fp-crypt.js b/routes/service/static/fp/fp-crypt.js index fa90994..7b27569 100644 --- a/routes/service/static/fp/fp-crypt.js +++ b/routes/service/static/fp/fp-crypt.js @@ -18,7 +18,7 @@ class FpCrypt { /** * 处理 url 后缀 * @param t url - * @param e + * @param e xhr * @returns {*} */ handleSuffix(t, e) { @@ -65,16 +65,17 @@ class FpCrypt { s = this.Ke(s); var l, f = (new Date)['valueOf'](), d = (this.qe()["num"] % 2) === 0 ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; - logger("tokenKey 加密方法选择", d, e) - // d = ((this.qe()['num'] % 2) === 0) ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; if ((d >= 0) && (d <= 50)) { + logger('对dzfp-ssotoken进行加密') l = this.Qs(f) } else if ((d >= 51) && d <= 100) { + logger('对tokenKey进行加密') l = this.Qt(f, e) } var h = s['indexOf']("?") === (s["length"] - 1) ? "" : s['indexOf']("?") > -1 ? "&" : "?", p = s += ""['concat'](h, "ruuid=")['concat'](f); if (o) { + logger(`对 ${o} 进行加密`) var v = p['split']("?")['splice'](1); for (var b in v['map'](function (t) { return t["split"]("=")[0] @@ -180,44 +181,64 @@ class FpCrypt { } Ke(t) { - var n = "6|5|4|3|0|1|2"["split"]("|"), o = 0; - while (1) { - switch (n[o++]) { - case "0": - (s["length"] > 1) && (f = s[0], l = s[1]["split"]("&")); - continue; - case "1": - for (var a = 0; a < l["length"]; a++) { - var c = l[a], u = c.split("="); - ("t" !== u[0]) && "urlyzm" !== u[0] && "ruuid" !== u[0] && (f += "".concat(f.includes("?") ? "&" : "?").concat(c)) - } - continue; - case "2": - (-1 === f.indexOf("?")) && (f += "?"); - logger(`处理url后缀${t}完成返回${f}`) - return f; - case "3": - var s = t["split"]("?"), l = []; - continue; - case "4": - (0 !== f["indexOf"]("/")) && (f += "/"); - continue; - case "5": - var f = t; - continue; - case "6": - if ("" === t || null == t) { - return t; - } - continue - } - break + var s, l, f; + if ("" === t || null == t) { + return t; } + f = t; + (0 !== f["indexOf"]("/")) && (f += "/"); + s = t["split"]("?"); + l = []; + (s["length"] > 1) && (f = s[0], l = s[1]["split"]("&")); + for (var a = 0; a < l["length"]; a++) { + var c = l[a], u = c.split("="); + ("t" !== u[0]) && "urlyzm" !== u[0] && "ruuid" !== u[0] && (f += "".concat(f.includes("?") ? "&" : "?").concat(c)) + } + (-1 === f.indexOf("?")) && (f += "?"); + logger(`处理url后缀${t}完成返回${f}`) + return f; + } + // Ke(t) { + // var n = "6|5|4|3|0|1|2"["split"]("|"), o = 0; + // while (1) { + // switch (n[o++]) { + // case "0": + // (s["length"] > 1) && (f = s[0], l = s[1]["split"]("&")); + // continue; + // case "1": + // for (var a = 0; a < l["length"]; a++) { + // var c = l[a], u = c.split("="); + // ("t" !== u[0]) && "urlyzm" !== u[0] && "ruuid" !== u[0] && (f += "".concat(f.includes("?") ? "&" : "?").concat(c)) + // } + // continue; + // case "2": + // (-1 === f.indexOf("?")) && (f += "?"); + // logger(`处理url后缀${t}完成返回${f}`) + // return f; + // case "3": + // var s = t["split"]("?"), l = []; + // continue; + // case "4": + // (0 !== f["indexOf"]("/")) && (f += "/"); + // continue; + // case "5": + // var f = t; + // continue; + // case "6": + // if ("" === t || null == t) { + // return t; + // } + // continue + // } + // break + // } + // } + he(t) { let res = CryptoJS.MD5(t).toString(); - logger('生成32位小写md5', t, res) + logger(t, '生成32位小写md5 --->', res) return res } @@ -246,50 +267,58 @@ class FpCrypt { }; Ae(t) { - var n = "4|2|1|3|0"["split"]("|"), i = 0, o, l, s; - while (1) { - switch (n[i++]) { - case "0": - return null; - case "1": - o = s["indexOf"](l); - continue; - case "2": - l += "="; - continue; - case "3": - if ((-1 !== o)) { - var a = (o + l["length"]), c = s.indexOf(";", a); - (-1 === c) && (c = s.length); - var u = s.substring(a, c); - var res = unescape(u); - logger('获取token', t, '16进制解码', res) - return res; - } - continue; - case "4": - // todo: 这里获取 cookie - s = this.cookie; - l = JSON["parse"](JSON["stringify"](t)); - continue - } - break + var o, l, s; + s = this.cookie; + l = JSON["parse"](JSON["stringify"](t)); + l += "="; + o = s["indexOf"](l); + if ((-1 !== o)) { + var a = (o + l["length"]), c = s.indexOf(";", a); + (-1 === c) && (c = s.length); + var u = s.substring(a, c); + var res = unescape(u); + logger('获取token', t, '16进制解码', res) + return res; } + return null; }; + // Ae(t) { + // var n = "4|2|1|3|0"["split"]("|"), i = 0, o, l, s; + // while (1) { + // switch (n[i++]) { + // case "0": + // return null; + // case "1": + // o = s["indexOf"](l); + // continue; + // case "2": + // l += "="; + // continue; + // case "3": + // if ((-1 !== o)) { + // var a = (o + l["length"]), c = s.indexOf(";", a); + // (-1 === c) && (c = s.length); + // var u = s.substring(a, c); + // var res = unescape(u); + // logger('获取token', t, '16进制解码', res) + // return res; + // } + // continue; + // case "4": + // // todo: 这里获取 cookie + // s = this.cookie; + // l = JSON["parse"](JSON["stringify"](t)); + // continue + // } + // break + // } + // }; + a(t) { return t.reverse() }; } -// let fpCrypt = new FpCrypt("oauth2_referer=dppt.hubei.chinatax.gov.cn; dzfp-ssotoken=37c347d5ab014bacb418d7756b9e7ee1; SSO_SECURITY_CHECK_TOKEN=91081171bc604d16910500c4982e74ea; c_time=12; lzkqow39189=c6edeb37685b423c8298eaa8e1b41097; DTSwUOYx7MiWN=5c199c6d5d4fda3505876d98a7e173007f4ab2ae661119adf9143257d71d06e5; lzkqow38189=1727098216617; MKls83gqduGS=e4ec10654056af2f2641b3ce60f124ee7cc607e9ac44bb8b86b9e6d5879ce1c3c7b827862a2ff46be48061c039dccddf"); - -// fpCrypt.handleParam('{"gjbq": "1","fpztDm": ["01","02","03","04"],"fplyDm": "0","fplxDm": [],"kprqq": "2024-09-08","kprqz": "2024-09-24","tfrqq": "2024-09-08","tfrqz": "2024-09-24","sflzfp": "","dtBz": "N","pageNumber": 1,"pageSize": 20}', -// "/szzhzz/qlfpcx/v1/queryFpjcxx?t=1727101152631") - -// let handleSuffix = fpCrypt.handleSuffix("/szzhzz/qlfpcx/v1/queryFpjcxx?t=1727115438241"); -// console.log(handleSuffix) - - module.exports = FpCrypt \ No newline at end of file From 16c2c99588995ff0e4b8cf30521a612f1f7acd20 Mon Sep 17 00:00:00 2001 From: liudongqi Date: Fri, 27 Sep 2024 10:44:56 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/service/static/fp/fp-crypt.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/routes/service/static/fp/fp-crypt.js b/routes/service/static/fp/fp-crypt.js index 7b27569..8d087ce 100644 --- a/routes/service/static/fp/fp-crypt.js +++ b/routes/service/static/fp/fp-crypt.js @@ -44,8 +44,8 @@ class FpCrypt { /** * 处理 Param - * @param t - * @param e + * @param t param + * @param e url * @returns {{mesKey: string, enMesKey: string, enVal}} */ handleParam(t, e) { @@ -55,7 +55,7 @@ class FpCrypt { if (t != null && t !== '') { l['enVal'] = this.Ye(t, e); } - logger(`处理返回`, l) + logger(`${t} ,${e} 处理返回`, l) return l } From b2594b9c5e88708a61681a87e8850fa08305e9a8 Mon Sep 17 00:00:00 2001 From: liudongqi Date: Fri, 27 Sep 2024 10:54:13 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/service/static/fp/fp-crypt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/service/static/fp/fp-crypt.js b/routes/service/static/fp/fp-crypt.js index 8d087ce..3790dfe 100644 --- a/routes/service/static/fp/fp-crypt.js +++ b/routes/service/static/fp/fp-crypt.js @@ -55,7 +55,7 @@ class FpCrypt { if (t != null && t !== '') { l['enVal'] = this.Ye(t, e); } - logger(`${t} ,${e} 处理返回`, l) + logger(`${t} ,${e} 处理返回${JSON.stringify(l)}`); return l } From 63f8cfb627e1773b5a70d027cfcc56ccfcd87641 Mon Sep 17 00:00:00 2001 From: liudongqi Date: Fri, 27 Sep 2024 11:20:46 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/Fp.js | 8 ++++---- routes/service/FpService.js | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/routes/Fp.js b/routes/Fp.js index c570083..728d028 100644 --- a/routes/Fp.js +++ b/routes/Fp.js @@ -25,10 +25,10 @@ router.post('/getLos', async (req, res) => { try { // 执行 let los = await fpService.get_los(url, param, html, loginCookieStr, publicKey); - if (!los || los['hd'] === '') { - console.error(`${uuid}; 生成错误!请检查 html 或 cookie, los:${JSON.stringify(los)}`) - return res.status(500).send('生成错误!请检查 html 或 cookie') - } + // if (!los || los['hd'] === '') { + // console.error(`${uuid}; 生成错误!请检查 html 或 cookie, los:${JSON.stringify(los)}`) + // return res.status(500).send('生成错误!请检查 html 或 cookie') + // } return res.status(200).send(los); } catch (e) { console.error(e.stack) diff --git a/routes/service/FpService.js b/routes/service/FpService.js index a4cd5b1..aa2c2ef 100644 --- a/routes/service/FpService.js +++ b/routes/service/FpService.js @@ -62,6 +62,7 @@ class FpService { } // 处理 xhr 后缀 let handleSuffix = fpCrypt.handleSuffix(urlPath); + console.log(`处理 xhr 后缀 ${JSON.stringify(handleSuffix)}`) let los = window[window["_d_ts"]](handleSuffix, enParam); headers['lzkqow23819'] = los.hd From 96eea1aa36cb58aef2eac192aeaaf4f2901010df Mon Sep 17 00:00:00 2001 From: linyuanshi Date: Fri, 27 Sep 2024 11:27:46 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/service/FpService.js | 1 + routes/service/static/fp/fp-crypt.js | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/routes/service/FpService.js b/routes/service/FpService.js index aa2c2ef..60bcd0e 100644 --- a/routes/service/FpService.js +++ b/routes/service/FpService.js @@ -55,6 +55,7 @@ class FpService { // 处理 Param let handleParam = fpCrypt.handleParam(param, urlPath); + console.log(`处理 Param 结果 ${JSON.stringify(handleParam)}`) var enParam = "" if (handleParam["enVal"]) { enParam = JSON.stringify({'Jmbw': handleParam["enVal"]}); diff --git a/routes/service/static/fp/fp-crypt.js b/routes/service/static/fp/fp-crypt.js index 3790dfe..e06547d 100644 --- a/routes/service/static/fp/fp-crypt.js +++ b/routes/service/static/fp/fp-crypt.js @@ -1,6 +1,6 @@ const CryptoJS = require('crypto-js'); -logger = console.info; +//logger = console.info; class FpCrypt { cookie = ""; @@ -38,7 +38,7 @@ class FpCrypt { var u = (new Date)['valueOf'](); s += '&urls='['concat'](u) } - logger(`处理url后缀${t} 完成返回${s}`) +// logger(`处理url后缀${t} 完成返回${s}`) return s; } @@ -55,7 +55,7 @@ class FpCrypt { if (t != null && t !== '') { l['enVal'] = this.Ye(t, e); } - logger(`${t} ,${e} 处理返回${JSON.stringify(l)}`); +// logger(`${t} ,${e} 处理返回${JSON.stringify(l)}`); return l } @@ -66,16 +66,16 @@ class FpCrypt { var l, f = (new Date)['valueOf'](), d = (this.qe()["num"] % 2) === 0 ? (50 * Math['random'](1)) : (49 * Math['random']()) + 51; if ((d >= 0) && (d <= 50)) { - logger('对dzfp-ssotoken进行加密') +// logger('对dzfp-ssotoken进行加密') l = this.Qs(f) } else if ((d >= 51) && d <= 100) { - logger('对tokenKey进行加密') +// logger('对tokenKey进行加密') l = this.Qt(f, e) } var h = s['indexOf']("?") === (s["length"] - 1) ? "" : s['indexOf']("?") > -1 ? "&" : "?", p = s += ""['concat'](h, "ruuid=")['concat'](f); if (o) { - logger(`对 ${o} 进行加密`) +// logger(`对 ${o} 进行加密`) var v = p['split']("?")['splice'](1); for (var b in v['map'](function (t) { return t["split"]("=")[0] @@ -143,7 +143,7 @@ class FpCrypt { ke(t, e) { var n, i, a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), c = []; if (e = e || a.length, t) for (n = 0; n < t; n++) c[n] = a[0 | (Math["random"]() * e)]; else for (c[8] = c[13] = c[18] = c[23] = "-", c[14] = "4", n = 0; (n < 36); n++) c[n] || (i = 0 | (16 * Math["random"]()), c[n] = a[19 === n ? 8 | (3 & i) : i]); - logger(`生成随机 ${e} 位字符串`, c["join"]("")) +// logger(`生成随机 ${e} 位字符串`, c["join"]("")) return c["join"]("") } @@ -153,7 +153,7 @@ class FpCrypt { mode: CryptoJS.mode.ECB, //ECB模式 padding: CryptoJS.pad.Pkcs7 //padding处理 }).toString(); - logger(`AES 加密:${t},${e} 加密所得${res}`) +// logger(`AES 加密:${t},${e} 加密所得${res}`) return res; } @@ -176,7 +176,7 @@ class FpCrypt { u += this.a(l["split"](""))["join"]("") } var res = u["substring"](0, 20); - logger('倒叙处理字符返回20位', res) +// logger('倒叙处理字符返回20位', res) return res; } @@ -195,7 +195,7 @@ class FpCrypt { ("t" !== u[0]) && "urlyzm" !== u[0] && "ruuid" !== u[0] && (f += "".concat(f.includes("?") ? "&" : "?").concat(c)) } (-1 === f.indexOf("?")) && (f += "?"); - logger(`处理url后缀${t}完成返回${f}`) +// logger(`处理url后缀${t}完成返回${f}`) return f; } @@ -238,7 +238,7 @@ class FpCrypt { he(t) { let res = CryptoJS.MD5(t).toString(); - logger(t, '生成32位小写md5 --->', res) +// logger(t, '生成32位小写md5 --->', res) return res } @@ -277,7 +277,7 @@ class FpCrypt { (-1 === c) && (c = s.length); var u = s.substring(a, c); var res = unescape(u); - logger('获取token', t, '16进制解码', res) +// logger('获取token', t, '16进制解码', res) return res; } return null;