commit 3436a1e38f2727f047f397866e7782ed3057cd18 Author: Ken Stevan Date: Tue Apr 15 10:23:39 2025 +0800 initiate diff --git a/ab_19.js b/ab_19.js new file mode 100644 index 0000000..6285716 --- /dev/null +++ b/ab_19.js @@ -0,0 +1,1038 @@ + +const BASE64_CHARS = 'ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe'; + + +function customBase64Encode33(input) { + let base64Chars = BASE64_CHARS; + let output = ""; + let chr1, chr2, chr3, enc1, enc2, enc3, enc4; + let i = 0; + + while (i < input.length) { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + + output = output + + base64Chars.charAt(enc1) + base64Chars.charAt(enc2) + + base64Chars.charAt(enc3) + base64Chars.charAt(enc4); + } + + return output; +} + +function get_arr(t, a) { + reg = { + "chunk": [], + "reg": [1937774191, 1226093241, 388252375, 3666478592, 2842636476, 372324522, 3817729613, 2969243214], + "size": 0, + "write": function (e) { + var o = typeof e === "string" ? function (e) { + var n = encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, function (e, t) { + return String.fromCharCode("0x" + t); + }), + o = new Array(n.length); + return Array.prototype.forEach.call(n, function (e, t) { + o[t] = e.charCodeAt(0); + }), o; + }(e) : e; + this.size += o.length; + var i = 64 - this.chunk.length; + if (o.length < i) this.chunk = this.chunk.concat(o); else for (this.chunk = this.chunk.concat(o.slice(0, i)); this.chunk.length >= 64;) this._compress(this.chunk), i < o.length ? this.chunk = o.slice(i, Math.min(i + 64, o.length)) : this.chunk = [], i += 64; + }, + "sum": function (r, n) { + r && (this.reset(), this.write(r)), this._fill(); + for (var a = 0; a < this.chunk.length; a += 64) this._compress(this.chunk.slice(a, a + 64)); + var c = null; + if (n == "hex") { + c = ""; + for (a = 0; a < 8; a++) c += gt(this.reg[a].toString(16), 8, "0"); + } else for (c = new Array(32), a = 0; a < 8; a++) { + var f = this.reg[a]; + c[4 * a + 3] = (255 & f) >>> 0, f >>>= 8, c[4 * a + 2] = (255 & f) >>> 0, f >>>= 8, c[4 * a + 1] = (255 & f) >>> 0, f >>>= 8, c[4 * a] = (255 & f) >>> 0; + } + return this.reset(), c; + }, + "_compress": function (r) { + if (r < 64) console.error("compress error: not enough data"); else { + for (var o = function (e) { + for (var t = new Array(132), r = 0; r < 16; r++) t[r] = e[4 * r] << 24, t[r] |= e[4 * r + 1] << 16, t[r] |= e[4 * r + 2] << 8, t[r] |= e[4 * r + 3], t[r] >>>= 0; + for (var n = 16; n < 68; n++) { + var o = t[n - 16] ^ t[n - 9] ^ Ct(t[n - 3], 15); + o = o ^ Ct(o, 15) ^ Ct(o, 23), t[n] = (o ^ Ct(t[n - 13], 7) ^ t[n - 6]) >>> 0; + } + for (n = 0; n < 64; n++) t[n + 68] = (t[n] ^ t[n + 4]) >>> 0; + return t; + }(r), i = this.reg.slice(0), a = 0; a < 64; a++) { + var c = Ct(i[0], 12) + i[4] + Ct(St(a), a), + f = ((c = Ct(c = (4294967295 & c) >>> 0, 7)) ^ Ct(i[0], 12)) >>> 0, + u = kt(a, i[0], i[1], i[2]); + u = (4294967295 & (u = u + i[3] + f + o[a + 68])) >>> 0; + var s = xt(a, i[4], i[5], i[6]); + s = (4294967295 & (s = s + i[7] + c + o[a])) >>> 0, i[3] = i[2], i[2] = Ct(i[1], 9), i[1] = i[0], i[0] = u, i[7] = i[6], i[6] = Ct(i[5], 19), i[5] = i[4], i[4] = (s ^ Ct(s, 9) ^ Ct(s, 17)) >>> 0; + } + for (var l = 0; l < 8; l++) this.reg[l] = (this.reg[l] ^ i[l]) >>> 0; + } + }, + "_fill": function () { + var o = 8 * this.size, + i = this.chunk.push(128) % 64; + for (64 - i < 8 && (i -= 64); i < 56; i++) this.chunk.push(0); + for (var a = 0; a < 4; a++) { + var c = Math.floor(o / 4294967296); + this.chunk.push(c >>> 8 * (3 - a) & 255); + } + for (a = 0; a < 4; a++) this.chunk.push(o >>> 8 * (3 - a) & 255); + } + } + + reg.write(t) + reg._fill(); + + function Ct(e, t) { + return (e << (t %= 32) | e >>> 32 - t) >>> 0; + } + + function St(e) { + return 0 <= e && e < 16 ? 2043430169 : 16 <= e && e < 64 ? 2055708042 : void console.error("invalid j for constant Tj"); + } + + function kt(e, t, r, n) { + return 0 <= e && e < 16 ? (t ^ r ^ n) >>> 0 : 16 <= e && e < 64 ? (t & r | t & n | r & n) >>> 0 : (console.error("invalid j for bool function FF"), 0); + } + + function xt(e, t, r, n) { + return 0 <= e && e < 16 ? (t ^ r ^ n) >>> 0 : 16 <= e && e < 64 ? (t & r | ~t & n) >>> 0 : (console.error("invalid j for bool function GG"), 0); + } + + for (var i = 0; i < reg["chunk"]["length"]; i += 64) { + reg["_compress"](reg["chunk"]["slice"](i, i + 64)); + } + + var o = null; + if (a == "hex") { + o = ""; + for (i = 0; i < 8; i++) + o += oe(reg["reg"][i]["toString"](16), 8, "0") + } else { + for (o = new Array(32), + i = 0; i < 8; i++) { + var c = reg.reg[i]; + o[4 * i + 3] = (255 & c) >>> 0, + c >>>= 8, + o[4 * i + 2] = (255 & c) >>> 0, + c >>>= 8, + o[4 * i + 1] = (255 & c) >>> 0, + c >>>= 8, + o[4 * i] = (255 & c) >>> 0 + } + } + return o; +} + +function enc(url, data, userAgent) { + // 生成乱码字符串 + var params = url.slice(url.indexOf("?") + 1) + "dhzx"; + data += "dhzx"; + var garbledString = getGarbledString(params, data, userAgent); + var short_str = "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe" + var ABogus = ""; + // 依次生成七组字符串 + let j = 0 + for (var i = 0; i <= garbledString.length; i += 3) { + if ((i + 3) <= garbledString.length) { + var charCodeAtNum0 = garbledString.charCodeAt(i); + var charCodeAtNum1 = garbledString.charCodeAt(i + 1); + var charCodeAtNum2 = garbledString.charCodeAt(i + 2); + var baseNum = charCodeAtNum2 | charCodeAtNum1 << 8 | charCodeAtNum0 << 16; + + var str1 = short_str[(baseNum & 16515072) >> 18]; + var str2 = short_str[(baseNum & 258048) >> 12]; + var str3 = short_str[(baseNum & 4032) >> 6]; + var str4 = short_str[baseNum & 63]; + ABogus += str1 + str2 + str3 + str4; + } + if (i + 3 > garbledString.length) { + let u = garbledString.length - j + if (u === 2) { + var charCodeAtNum0 = garbledString.charCodeAt(j); + var charCodeAtNum1 = garbledString.charCodeAt(j + 1); + var baseNum = charCodeAtNum1 << 8 | charCodeAtNum0 << 16; + var str1 = short_str[(baseNum & 16515072) >> 18]; + var str2 = short_str[(baseNum & 258048) >> 12]; + var str3 = short_str[(baseNum & 4032) >> 6]; + ABogus += str1 + str2 + str3 + '='; + } + if (u === 1) { + var charCodeAtNum0 = garbledString.charCodeAt(j); + var baseNum = 0 | charCodeAtNum0 << 16; + var str1 = short_str[(baseNum & 16515072) >> 18]; + var str2 = short_str[(baseNum & 258048) >> 12]; + ABogus += str1 + str2 + '=' + '='; + } + + } + j += 3 + } + return ABogus; +} + +function _0x46fa4c(a, c) { + let e, b = [], d = 0, f = ""; + for (let a = 0; a < 256; a++) { + b[a] = a; + } + for (let c = 0; c < 256; c++) { + d = (d + b[c] + a.charCodeAt(c % a.length)) % 256, + e = b[c], + b[c] = b[d], + b[d] = e; + } + let t = 0; + d = 0; + for (let a = 0; a < c.length; a++) { + t = (t + 1) % 256, + d = (d + b[t]) % 256, + e = b[t], + b[t] = b[d], + b[d] = e, + f += String.fromCharCode(c.charCodeAt(a) ^ b[(b[t] + b[d]) % 256]); + } + return f; +} + +function getGarbledString(params, data, userAgent) { + let timestamp1 = Date.now(), timestamp2 = timestamp1 - Math.floor(Math.random() * 10); + let arr_29 = get_arr29(timestamp1, timestamp2, params, data, userAgent) + // let a = get_fromCharCodeStr1(); + let a = topHeaderRandomGarbledCharacters(); + let b = abGarbledCharacters(String.fromCharCode.apply(null, arr_29)) + return a + b; +} + +function abGarbledCharacters(userAgent) { + let arr_256 = ab_arr_256(); + let n4 = 0; + let ans = ""; + for (let i = 0; i < userAgent.length; i++) { + let n2 = (i + 1) % 256; + let n3 = n4 + arr_256[n2] + n4 = n3 % 256 + let old_arr_n2 = arr_256[n2] + arr_256[n2] = arr_256[n4] + arr_256[n4] = old_arr_n2 + let n5 = userAgent.charCodeAt(i); + let n6 = arr_256[n2] + old_arr_n2; + let n7 = n6 % 256 + let n8 = n5 ^ arr_256[n7] + ans += String.fromCharCode(n8) + } + return ans; +} + +function ab_arr_256() { + let nums = [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] + let previousValue = 0; + let lm = String.fromCharCode(211); + for (let i = 0; i < nums.length; i++) { + let num1 = previousValue * nums[i]; + previousValue = (num1 + previousValue + lm.charCodeAt(0)) % 256 + let tmp = nums[i]; + nums[i] = nums[previousValue] + nums[previousValue] = tmp + } + return nums; +} + +function get_arr29(dateTime1, dateTime2, params, data, userAgent) { + let parArr = get_arr(get_arr(params)) + let dataArr = get_arr(get_arr(data)) + let ua_salt; + switch (userAgent.indexOf('Win')) { + case -1: + ua_salt = 0; + break; + default: + ua_salt = 0; + } + var browser_arr = get_arr(encryptionUa(uaGarbledCharacters(userAgent, ua_salt))); + let arr = [] + let arr2 = [] + let num = get_arr2(userAgent) + let dateTime3 = (parseFloat(Date.now()) - 1721836800000) / 1000 / 60 / 60 / 24 / 14 >> 0 + let arr0 = randomGarbledCharactersArrayList(); + arr[0] = 41; + arr[1] = dateTime3; + arr[2] = 5 + arr[3] = (parseFloat(dateTime1) - parseFloat(dateTime2)) + 3 & 255; + arr[4] = dateTime1 >> 0 & 255; + arr[5] = dateTime1 >> 8 & 255; + arr[6] = dateTime1 >> 16 & 255; + arr[7] = dateTime1 >> 24 & 255; + arr[8] = dateTime1 / 256 / 256 / 256 / 256 & 255; + arr[9] = dateTime1 / 256 / 256 / 256 / 256 / 256 & 255; + arr[10] = 1 % 256 & 255; + arr[11] = 1 / 256 & 255; + arr[12] = 1 & 255; + arr[13] = 1 >> 8 & 255; + // arr[14] = 602 % 401 % 256 & 255; + arr[14] = 1; + arr[15] = 0 % 101 % 256 & 255; + arr[16] = 0 % 201 % 256 & 255; + arr[17] = 0 % 101 % 256 & 255; + arr[18] = ua_salt & 255; + arr[19] = ua_salt >> 8 & 255; + arr[20] = ua_salt >> 16 & 255; + arr[21] = ua_salt >> 24 & 255; + arr[22] = parArr[9]; + arr[23] = parArr[18]; + arr[24] = 3; + arr[25] = parArr[3]; + ; + arr[26] = dataArr[10]; + arr[27] = dataArr[19]; + arr[28] = 4; + arr[29] = dataArr[4]; + arr[30] = browser_arr[11]; + arr[31] = browser_arr[21]; + arr[32] = 5; + arr[33] = browser_arr[5]; + arr[34] = dateTime2 >> 0 & 255; + arr[35] = dateTime2 >> 8 & 255; + arr[36] = dateTime2 >> 16 & 255; + arr[37] = dateTime2 >> 24 & 255; + arr[38] = dateTime2 / 256 / 256 / 256 / 256 & 255; + arr[39] = dateTime2 / 256 / 256 / 256 / 256 / 256 & 255; + arr[40] = 3; + let arr32 = 6241; + arr[41] = arr32 >> 0 & 255; + arr[42] = arr32 >> 8 & 255; + arr[43] = arr32 >> 16 & 255; + arr[44] = arr32 >> 24 & 255; + let arr36 = 6383; + arr[45] = arr36 & 255; + arr[46] = arr36 >> 8 & 255; + arr[47] = arr36 >> 16 & 255; + arr[48] = arr36 >> 24 & 255; + let last_num_one = getLast_3Num(dateTime1) + arr[49] = num.length + arr[50] = num.length & 255 + arr[51] = num.length >> 8 & 255 + arr[52] = last_num_one.length + arr[53] = last_num_one.length & 255 + arr[54] = last_num_one.length >> 8 & 255 + let last_num = getLastNum2(arr0, arr) + + arr2[0] = arr[9] + arr2[1] = arr[18] + arr2[2] = arr[30] + arr2[3] = arr[35] + arr2[4] = arr[47] + arr2[5] = arr[4] + arr2[6] = arr[44] + arr2[7] = arr[19] + arr2[8] = arr[10] + arr2[9] = arr[23] + arr2[10] = arr[12] + arr2[11] = arr[40]; + arr2[12] = arr[25]; + arr2[13] = arr[42]; + arr2[14] = arr[3]; + arr2[15] = arr[22]; + arr2[16] = arr[38]; + arr2[17] = arr[21]; + arr2[18] = arr[5]; + arr2[19] = arr[45]; + arr2[20] = arr[1]; + arr2[21] = arr[29]; + arr2[22] = arr[6]; + arr2[23] = arr[43]; + arr2[24] = arr[33]; + arr2[25] = arr[14]; + arr2[26] = arr[36]; + arr2[27] = arr[37]; + arr2[28] = arr[2]; + arr2[29] = arr[46]; + arr2[30] = arr[15]; + arr2[31] = arr[48]; + arr2[32] = arr[31]; + arr2[33] = arr[26]; + arr2[34] = arr[16]; + arr2[35] = arr[13]; + arr2[36] = arr[8]; + arr2[37] = arr[41]; + arr2[38] = arr[27]; + arr2[39] = arr[17]; + arr2[40] = arr[39] + arr2[41] = arr[20] + arr2[42] = arr[11] + arr2[43] = arr[0] + arr2[44] = arr[34] + arr2[45] = arr[7] + arr2[46] = arr[50] + arr2[47] = arr[51] + arr2[48] = arr[53] + arr2[49] = arr[54] + + let newArr = [...arr2, ...num] + let newArr2 = [...newArr, ...last_num_one] + newArr2.push(last_num) + return getNumList(arr0, newArr2); +} + +function getLast_3Num(dateTime1) { + let intStr = parseFloat(dateTime1) + intStr += 3 + let timestamp1 = (intStr & 255) + "," + let num = [] + for (let i = 0; i < timestamp1.length; i++) { + num.push(timestamp1.charCodeAt(i)) + } + return num; +} + +function get_arr2(userAgent) { + let data = ''; + switch (userAgent.indexOf('Win')) { + case -1: + // data = '2056|390|2056|1202|0|44|0|0|2056|1203|2056|1329|2056|2815|30|30|MacIntel'; + data = '2056|1080|2056|1201|2056|1201|2056|1329|MacIntel'; + break; + default: + data = '2056|1080|2056|1201|2056|1201|2056|1329|Win32'; + } + // let data = '2056|1087|2056|1208|0|44|0|0|2056|1209|2056|1329|2056|1087|30|30|MacIntel' + let sum = [] + for (let i = 0; i < data.length; i++) { + sum.push(data.charCodeAt(i)) + } + return sum +} + +function getLastNum2(arr1, arr) { + const xorResult = arr1[0] ^ arr1[1] ^ arr1[2] ^ arr1[3] ^ arr1[4] ^ arr1[5] ^ arr1[6] ^ arr1[7] ^ arr[0] ^ arr[1] ^ arr[2] ^ arr[3] ^ arr[4] ^ arr[5] ^ arr[6] ^ arr[7] ^ arr[8] ^ arr[9] ^ arr[10] ^ arr[11] ^ arr[12] ^ arr[13] ^ arr[14] ^ arr[15] ^ arr[16] ^ arr[17] ^ arr[18] ^ arr[19] ^ arr[20] ^ arr[21] ^ arr[22] ^ arr[23] ^ arr[25] ^ arr[26] ^ arr[27] ^ arr[29] ^ arr[30] ^ arr[31] ^ arr[33] ^ arr[34] ^ arr[35] ^ arr[36] ^ arr[37] ^ arr[38] ^ arr[39] ^ arr[40] ^ arr[41] ^ arr[42] ^ arr[43] ^ arr[44] ^ arr[45] ^ arr[46] ^ arr[47] ^ arr[48] ^ arr[50] ^ arr[51] ^ arr[53] ^ arr[54] + return xorResult +} + +function getNumList(arr0, arrAr) { + let numList = [] + // 传入 102 位数组 + for (let i = 0; i < arrAr.length; i += 3) { + if (i + 2 >= arrAr.length) { + if (i + 1 >= arrAr.length) { + let num1 = arrAr[i] + numList.push(num1) + } else { + let num1 = arrAr[i] + let num2 = arrAr[i + 1] + numList.push(num1) + numList.push(num2) + } + } else { + let random = Math.random() * 1000 & 255 + let num1 = (random & 145) | (arrAr[i] & 110) + let num2 = (random & 66) | (arrAr[i + 1] & 189) + let num3 = (random & 44) | (arrAr[i + 2] & 211) + let num4 = ((arrAr[i] & 145) | (arrAr[i + 1] & 66)) | (arrAr[i + 2] & 44) + numList.push(num1) + numList.push(num2) + numList.push(num3) + numList.push(num4) + } + + } + return [...arr0, ...numList]; +} + +function topHeaderRandomGarbledCharacters() { + let arr = [] + let random = Math.random() * 65535 + // let num1 = random & 255 + let num1 = random & 255 + let num2 = Math.random() * 40 >> 0 + arr.push((num1 & 170) | (3 & 85)) + arr.push((num1 & 85) | (3 & 170)) + arr.push((num2 & 170) | (82 & 85)) + arr.push((num2 & 85) | (82 & 170)) + return String.fromCharCode.apply(null, arr); +} + +function randomGarbledCharactersArrayList() { + function randomGarbledCharactersArray1() { + let arr = [] + random = Math.random() * 65535 + num1 = random & 255 + num2 = random >> 8 & 255 + arr.push((num1 & 170) | (1 & 85)) + arr.push((num1 & 85) | (1 & 170)) + arr.push((num2 & 170) | (0 & 85)) + arr.push((num2 & 85) | (0 & 170)) + return arr; + } + + function randomGarbledCharactersArray2() { + let arr = [] + let num1 = Math.random() * 240 >> 0 + let num2 = (Math.random() * 255 >> 0) & 77 | 2 | 16 | 32 | 128 + arr.push((num1 & 170) | (1 & 85)) + arr.push((num1 & 85) | (1 & 170)) + arr.push((num2 & 170) | (0 & 85)) + arr.push((num2 & 85) | (0 & 170)) + return arr; + } + + return [...randomGarbledCharactersArray1(), ...randomGarbledCharactersArray2()] +} + +function encryptionUa(ss) { + const date = Date.now(); + let str; + str = "ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe" + + let uaEncryption = ""; + let j = 0 + for (let i = 0; i < ss.length; i += 3) { + if (i + 3 <= ss.length) { + let number = (((ss.charCodeAt(i) & 255) << 16) | ((ss.charCodeAt(i + 1) & 255) << 8)) | ((ss.charCodeAt(i + 2) & 255) << 0); + uaEncryption += str.charAt((number & 16515072) >> 18); + uaEncryption += str.charAt((number & 258048) >> 12); + uaEncryption += str.charAt((number & 4032) >> 6); + uaEncryption += str.charAt((number & 63) >> 0); + } + if (i + 3 > ss.length) { + let u = ss.length - j + if (u === 2) { + var charCodeAtNum0 = ss.charCodeAt(j); + var charCodeAtNum1 = ss.charCodeAt(j + 1); + var baseNum = charCodeAtNum1 << 8 | charCodeAtNum0 << 16; + var str1 = str[(baseNum & 16515072) >> 18]; + var str2 = str[(baseNum & 258048) >> 12]; + var str3 = str[(baseNum & 4032) >> 6]; + uaEncryption += str1 + str2 + str3 + '='; + } + if (u === 1) { + var charCodeAtNum0 = ss.charCodeAt(j); + var baseNum = 0 | charCodeAtNum0 << 16; + var str1 = str[(baseNum & 16515072) >> 18]; + var str2 = str[(baseNum & 258048) >> 12]; + uaEncryption += str1 + str2 + '=' + '='; + } + + } + j += 3 + } + return uaEncryption +} + +function uaGarbledCharacters(userAgent, ua_salt) { + let arr_256 = ua_arr_256(userAgent, ua_salt); + let n4 = 0; + let ans = ""; + for (let i = 0; i < userAgent.length; i++) { + let n2 = (i + 1) % 256; + let n3 = n4 + arr_256[n2] + n4 = n3 % 256 + let old_arr_n2 = arr_256[n2] + arr_256[n2] = arr_256[n4] + arr_256[n4] = old_arr_n2 + let n5 = userAgent.charCodeAt(i); + let n6 = arr_256[n2] + old_arr_n2; + let n7 = n6 % 256 + let n8 = n5 ^ arr_256[n7] + ans += String.fromCharCode(n8) + } + return ans; +} + + +function ua_arr_256(userAgent, ua_salt) { + let nums = [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] + let previousValue = 0; + let lm = String.fromCharCode(0.00390625, 1, ua_salt); + for (let i = 0; i < nums.length; i++) { + let num1 = previousValue * nums[i]; + previousValue = (num1 + previousValue + lm.charCodeAt(i % 3)) % 256 + let tmp = nums[i]; + nums[i] = nums[previousValue] + nums[previousValue] = tmp + } + return nums; +} +function encryptAbogus(userAgent, query, body = '') { + function parse(lmStr, dataStr) { + let retStr = '' + let arr256 = [...Array(256).keys()].map(i => 255 - i); + for (var s = 0, swapIdx = 0; s < arr256.length; s++) { + swapIdx = ((swapIdx * arr256[s] + swapIdx) + lmStr.charCodeAt(s % lmStr.length)) % 256; + let tmp = arr256[s]; + arr256[s] = arr256[swapIdx]; + arr256[swapIdx] = tmp; + } + for (let i = 0, bak = 0; i < dataStr.length; i++) { + let idx = (i + 1) % 256; + let idx2 = (bak + arr256[idx]) % 256; + let idx3 = (arr256[idx2] + arr256[idx]) % 256; + bak = idx2 + // 位置交换 + let tmp2 = arr256[idx]; + arr256[idx] = arr256[idx2]; + arr256[idx2] = tmp2; + + let num = dataStr.charCodeAt(i) ^ arr256[idx3]; + retStr += String.fromCharCode(num); + } + return retStr + } + function lmStrEncode(lmArr, table) { + let dataStr = ''; + let groupNum = lmArr.length / 3; + for (let i = 0; i < groupNum; i++) { + lmCha1 = lmArr[3 * i] + lmCha2 = lmArr[3 * i + 1] + lmCha3 = lmArr[3 * i + 2] + + bigNum = (lmCha1 & 255) << 16 | ((lmCha2 & 255) << 8) | (lmCha3 & 255) + + chr1 = table.charAt((bigNum & 16515072) >> 18); + chr2 = table.charAt((bigNum & 258048) >> 12); + chr3 = table.charAt((bigNum & 4032) >> 6); + chr4 = table.charAt(bigNum & 63); + + dataStr += `${chr1}${chr2}${chr3}${chr4}` + + } + // 填充逻辑 + const remainder = lmArr.length % 3; + if (remainder === 1) { + dataStr = dataStr.substring(0, dataStr.length - 2); + dataStr += '=='; + } else if (remainder === 2) { + dataStr = dataStr.substring(0, dataStr.length - 1); + dataStr += '='; + } + + + // 填充逻辑 3字符 -> 4编码 + return dataStr + } + function getaBogusLmArr4() { + // aBogus 拼接乱码4位数组 aBogus乱码前缀 - 两个随机数相关 + let randomVal1 = (Math.random() * 65535) & 255; + let randomVal2 = Math.random() * 40; + return [ + (randomVal1 & 170) | 1, + (randomVal1 & 85) | 2, + ((randomVal2 >> 0) & 170) | 80, + ((randomVal2 >> 0) & 85) | 2 + ] + } + + function getTmArr(tm) { + // 时间戳 构造数组 tm和arr50 - 索引 4 5 6 7 8 9 + tmNum = (tm + 3) & 255; + tmStr = `${tmNum},` + let tmArr = []; + for (let i = 0; i < tmStr.length; i++) { + tmArr.push(tmStr.charCodeAt(i)); + } + return tmArr; + } + + function getFpArr() { + // 浏览器指纹收集 环境检测 宽度-高度 芯片类型... + let fpArr = []; + let fpStr = '1920|366|1918|1048|1920|1050|1920|1080|Win32' + for (let i = 0; i < fpStr.length; i++) { + fpArr.push(fpStr.charCodeAt(i)); + } + return fpArr; + } + + function sumEncrypt(data) { + function be(t, e, r, n) { + return 0 <= t && t < 16 ? (e ^ r ^ n) >>> 0 : 16 <= t && t < 64 ? (e & r | ~e & n) >>> 0 : (console.error("invalid j for bool function GG"), + 0) + } + + function me(t, e, r, n) { + return 0 <= t && t < 16 ? (e ^ r ^ n) >>> 0 : 16 <= t && t < 64 ? (e & r | e & n | r & n) >>> 0 : (console.error("invalid j for bool function FF"), + 0) + } + + function de(t) { + return 0 <= t && t < 16 ? 2043430169 : 16 <= t && t < 64 ? 2055708042 : void console.error("invalid j for constant Tj") + } + + function ye(t, e) { + return (t << (e %= 32) | t >>> 32 - e) >>> 0 + } + + function t() { + if (function (t, e) { + if (!(t instanceof e)) + throw new TypeError("Cannot call a class as a function") + }(this, t), + !(this instanceof t)) + return new t; + this.reg = new Array(8), + this.chunk = [], + this.size = 0, + this.reset() + } + + function reset() { // sm3 + this.reg[0] = 1937774191, + this.reg[1] = 1226093241, + this.reg[2] = 388252375, + this.reg[3] = 3666478592, + this.reg[4] = 2842636476, + this.reg[5] = 372324522, + this.reg[6] = 3817729613, + this.reg[7] = 2969243214, + this.chunk = [], + this.size = 0 + } + + function write(t) { + var e = "string" == typeof t ? function (t) { + var e = encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, (function (t, e) { + return String.fromCharCode("0x" + e) + } + )) + , r = new Array(e.length); + return Array.prototype.forEach.call(e, (function (t, e) { + r[e] = t.charCodeAt(0) + } + )), + r + }(t) : t; + this.size += e.length; + var r = 64 - this.chunk.length; + if (e.length < r) + this.chunk = this.chunk.concat(e); + else + for (this.chunk = this.chunk.concat(e.slice(0, r)); this.chunk.length >= 64;) + this._compress(this.chunk), + r < e.length ? this.chunk = e.slice(r, Math.min(r + 64, e.length)) : this.chunk = [], + r += 64 + } + + function _compress(t) { + if (t < 64) + console.error("compress error: not enough data"); + else { + for (var e = function (t) { + for (var e = new Array(132), r = 0; r < 16; r++) + e[r] = t[4 * r] << 24, + e[r] |= t[4 * r + 1] << 16, + e[r] |= t[4 * r + 2] << 8, + e[r] |= t[4 * r + 3], + e[r] >>>= 0; + for (var n = 16; n < 68; n++) { + var o = e[n - 16] ^ e[n - 9] ^ ye(e[n - 3], 15); + o = o ^ ye(o, 15) ^ ye(o, 23), + e[n] = (o ^ ye(e[n - 13], 7) ^ e[n - 6]) >>> 0 + } + for (n = 0; n < 64; n++) + e[n + 68] = (e[n] ^ e[n + 4]) >>> 0; + return e + }(t), r = this.reg.slice(0), n = 0; n < 64; n++) { + var o = ye(r[0], 12) + r[4] + ye(de(n), n) + , i = ((o = ye(o = (4294967295 & o) >>> 0, 7)) ^ ye(r[0], 12)) >>> 0 + , u = me(n, r[0], r[1], r[2]); + u = (4294967295 & (u = u + r[3] + i + e[n + 68])) >>> 0; + var c = be(n, r[4], r[5], r[6]); + c = (4294967295 & (c = c + r[7] + o + e[n])) >>> 0, + r[3] = r[2], + r[2] = ye(r[1], 9), + r[1] = r[0], + r[0] = u, + r[7] = r[6], + r[6] = ye(r[5], 19), + r[5] = r[4], + r[4] = (c ^ ye(c, 9) ^ ye(c, 17)) >>> 0 + } + for (var a = 0; a < 8; a++) + this.reg[a] = (this.reg[a] ^ r[a]) >>> 0 + } + } + + function _fill() { + var t = 8 * this.size + , e = this.chunk.push(128) % 64; + for (64 - e < 8 && (e -= 64); e < 56; e++) + this.chunk.push(0); + for (var r = 0; r < 4; r++) { + var n = Math.floor(t / 4294967296); + this.chunk.push(n >>> 8 * (3 - r) & 255) + } + for (r = 0; r < 4; r++) + this.chunk.push(t >>> 8 * (3 - r) & 255) + } + + function sum(t, e) { + t && (this.reset(), + this.write(t)), + this._fill(); + for (var r = 0; r < this.chunk.length; r += 64) + this._compress(this.chunk.slice(r, r + 64)); + var n, o, i, u = null; + if ("hex" == e) { + u = ""; + for (r = 0; r < 8; r++) + u += (n = this.reg[r].toString(16), + o = 8, + i = "0", + n.length >= o ? n : i.repeat(o - n.length) + n) + } else + for (u = new Array(32), + r = 0; r < 8; r++) { + var c = this.reg[r]; + u[4 * r + 3] = (255 & c) >>> 0, + c >>>= 8, + u[4 * r + 2] = (255 & c) >>> 0, + c >>>= 8, + u[4 * r + 1] = (255 & c) >>> 0, + c >>>= 8, + u[4 * r] = (255 & c) >>> 0 + } + return this.reset(), + u + + + } + + t.prototype.reset = reset; + t.prototype.write = write; + t.prototype._compress = _compress; + t.prototype._fill = _fill; + t.prototype.sum = sum; + obj = new t(); + return obj.sum(data); + } + + function getXorRandomArr8() { //[3, 85, 34, 1, 43, 4, 162, 85 + // 异或计算58数组前8位随机生成 参与前8位异或运算 + randomVal1 = Math.random() * 65535 + tmpVal1 = (randomVal1 & 255) & 255 + tmpVal2 = (randomVal1 >> 8) & 255 + num1 = (tmpVal1 & 170) | 1 + num2 = (tmpVal1 & 85) | 0 + num3 = (tmpVal2 & 170) | 0 + num4 = (tmpVal2 & 85) | 0 + + // 随机算法不一致 + randomVal = Math.random() * 255; + randomVal2 = Math.random() * 240; + isEven = (randomVal2 >> 0) + 110; + isEven = isEven % 2 === 0 ? isEven : ++isEven; + + num5 = (isEven & 170) | 1; + num6 = (isEven & 85) | 0; + num7 = (((((((randomVal >> 0) & 77) | 2) | 16) | 32) | 128) & 170) | 16 + num8 = (((((((randomVal >> 0)) & 77) | 16) | 32) | 128) & 85) | 2; + return [num1, num2, num3, num4, num5, num6, num7, num8]; + } + + function getNewArr50(arr50) { + // 排序arr50 提取和真实后续传参不一致 + orderedArr50 = new Array(50) + orderedArr50[0] = arr50[9] + orderedArr50[1] = arr50[18] + orderedArr50[2] = arr50[28] + orderedArr50[3] = arr50[32] + orderedArr50[4] = arr50[11] + orderedArr50[5] = arr50[4] + orderedArr50[6] = arr50[11] + orderedArr50[7] = arr50[11] + orderedArr50[8] = arr50[9] + orderedArr50[9] = arr50[23] + orderedArr50[10] = arr50[12] + orderedArr50[11] = arr50[37] + orderedArr50[12] = arr50[24] + orderedArr50[13] = arr50[39] + orderedArr50[14] = arr50[3] + orderedArr50[15] = arr50[22] + orderedArr50[16] = arr50[35] + orderedArr50[17] = arr50[11] + orderedArr50[18] = arr50[5] + orderedArr50[19] = arr50[42] + orderedArr50[20] = arr50[1] + orderedArr50[21] = arr50[27] + orderedArr50[22] = arr50[33] + orderedArr50[23] = arr50[11] + orderedArr50[24] = arr50[30] + orderedArr50[25] = arr50[14] + orderedArr50[26] = arr50[6] + orderedArr50[27] = arr50[7] + orderedArr50[28] = arr50[2] + orderedArr50[29] = arr50[43] + orderedArr50[30] = arr50[15] + orderedArr50[31] = arr50[11] + orderedArr50[32] = arr50[29] + orderedArr50[33] = arr50[25] + orderedArr50[34] = arr50[16] + orderedArr50[35] = arr50[11] + orderedArr50[36] = arr50[8] + orderedArr50[37] = arr50[38] + orderedArr50[38] = arr50[26] + orderedArr50[39] = arr50[17] + orderedArr50[40] = arr50[9] + orderedArr50[41] = arr50[11] + orderedArr50[42] = arr50[11] + orderedArr50[43] = arr50[0] + orderedArr50[44] = arr50[31] + orderedArr50[45] = arr50[7] + orderedArr50[46] = arr50[46] + orderedArr50[47] = arr50[47] + orderedArr50[48] = arr50[48] + orderedArr50[49] = arr50[49] + return orderedArr50 + } + + function getXorArray(arr) { + let xorResult = 0; + for (let i = 0; i < arr.length; i++) { + xorResult ^= arr[i]; // 使用 ^= 运算符进行异或 + } + return [xorResult]; + } + + function strToIntArr(dataStr) { + // 字符串转位字节数组 + return Array.from(dataStr).map((char, index) => { + return char.charCodeAt(0); + }); + } + + // web端验签 -> a_bogus V 1.0.1.20 from bdms.js + const tableObj = { + "s0": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // 标准 + "s1": "Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=", + "s2": "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=", // xb + "s3": "ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe", // ua + "s4": "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe" // ab + } + + const salt = 'dhzx' + + const constVal1 = 22740 + const constVal2 = 2631 + const keyVal = 0 + + const tm2 = new Date().getTime() - 1 + const tm1Before = new Date().getTime() + const fpArr = getFpArr(); + const queryArr32 = sumEncrypt(sumEncrypt(`${query}${salt}`)) + const dataArr32 = sumEncrypt(sumEncrypt(`${body}${salt}`)) + + const userAgentLmStr = parse(String.fromCharCode(...[0.00390625, 1, keyVal]), userAgent) + const userAgentArr32 = sumEncrypt(lmStrEncode(strToIntArr(userAgentLmStr), tableObj.s3)) + + + const tm1 = new Date().getTime() + let arr50 = [ + // arr50相关 - 时间戳 query data ua 鼠标轨迹 + 41, + 9, + 6, + ((tm1 - tm1Before) + 3) & 255, + (tm1 >> 0) & 255, + (tm1 >> 8) & 255, + (tm1 >> 16) & 255, + (tm1 >> 24) & 255, + ((((tm1 / 256) / 256) / 256) / 256) & 255, + (((((tm1 / 256) / 256) / 256) / 256) / 256) & 255, + + (1 % 256) & 255, + (1 / 256) & 255, + + 129, + (129 >> 8) & 255, + + // 鼠标轨迹相关 + // 102, 12, 12, 14, + 0, 0, 0, 0, + + (keyVal >> 0) & 255, + (keyVal >> 8) & 255, + (keyVal >> 16) & 255, + (keyVal >> 24) & 255, + + // 索引23 + queryArr32[9], + queryArr32[18], + queryArr32[3], + dataArr32[10], + dataArr32[19], + dataArr32[4], + userAgentArr32[11], + userAgentArr32[21], + userAgentArr32[5], + // 索引31 + + (tm2 >> 0) & 255, + (tm2 >> 8) & 255, + (tm2 >> 16) & 255, + (tm2 >> 24) & 255, + ((((tm2 / 256) / 256) / 256) / 256) & 255, + (((((tm2 / 256) / 256) / 256) / 256) / 256) & 255, + + 3, + // 常量值运算 + (constVal1 >> 0) & 255, + (constVal1 >> 8) & 255, + (constVal1 >> 16) & 255, + (constVal1 >> 24) & 255, + + (constVal2 >> 0) & 255, + (constVal2 >> 8) & 255, + (constVal2 >> 16) & 255, + (constVal2 >> 24) & 255, + + 44, 0, 4, 0 + ] + const newArr50 = getNewArr50(arr50) // 暂时一致 + const xorRandomArr8 = getXorRandomArr8() + const arr58 = [...xorRandomArr8, ...arr50] + const xorArray = getXorArray(arr58) + const arr4Merge = [...newArr50, ...fpArr, ...getTmArr(tm1), ...xorArray] + let aBogusLmStr = String.fromCharCode(...getaBogusLmArr4()) // ok + let mergeArr = []; // ok + for (let i = 0; i < arr4Merge.length / 3; i++) { + // 遍历数组 每次取3位 然后计算 + let val1 = arr4Merge[3 * i] + let val2 = arr4Merge[3 * i + 1] + let val3 = arr4Merge[3 * i + 2] + const randomVal = (Math.random() * 1000) & 255; + mergeArr.push( + (randomVal & 145) | (val1 & 110), + (randomVal & 66) | (val2 & 189), + (randomVal & 44) | (val3 & 211), + ((val1 & 145) | (val2 & 66)) | (val3 & 44) + ) + } + let bigArr = xorRandomArr8.concat( + mergeArr, + xorArray + ) + aBogusLmStr += parse(String.fromCharCode(...[211]), String.fromCharCode(...bigArr)) + return lmStrEncode(strToIntArr(aBogusLmStr), tableObj.s4); +} +url = "aid=6383&browser_language=zh-CN&browser_name=Chrome&browser_online=true&browser_platform=Win32&browser_version=86.0.4240.198&channel=channel_pc_web&cookie_enabled=true&count=10&cpu_core_num=16&device_memory=8&device_platform=webapp&downlink=1.6&effective_type=4g&enable_history=1&engine_name=Blink&engine_version=86.0.4240.198&from_group_id=7408552145152232704&is_filter_search=0&keyword=%E5%AF%BB%E9%81%93%E5%A4%A7%E5%8D%83&list_type=multi&need_filter_settings=1&offset=0&os_name=Windows&os_version=10&pc_client_type=1&pc_libra_divert=Windows&platform=PC&query_correct_type=1&round_trip_time=100&screen_height=1080&screen_width=1920&search_channel=aweme_general&search_source=search_history&support_dash=1&support_h265=1&uifid=6a8253199192b669ecb5c608c1e1200542a2d66d943f26f79f1de78af50d7a1a9ee9a3bc1df4ffb3980b959cc862e14b52f4549c58429f43ca59338b8b01345f94d2d343bdd0902bf930cbf3c1480b21b01553e18ee5ef1d30f0b6ecd65115e8af41254b2e747238ac7520501223bf1a341b48ee1b819e5807a5cf1bfdf2de84704909c6006e17c3ee6b499a4028aaa1cefe825ce763005ce7b308aea90e12c3&version_code=190600&version_name=19.6.0&webid=7478320717131761204&msToken=RQlbb_R8L-IY14cJdDiPnNQUjPFsEtJxCkLGkNzHT5dxWi9m05XFx6kinjTO9_IrG0oZX6vuKjP4wapItn3avtRtkRJIa8JhJTgGnDSfqKv6VcBZsAZUsV2K0VaZnuMv79_u-B16c_6hW-eE5GbIvYNgAXhT_CADFCsZQzYFx4Y%3D" +// data = '{"scene":"PCSquareFeed","size":30,"search_text":"","cursor":0,"extra":{"new_session_strategy":"1","search_id":"24eb6b82c01bf539ae7ea2d83b1501a2977e00811b9cf35ff526a25cb83bfc8eb14b20dc1eba350e937bf5ead59d7cbbf9b1c7653501dfe8ed77d888911abdc525ef1292b65df2e0a48529320c56207a","session_id":"2240ef2d8a855155c5a83bb0482ffccf197cd99dd99017347d914442b8d79bf1940d42ecbc787b1e2f49d8d2d5403d5704aa99c1450f453c6aa40bd9c265e340fef543c222f6dd22a34ff8b6f108f736"},"filters":{"Price":{"value":["R:200,-"]}}}' +userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' +console.log(enc(url, null, userAgent)) +// console.log(getABogus(url, data, userAgent).length) + diff --git a/main.py b/main.py new file mode 100644 index 0000000..3f9f974 --- /dev/null +++ b/main.py @@ -0,0 +1,29 @@ +from jose import JWTError, jwt +from fastapi import HTTPException +from datetime import datetime, timedelta +from jose import ExpiredSignatureError +SECRET_KEY = "Bv8Z1&xG$Aq7!s9PfL@t#QwE2rY%Nk*mCjH^Rb6DuXpZ+3VoBO" +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 30 + +# === 创建 Token === +def create_access_token(data: dict, expires_delta: timedelta = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)): + to_encode = data.copy() + expire = datetime.utcnow() + expires_delta + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + + +def verify_token(token: str): + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + if payload["role"] != "admin": + return None + + + return payload + except ExpiredSignatureError: + raise HTTPException(status_code=401, detail="Token已过期") + except JWTError: + raise HTTPException(status_code=401, detail="无效的Token") \ No newline at end of file diff --git a/web.py b/web.py new file mode 100644 index 0000000..79fc720 --- /dev/null +++ b/web.py @@ -0,0 +1,428 @@ +import json +import subprocess +import time +import uuid +from functools import partial # 用来固定某个参数的固定值 +import uvicorn +from pydantic import BaseModel +from fastapi import FastAPI,Request +app = FastAPI() + +subprocess.Popen = partial(subprocess.Popen, encoding='utf-8') +import execjs +from fastapi import FastAPI, Depends, Header, HTTPException +from typing import Dict, Optional +from pydantic import BaseModel +from jose import JWTError, jwt +from datetime import datetime, timedelta +from cryptography.fernet import Fernet +import urllib.parse +import requests +from auth import verify_token,create_access_token + +class LoginRequest(BaseModel): + user_id: str + role: str + fp: int +@app.post("/login") +async def login(data : LoginRequest): + token = create_access_token(dict(data)) + return {"access_token": token, "token_type": "bearer"} +async def check_jwt(authorization: str = Header(...)): + if not authorization.startswith("Bearer "): + raise HTTPException(status_code=401, detail="Token格式错误") + token = authorization.replace("Bearer ", "") + user_data = verify_token(token) + if user_data is None: + raise HTTPException(status_code=401, detail="无效的Token") + return user_data + +ctx=execjs.compile(open('ab_19.js', encoding='utf-8').read()) +requests.packages.urllib3.disable_warnings() +# cookies = { +# 'BUYIN_SASID': 'SID2_7492380176849060132', +# 'SASID':'SID2_7492380176849060132' +# } +def common_encrypt1(json_data,params,ua): + da = json.dumps(json_data).replace(' ', '') + pa = urllib.parse.urlencode(params) + ab = ctx.call('enc', pa, da, ua) + params['a_bogus'] = ab + data = json.dumps(json_data, separators=(',', ':')) + return data +def common_encrypt2(ua,params): + pa = urllib.parse.urlencode(params) + ab = ctx.call('encryptAbogus', ua, pa) + params['a_bogus'] = ab + # return data +@app.post("/get_yellow_car_products") +async def get_yellow_car(data:Dict,room_id:str,auth=Depends(check_jwt)): + cookies = data + headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'cache-control': 'no-cache', + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'origin': 'https://live.douyin.com', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': 'https://live.douyin.com/996935408475', + 'sec-ch-ua': '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'uifid': '29d6bea3e5a6c157a08a212e1912b5e8a78666ece26be56100fa19e58a63a45bbf6ac0f2718fca29c4fa2fb5f45bfcaea6a8e560cad35459acf3bec074e26bd507cc878d629deea5d98525276c6c930e2871de6184fcd505c418ad8d62495640d5aef399e4fea7c04b933c919eeffb316d26046e16c46999a152ead37d61379966833aae53a414fc3a0c9ac4a382b31616161535518766374c9afe940933fe48', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', + 'x-secsdk-csrf-token': '000100000001366a5d3aafc5da2b7fb7a8f9bbd2183e77e6bf0c1be7e91cccd6a288ad38fcd118360d9cc34524df', + } + params = { + 'device_platform': 'webapp', + 'aid': '6383', + 'channel': 'channel_pc_web', + 'room_id': f'{room_id}', + 'author_id': '4498836619270612', + 'offset': '0', + 'limit': '20', + 'pc_client_type': '1', + 'pc_libra_divert': 'Windows', + 'update_version_code': '170400', + 'support_h265': '1', + 'support_dash': '0', + 'version_code': '320100', + 'version_name': '32.1.0', + 'cookie_enabled': 'true', + 'screen_width': '1536', + 'screen_height': '864', + 'browser_language': 'zh-CN', + 'browser_platform': 'Win32', + 'browser_name': 'Chrome', + 'browser_version': '125.0.0.0', + 'browser_online': 'true', + 'engine_name': 'Blink', + 'engine_version': '125.0.0.0', + 'os_name': 'Windows', + 'os_version': '10', + 'cpu_core_num': '16', + 'device_memory': '8', + 'platform': 'PC', + 'downlink': '10', + 'effective_type': '4g', + 'round_trip_time': '250', + 'webid': '7446819597804946956', + 'uifid': '29d6bea3e5a6c157a08a212e1912b5e8a78666ece26be56100fa19e58a63a45bbf6ac0f2718fca29c4fa2fb5f45bfcaea6a8e560cad35459acf3bec074e26bd507cc878d629deea5d98525276c6c930e2871de6184fcd505c418ad8d62495640d5aef399e4fea7c04b933c919eeffb316d26046e16c46999a152ead37d61379966833aae53a414fc3a0c9ac4a382b31616161535518766374c9afe940933fe48', + 'msToken': '8w0DCcNbCsn5heG_fBkCx7SKtL-Bgv_awvNokCdqa9lboNSq-bYWMmjVA0YRS4RmwKJvI9CBtEdVTM2toasygEyun9PPQMROMAdV4mgZosBDcVJ7xCitwNJJQWhLH9ByYaC3DlxbG6Tz7WmNRZr01N68Ykz9uuweGFuo6eXIq9k=', + } + + response = requests.post('https://live.douyin.com/live/promotions/page/', params=params, cookies=cookies,headers=headers) + pa = urllib.parse.urlencode(params) + ab = ctx.call('encryptAbogus', headers['user-agent'], pa) + params['a_bogus'] = ab + return { + "msg": "认证成功", + # "user_data": auth, + "data": response.json() + } +def pack_detail(cookies): + + json_data = { + "scene_info": { + "request_page": 2 + }, + "biz_id": "3717234303709610080", + "biz_id_type": 2, + "enter_from": "pc.selection_square.recommend_main", + "data_module": "pc-non-core", + "extra": { + "use_kol_product": "1" + } + } + headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', + 'content-type': 'application/json', + 'origin': 'https://buyin.jinritemai.com', + 'priority': 'u=1, i', + 'referer': 'https://buyin.jinritemai.com/dashboard/merch-picking-library/merch-promoting?commodity_id=3728500413717215016&commodity_location=3&id=3728500413717215016&activity_id=&pick_first_source=%E7%99%BE%E5%BA%94&pick_second_source=%E9%80%89%E5%93%81%E5%B9%BF%E5%9C%BA&pick_third_source=category_recommend&pick_source_id=&product_id=3728498815368560693&shop_id=193158700&search_id=2240ef2d8a855155c5a83bb0482ffccf197cd99dd99017347d914442b8d79bf1ccddd1f0f915ee2c660a28217e6bd5dd66590b94a7ba696647dc643b6fba1d47bf7e7d0612c3783b823e660d70df3343&log_pb=20250408191218566CCF37AF1B90242B12&session_id=2240ef2d8a855155c5a83bb0482ffccf197cd99dd99017347d914442b8d79bf1ccddd1f0f915ee2c660a28217e6bd5dd66590b94a7ba696647dc643b6fba1d47bf7e7d0612c3783b823e660d70df3343&recommend_reason_type=&recommend_reason_text=&is_outside_log=1&only_query_params=1&universal_append=1&pre_universal_unit_params=%257B%2522product_id%2522%253A%25223728498815368560693%2522%252C%2522commodity_id%2522%253A%25223728500413717215016%2522%252C%2522commodity_location%2522%253A3%252C%2522search_id%2522%253A%25222240ef2d8a855155c5a83bb0482ffccf197cd99dd99017347d914442b8d79bf1ccddd1f0f915ee2c660a28217e6bd5dd66590b94a7ba696647dc643b6fba1d47bf7e7d0612c3783b823e660d70df3343%2522%252C%2522log_pb%2522%253A%252220250408191218566CCF37AF1B90242B12%2522%257D&decision_enter_from=pc.selection_square.recommend_main&btm_ppre=a10091.b089178.c809509.d0&btm_pre=a10091.b24215.c644093.d595042_i2&btm_show_id=f578c8cf-e338-4822-b77f-045d94285562&pre_universal_page_params_id=583b872b-f9dd-412e-9587-4694833a881e&universal_page_params_id=3f180795-28e0-4fff-b6fb-b20bfd586d84', + 'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36', + 'x-secsdk-csrf-token': '0001000000012482d40eaccfa7a5784bb075513bb1699468b8c87670bc4d5c07922d2be496c218345b0b21308ee7' + } + params = { + 'verifyFp': 'verify_m7szifjz_EqImAMTD_IDRv_4sWD_9bo7_sXGFbOtgRlYn', + 'fp': 'verify_m7szifjz_EqImAMTD_IDRv_4sWD_9bo7_sXGFbOtgRlYn', + 'msToken': 'I7uZRuIOIeku3Jsem5HNw5evwejIpkl9ETCeGQwB1Z-uhEuQR_xTwWc7j-xvUHeqTH7pupZ_5b6f78C_WVa5c2d0e4EQ4X-t8Nk8becYknydU08zj-_sAebX64TPtqqv6NJN7rhiP6F7hMu7uW3K_KIzgUlRzYxv4ikgoMS1M3riQZPlNjlycJA=', + } + data=common_encrypt1(json_data=json_data,params=params,ua=headers['user-agent']) + response = requests.post( + 'https://buyin.jinritemai.com/pc/selection/decision/pack_detail', + params=params, + cookies=cookies, + headers=headers, + data=data, + ) + return response.json() +def get_material_list(cookies): + # json_data = { + # "scene_info": { + # "request_page": 2 + # }, + # "biz_id": "3717234303709610080", + # "biz_id_type": 2, + # "enter_from": "pc.selection_square.recommend_main", + # "data_module": "pc-non-core", + # "extra": { + # "use_kol_product": "1" + # } + # } + + headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9', + 'cache-control': 'no-cache', + 'content-type': 'application/json', + 'origin': 'https://buyin.jinritemai.com', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': 'https://buyin.jinritemai.com/dashboard/merch-picking-library?btm_ppre=a0.b0.c0.d0&btm_pre=a10091.b089178.c809509.d0&btm_show_id=11f0284e-a2dd-403d-baab-29a262eb52e1&pre_universal_page_params_id=&universal_page_params_id=2809881b-6321-4d1c-8605-8709c77848e6', + 'sec-ch-ua': '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', + 'x-secsdk-csrf-token': '00010000000194bc30606cc99d766875509daaa72ac141261bac200065eaf3fe8dab9ac361a4182679de3f0cf9d1', + } + + + params = { + 'verifyFp': 'verify_m9dzx9j1_utaEOIfT_m3VQ_4JoY_Bov0_E6EtRx86WJVG',#这两个可以随便乱写 + 'fp': 'verify_m9dzx9j1_utaEOIfT_m3VQ_4JoY_Bov0_E6EtRx86WJVG', + 'msToken': 'I7uZRuIOIeku3Jsem5HNw5evwejIpkl9ETCeGQwB1Z-uhEuQR_xTwWc7j-xvUHeqTH7pupZ_5b6f78C_WVa5c2d0e4EQ4X-t8Nk8becYknydU08zj-_sAebX64TPtqqv6NJN7rhiP6F7hMu7uW3K_KIzgUlRzYxv4ikgoMS1M3riQZPlNjlycJA=', + } + data = { + 'scene': 'PCSquareFeed', + 'size': 30, + 'search_text': '', + 'cursor': 0, + 'extra': { + 'new_session_strategy': '1', + 'search_id': '', + 'session_id': '', + 'use_kol_product': '0', + }, + 'filters': {}, + } + + data = common_encrypt1(json_data=data, params=params, ua=headers['user-agent']) + response = requests.post( + 'https://buyin.jinritemai.com/pc/selection/common/material_list', + params=params, + cookies=cookies, + headers=headers, + data=data, + verify=False + ) + return response.json() + +@app.post("/get_products") +async def get_products(data: Dict,auth=Depends(check_jwt)):#todo 橱窗商品查询接口 + cookies=data + headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'cache-control': 'no-cache', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': 'https://buyin.jinritemai.com/dashboard/shopwindow/goods-list?pre_universal_page_params_id=&universal_page_params_id=50b10430-f2bf-4c4d-9d12-f07ade860f5c', + 'sec-ch-ua': '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', + } + + params = { + 'product_type': '0', + 'page': '1', + 'page_size': '20', + 'filter': 'false', + 'verifyFp': 'verify_m9fc66zp_hfTxtn1L_FDNH_4kRV_8fsT_u6RPpdK6oQxH', + 'fp': 'verify_m9fc66zp_hfTxtn1L_FDNH_4kRV_8fsT_u6RPpdK6oQxH', + 'msToken': 'O4i0W-LNj0RKjbWRfh8OBs8sMjJ8xZoDJxmo9Nb-0x9RLllln5uMzsuL8gjfVH2MGukd1T8PdTEB8HSq8xIc6qTJW_dgUPLbg827a5IIKGWRiDKtO5yoZNKV0KXlSWncKA3N6TIdiAdx8_fZaFJTNipYmcd-Me9NrXZjp_3IeUVa', + + } + + data = common_encrypt1(json_data='', params=params, ua=headers['user-agent']) + response = requests.get('https://buyin.jinritemai.com/api/author/shop/products', params=params, cookies=cookies, + headers=headers) + + return { + "msg": "认证成功", + # "user_data": auth, + "data": response.json() + } +@app.post("/identify_products") +def identify_products(data: Dict,urls:str,auth=Depends(check_jwt)):#识别商品 + cookies=data + headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'cache-control': 'no-cache', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': 'https://buyin.jinritemai.com/dashboard/shopwindow/goods-list?pre_universal_page_params_id=&universal_page_params_id=bf3635b2-a64a-42c3-9f7f-6eb9096cc96f', + 'sec-ch-ua': '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', + } + params = { + # 'urls': 'https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3702192299720179773&origin_type=2631,https://haohuo.jinritemai.com/views/product/item2?id=3741702496180109752', + 'urls': f'{urls}', + 'scene': '3', + 'verifyFp': 'verify_m9fc66zp_hfTxtn1L_FDNH_4kRV_8fsT_u6RPpdK6oQxH', + 'fp': 'verify_m9fc66zp_hfTxtn1L_FDNH_4kRV_8fsT_u6RPpdK6oQxH', + 'msToken': 'O4i0W-LNj0RKjbWRfh8OBs8sMjJ8xZoDJxmo9Nb-0x9RLllln5uMzsuL8gjfVH2MGukd1T8PdTEB8HSq8xIc6qTJW_dgUPLbg827a5IIKGWRiDKtO5yoZNKV0KXlSWncKA3N6TIdiAdx8_fZaFJTNipYmcd-Me9NrXZjp_3IeUVa', + + } + common_encrypt2(ua=headers['user-agent'],params=params) + response = requests.get( + 'https://buyin.jinritemai.com/pc/selection_tool/batch_link', + params=params, + cookies=cookies, + headers=headers, + ) + return { + "msg": "认证成功", + "data": response.json() + } +@app.post("/add_products") +def add_products(data:Dict,link_url:str,promotion_ids:str,auth=Depends(check_jwt)):#todo 添加商品 + cookies=data + headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'cache-control': 'no-cache', + 'content-type': 'application/json', + 'origin': 'https://buyin.jinritemai.com', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': 'https://buyin.jinritemai.com/dashboard/shopwindow/goods-list?universal_page_params_id=4695b182-8959-4fb8-b029-c4fd66004fcf', + 'sec-ch-ua': '"Microsoft Edge";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0', + 'x-secsdk-csrf-token': '000100000001c09f45d66c9f65f6d44d52a5e8f643275f46f7e4f97ef1e5507165c9c2d20aab1834e2fed2495e14', + } + + params = { + 'verifyFp': 'verify_m9ayab85_7PGRhlEt_WsSw_4Zxz_AMSa_CGNDBbiWKxfm', + 'fp': 'verify_m9ayab85_7PGRhlEt_WsSw_4Zxz_AMSa_CGNDBbiWKxfm', + 'msToken': 'RmS7vcjWRyT-H1E2l7_Gts5Q4nGHCBsdSwuWjThr8pTeeSDbcBI6SpaVhQX9ml_z3OMIFp1EX1NVFHGsPTggO7dWBL1IoIbkNn2jLRcgqpyR3rHG5-v8vdB-x93lsNgr_TQn0SPzatZk3c1DDqL5x74X8SH-CsBJaLExWecM7yYVD1cA1x-ccg==', + } + pre_data_list = [] + for id,url in promotion_ids.split(","),link_url.split(","): + pre_data_list.append({ + 'promotion_id': f'{id}', + 'bind_source': '0', + 'link_url': f'{url}', + }) + + common_encrypt2(ua=headers['user-agent'],params=params) + json_data = { + 'pmts': pre_data_list, + 'hide_status': 2, + } + # json_data = { + # 'pmts': [ + # { + # 'promotion_id': '3702193318256605699', + # 'bind_source': '0', + # 'link_url': 'https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3702192299720179773&origin_type=2631', + # }, + # { + # 'promotion_id': '3743576749200507019', + # 'bind_source': '0', + # 'link_url': 'https://haohuo.jinritemai.com/views/product/item2?id=3741702496180109752', + # }, + # ], + # 'hide_status': 2, + # } + response = requests.post( + 'https://buyin.jinritemai.com/api/shop/bind/', + params=params, + cookies=cookies, + headers=headers, + json=json_data, + ) + + return { + "msg": "认证成功", + "data": response.json() + } +@app.post("/del_unbind") +def del_unbind(data:Dict,promotion_id:str): + cookies=data + headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'cache-control': 'no-cache', + 'content-type': 'application/json', + 'origin': 'https://buyin.jinritemai.com', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': 'https://buyin.jinritemai.com/dashboard/shopwindow/goods-list?universal_page_params_id=4695b182-8959-4fb8-b029-c4fd66004fcf', + 'sec-ch-ua': '"Microsoft Edge";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0', + 'x-secsdk-csrf-token': '000100000001c09f45d66c9f65f6d44d52a5e8f643275f46f7e4f97ef1e5507165c9c2d20aab1834e2fed2495e14', + } + + params = { + 'verifyFp': 'verify_m9ayab85_7PGRhlEt_WsSw_4Zxz_AMSa_CGNDBbiWKxfm', + 'fp': 'verify_m9ayab85_7PGRhlEt_WsSw_4Zxz_AMSa_CGNDBbiWKxfm', + 'msToken': 'RmS7vcjWRyT-H1E2l7_Gts5Q4nGHCBsdSwuWjThr8pTeeSDbcBI6SpaVhQX9ml_z3OMIFp1EX1NVFHGsPTggO7dWBL1IoIbkNn2jLRcgqpyR3rHG5-v8vdB-x93lsNgr_TQn0SPzatZk3c1DDqL5x74X8SH-CsBJaLExWecM7yYVD1cA1x-ccg==', + } + common_encrypt2(headers['user-agent'],params=params) + json_data = { + 'promotion_id': f'{promotion_id}', + } + + response = requests.post( + 'https://buyin.jinritemai.com/api/anchor/shop/unbind', + params=params, + cookies=cookies, + headers=headers, + json=json_data, + ) + return { + "msg": "认证成功", + "data": response.json() + } +if __name__ == "__main__": + uvicorn.run(app,host="0.0.0.0",port=8000) + # get_material_list() + # pack_detail() + # get_products() + # identify_products() + # add_products()