@ikenxuan/amagi 1.5.4 → 1.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,10 +6,14 @@ export default class DouyinData {
6
6
  URL;
7
7
  constructor(type, cookie) {
8
8
  this.type = type;
9
- this.headers = {};
10
- this.headers.Referer = 'https://www.douyin.com/';
11
- this.headers.Cookie = cookie,
12
- this.headers['Content-Type'] = 'application/json';
9
+ this.headers = {
10
+ Referer: 'https://www.douyin.com/',
11
+ Cookie: cookie,
12
+ Accept: '*/*',
13
+ 'Content-Type': 'application/json',
14
+ 'Accpet-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
15
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
16
+ };
13
17
  }
14
18
  async GetData(data = {}) {
15
19
  switch (this.type) {
@@ -1,50 +1,2 @@
1
- export declare class ABogus {
2
- filter: RegExp;
3
- arguments: number[];
4
- ua_key: string;
5
- end_string: string;
6
- version: number[];
7
- browser: string;
8
- reg: number[];
9
- str: any;
10
- chunk: number[];
11
- size: number;
12
- ua_code: number[];
13
- browser_len: number;
14
- browser_code: number[];
15
- constructor(platform?: string | null);
16
- list_1(random_num?: number | null, a?: number, b?: number, c?: number): number[];
17
- list_2(random_num?: number | null, a?: number, b?: number): number[];
18
- list_3(random_num?: number | null, a?: number, b?: number): number[];
19
- random_list(a?: number | null, b?: number, c?: number, d?: number, e?: number, f?: number, g?: number): number[];
20
- from_char_code(...args: number[]): string;
21
- generate_string_1(random_num_1?: number | null, random_num_2?: number | null, random_num_3?: number | null): string;
22
- generate_string_2(url_params: string, method?: string, start_time?: number, end_time?: number): string;
23
- generate_string_2_list(url_params: string, method?: string, start_time?: number, end_time?: number): number[];
24
- reg_to_array(a: number[]): number[];
25
- compress(a: number[]): void;
26
- generate_f(e: number[]): number[];
27
- generate_params_code(url_params: string): number[];
28
- generate_method_code(method: string): number[];
29
- sm3ToArray(data: string | number[]): number[];
30
- generate_params(url_params: string): string;
31
- generate_method(method: string): string;
32
- char_code_at(str: string): number[];
33
- de(a: number, b: number): number;
34
- pe(a: number): number;
35
- ve(a: number, b: number, c: number, d: number): number;
36
- he(a: number, b: number, c: number, d: number): number;
37
- end_check_num(a: number[]): number;
38
- tobase(a: number): string;
39
- rc4_encrypt(a: string, b: string): string;
40
- rc4_key_schedule(b: string): number[];
41
- list_4(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number): number[];
42
- generate_browser_info(platform: string): string;
43
- getABogus(url: string, method: string, start_time: number, end_time: number): string;
44
- get_reg(): string;
45
- get_value(url_params?: string, method?: string, start_time?: number, end_time?: number, random_num_1?: number | null, random_num_2?: number | null, random_num_3?: number | null): string;
46
- generateString(url_params: any, method: string, start_time: number, end_time: number): string;
47
- generate_result(s: string, e?: string): string;
48
- }
49
- declare const _default: (url: string, ua: string) => string;
1
+ declare const _default: (url: string, user_agent: string) => string;
50
2
  export default _default;
@@ -1,283 +1,462 @@
1
- import { parse, URLSearchParams } from 'url';
2
- import { sm3 } from 'sm-crypto-v2';
3
- export class ABogus {
4
- filter = /%([0-9A-F]{2})/g;
5
- arguments = [0, 1, 14];
6
- ua_key = "\u0000\u0001\u000e";
7
- end_string = "cus";
8
- version = [1, 0, 1, 5];
9
- browser = "1536|742|1536|864|0|0|0|0|1536|864|1536|864|1536|742|24|24|MacIntel";
10
- reg = [
11
- 1937774191,
12
- 1226093241,
13
- 388252375,
14
- 3666478592,
15
- 2842636476,
16
- 372324522,
17
- 3817729613,
18
- 2969243214,
19
- ];
20
- str = {
21
- "s0": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
22
- "s1": "Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
23
- "s2": "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
24
- "s3": "ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe",
25
- "s4": "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe",
26
- };
27
- chunk = [];
28
- size = 0;
29
- ua_code = [
30
- 76, 98, 15, 131, 97, 245, 224, 133, 122, 199, 241, 166, 79, 34, 90, 191,
31
- 128, 126, 122, 98, 66, 11, 14, 40, 49, 110, 110, 173, 67, 96, 138, 252
32
- ];
33
- browser_len;
34
- browser_code;
35
- constructor(platform = null) {
36
- this.browser = platform ? this.generate_browser_info(platform) : this.browser;
37
- this.browser_len = this.browser.length;
38
- this.browser_code = this.char_code_at(this.browser);
39
- }
40
- list_1(random_num = null, a = 170, b = 85, c = 45) {
41
- return this.random_list(random_num, a, b, 1, 2, 5, c & a);
42
- }
43
- list_2(random_num = null, a = 170, b = 85) {
44
- return this.random_list(random_num, a, b, 1, 0, 0, 0);
45
- }
46
- list_3(random_num = null, a = 170, b = 85) {
47
- return this.random_list(random_num, a, b, 1, 0, 5, 0);
48
- }
49
- random_list(a = null, b = 170, c = 85, d = 0, e = 0, f = 0, g = 0) {
50
- const r = a || (Math.random() * 10000);
51
- const v = [
52
- r,
53
- r & 255,
54
- r >> 8
55
- ];
56
- let s = v[1] & b | d;
57
- v.push(s);
58
- s = v[1] & c | e;
59
- v.push(s);
60
- s = v[2] & b | f;
61
- v.push(s);
62
- s = v[2] & c | g;
63
- v.push(s);
64
- return v.slice(-4);
65
- }
66
- from_char_code(...args) {
67
- return String.fromCharCode(...args);
68
- }
69
- generate_string_1(random_num_1 = null, random_num_2 = null, random_num_3 = null) {
70
- return this.from_char_code(...this.list_1(random_num_1)) +
71
- this.from_char_code(...this.list_2(random_num_2)) +
72
- this.from_char_code(...this.list_3(random_num_3));
73
- }
74
- generate_string_2(url_params, method = "GET", start_time = 0, end_time = 0) {
75
- const a = this.generate_string_2_list(url_params, method, start_time, end_time);
76
- const e = this.end_check_num(a);
77
- a.push(...this.browser_code, e);
78
- return this.rc4_encrypt(this.from_char_code(...a), "y");
79
- }
80
- generate_string_2_list(url_params, method = "GET", start_time = 0, end_time = 0) {
81
- start_time = start_time || Math.floor(Date.now());
82
- end_time = end_time || (start_time + Math.floor(Math.random() * (8 - 4 + 1)) + 4);
83
- const params_array = this.generate_params_code(url_params);
84
- const method_array = this.generate_method_code(method);
85
- return this.list_4((end_time >> 24) & 255, params_array[21], this.ua_code[23], (end_time >> 16) & 255, params_array[22], this.ua_code[24], (end_time >> 8) & 255, (end_time >> 0) & 255, (start_time >> 24) & 255, (start_time >> 16) & 255, (start_time >> 8) & 255, (start_time >> 0) & 255, method_array[21], method_array[22], Math.floor(end_time / 256 / 256 / 256 / 256) >> 0, Math.floor(start_time / 256 / 256 / 256 / 256) >> 0, this.browser_len);
86
- }
87
- reg_to_array(a) {
88
- const o = new Array(32).fill(0);
89
- for (let i = 0; i < 8; i++) {
90
- let c = a[i];
91
- o[4 * i + 3] = (255 & c);
92
- c >>= 8;
93
- o[4 * i + 2] = (255 & c);
94
- c >>= 8;
95
- o[4 * i + 1] = (255 & c);
96
- c >>= 8;
97
- o[4 * i] = (255 & c);
1
+ // All the content in this article is only for learning and communication use, not for any other purpose, strictly prohibited for commercial use and illegal use, otherwise all the consequences are irrelevant to the author!
2
+ class SM3 {
3
+ reg;
4
+ chunk;
5
+ size;
6
+ constructor() {
7
+ this.reg = [];
8
+ this.chunk = [];
9
+ this.size = 0;
10
+ this.reset();
11
+ }
12
+ reset() {
13
+ this.reg[0] = 1937774191;
14
+ this.reg[1] = 1226093241;
15
+ this.reg[2] = 388252375;
16
+ this.reg[3] = 3666478592;
17
+ this.reg[4] = 2842636476;
18
+ this.reg[5] = 372324522;
19
+ this.reg[6] = 3817729613;
20
+ this.reg[7] = 2969243214;
21
+ this.chunk = [];
22
+ this.size = 0;
23
+ }
24
+ write(e) {
25
+ const a = typeof e === 'string' ? this.stringToBytes(e) : e;
26
+ this.size += a.length;
27
+ let f = 64 - this.chunk.length;
28
+ if (a.length < f) {
29
+ this.chunk = this.chunk.concat(a);
98
30
  }
99
- return o;
100
- }
101
- compress(a) {
102
- const f = this.generate_f(a);
103
- const i = [...this.reg];
104
- for (let o = 0; o < 64; o++) {
105
- let c = this.de(i[0], 12) + i[4] + this.de(this.pe(o), o);
106
- c = (c & 0xFFFFFFFF);
107
- c = this.de(c, 7);
108
- const s = (c ^ this.de(i[0], 12)) & 0xFFFFFFFF;
109
- let u = this.he(o, i[0], i[1], i[2]);
110
- u = (u + i[3] + s + f[o + 68]) & 0xFFFFFFFF;
111
- let b = this.ve(o, i[4], i[5], i[6]);
112
- b = (b + i[7] + c + f[o]) & 0xFFFFFFFF;
113
- i[3] = i[2];
114
- i[2] = this.de(i[1], 9);
115
- i[1] = i[0];
116
- i[0] = u;
117
- i[7] = i[6];
118
- i[6] = this.de(i[5], 19);
119
- i[5] = i[4];
120
- i[4] = (b ^ this.de(b, 9) ^ this.de(b, 17)) & 0xFFFFFFFF;
121
- }
122
- for (let l = 0; l < 8; l++) {
123
- this.reg[l] = (this.reg[l] ^ i[l]) & 0xFFFFFFFF;
31
+ else {
32
+ this.chunk = this.chunk.concat(a.slice(0, f));
33
+ while (this.chunk.length >= 64) {
34
+ this._compress(this.chunk);
35
+ f < a.length ? this.chunk = a.slice(f, Math.min(f + 64, a.length)) : this.chunk = [];
36
+ f += 64;
37
+ }
124
38
  }
125
39
  }
126
- generate_f(e) {
127
- const r = new Array(132).fill(0);
128
- for (let t = 0; t < 16; t++) {
129
- r[t] = (255 & e[4 * t]) | (e[4 * t + 1] << 8) | (e[4 * t + 2] << 16) | (e[4 * t + 3] << 24);
40
+ sum(e, t) {
41
+ if (e) {
42
+ this.reset();
43
+ this.write(e);
130
44
  }
131
- for (let n = 16; n < 68; n++) {
132
- const u = r[n - 3] ^ r[n - 13] ^ this.de(r[n - 16], 15);
133
- const c = this.de(u, 17) ^ this.de(u, 9) ^ u;
134
- r[n] = c ^ r[n - 6];
45
+ this._fill();
46
+ for (let f = 0; f < this.chunk.length; f += 64) {
47
+ this._compress(this.chunk.slice(f, f + 64));
135
48
  }
136
- for (let i = 0; i < 64; i++) {
137
- r[68 + i] = r[i] ^ r[i + 4];
49
+ let i = null;
50
+ if (t === 'hex') {
51
+ i = '';
52
+ for (let f = 0; f < 8; f++) {
53
+ i += this.padHex(this.reg[f].toString(16), 8);
54
+ }
138
55
  }
139
- return r;
140
- }
141
- generate_params_code(url_params) {
142
- // console.log('generate_params_code', this.sm3ToArray(this.sm3ToArray(url_params + this.end_string)))
143
- return this.sm3ToArray(this.sm3ToArray(url_params + this.end_string));
144
- }
145
- generate_method_code(method) {
146
- return this.sm3ToArray(this.sm3ToArray(method + this.end_string));
56
+ else {
57
+ i = new Array(32);
58
+ for (let f = 0; f < 8; f++) {
59
+ let c = this.reg[f];
60
+ i[4 * f + 3] = (255 & c) >>> 0;
61
+ c >>>= 8;
62
+ i[4 * f + 2] = (255 & c) >>> 0;
63
+ c >>>= 8;
64
+ i[4 * f + 1] = (255 & c) >>> 0;
65
+ c >>>= 8;
66
+ i[4 * f] = (255 & c) >>> 0;
67
+ }
68
+ }
69
+ this.reset();
70
+ return i;
147
71
  }
148
- sm3ToArray(data) {
149
- let byteArray;
150
- if (typeof data === 'string') {
151
- byteArray = new TextEncoder().encode(data);
72
+ _compress(t) {
73
+ if (t.length < 64) {
74
+ console.error("compress error: not enough data");
152
75
  }
153
76
  else {
154
- byteArray = new Uint8Array(data);
155
- }
156
- // console.log(byteArray)
157
- const hashHex = sm3(byteArray);
158
- // console.log('sm3:', hashHex)
159
- const result = [];
160
- for (let i = 0; i < hashHex.length; i += 2) {
161
- result.push(parseInt(hashHex.substr(i, 2), 16));
77
+ for (var f = ((e) => {
78
+ for (var r = new Array(132), t = 0; t < 16; t++) {
79
+ (r[t] = e[4 * t] << 24), (r[t] |= e[4 * t + 1] << 16), (r[t] |= e[4 * t + 2] << 8), (r[t] |= e[4 * t + 3]), (r[t] >>>= 0);
80
+ }
81
+ for (var n = 16; n < 68; n++) {
82
+ let a = r[n - 16] ^ r[n - 9] ^ this.le(r[n - 3], 15);
83
+ (a = a ^ this.le(a, 15) ^ this.le(a, 23)), (r[n] = (a ^ this.le(r[n - 13], 7) ^ r[n - 6]) >>> 0);
84
+ }
85
+ for (n = 0; n < 64; n++)
86
+ r[n + 68] = (r[n] ^ r[n + 4]) >>> 0;
87
+ return r;
88
+ })(t), i = this.reg.slice(0), c = 0; c < 64; c++) {
89
+ let o = this.le(i[0], 12) + i[4] + this.le(this.de(c), c);
90
+ const s = ((o = this.le((o = (4294967295 & o) >>> 0), 7)) ^ this.le(i[0], 12)) >>> 0;
91
+ let u = this.pe(c, i[0], i[1], i[2]);
92
+ u = (4294967295 & (u = u + i[3] + s + f[c + 68])) >>> 0;
93
+ let b = this.he(c, i[4], i[5], i[6]);
94
+ (b = (4294967295 & (b = b + i[7] + o + f[c])) >>> 0),
95
+ (i[3] = i[2]),
96
+ (i[2] = this.le(i[1], 9)),
97
+ (i[1] = i[0]),
98
+ (i[0] = u),
99
+ (i[7] = i[6]),
100
+ (i[6] = this.le(i[5], 19)),
101
+ (i[5] = i[4]),
102
+ (i[4] = (b ^ this.le(b, 9) ^ this.le(b, 17)) >>> 0);
103
+ }
104
+ for (let l = 0; l < 8; l++)
105
+ this.reg[l] = (this.reg[l] ^ i[l]) >>> 0;
162
106
  }
163
- return result;
164
- }
165
- generate_params(url_params) {
166
- return url_params.split("").map(c => c.charCodeAt(0) % 255).map(this.tobase).join("");
167
- }
168
- generate_method(method) {
169
- return method.split("").map(c => c.charCodeAt(0) % 255).map(this.tobase).join("");
170
- }
171
- char_code_at(str) {
172
- return str.split("").map(c => c.charCodeAt(0));
173
107
  }
174
- de(a, b) {
175
- return (a << b) | (a >>> (32 - b));
176
- }
177
- pe(a) {
178
- const t = this.arguments[a & 3];
179
- return (t << 5) | t;
180
- }
181
- ve(a, b, c, d) {
182
- return (a & b) | (~a & c);
183
- }
184
- he(a, b, c, d) {
185
- return b ^ c ^ d;
186
- }
187
- end_check_num(a) {
188
- const r = (this.chunk.length << 3) & 255;
189
- const n = ((this.size >> 29) & 255) | ((this.size & 255) << 8);
190
- return (a[0] ^ a[1] ^ a[2] ^ a[3] ^ a[4] ^ a[5] ^ a[6] ^ a[7] ^ r ^ n) & 255;
191
- }
192
- tobase(a) {
193
- return ABogus.prototype.from_char_code.call(this, 0, 0, 0, a);
194
- }
195
- rc4_encrypt(a, b) {
196
- let c = this.rc4_key_schedule(b);
197
- let e = "";
198
- for (let f = 0; f < a.length; f++) {
199
- const g = a.charCodeAt(f);
200
- e += String.fromCharCode(g ^ c[f & 255]);
108
+ _fill() {
109
+ let a = 8 * this.size;
110
+ let f = this.chunk.push(128) % 64;
111
+ while (64 - f < 8) {
112
+ f -= 64;
201
113
  }
202
- return e;
203
- }
204
- rc4_key_schedule(b) {
205
- const c = new Array(256);
206
- const d = new Array(256);
207
- for (let i = 0; i < 256; i++) {
208
- c[i] = b.charCodeAt(i % b.length);
209
- d[i] = i;
114
+ while (f < 56) {
115
+ this.chunk.push(0);
116
+ f++;
210
117
  }
211
- let j = 0;
212
- for (let i = 0; i < 256; i++) {
213
- j = (j + d[i] + c[i]) % 256;
214
- [d[i], d[j]] = [d[j], d[i]];
118
+ for (let i = 0; i < 4; i++) {
119
+ const c = Math.floor(a / 0x100000000);
120
+ this.chunk.push((c >>> (8 * (3 - i))) & 255);
121
+ }
122
+ for (let i = 0; i < 4; i++) {
123
+ this.chunk.push((a >>> (8 * (3 - i))) & 255);
215
124
  }
216
- return d;
217
- }
218
- list_4(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) {
219
- return [
220
- a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q,
221
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
222
- ];
223
125
  }
224
- generate_browser_info(platform) {
225
- const ua = platform || "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0";
226
- const browser_info = ua.split("").map(c => (c.charCodeAt(0) % 255)).map(this.tobase).join("");
227
- return browser_info;
126
+ de(e) {
127
+ return 0 <= e && e < 16 ? 2043430169 : 16 <= e && e < 64 ? 2055708042 : (console.error("invalid j for constant Tj"), 0);
228
128
  }
229
- getABogus(url, method, start_time, end_time) {
230
- const url_params = parse(url, true).search || "";
231
- return this.generate_string_2(url_params, method, start_time, end_time);
129
+ pe(e, r, t, n) {
130
+ return 0 <= e && e < 16 ? (r ^ t ^ n) >>> 0 : 16 <= e && e < 64 ? (r & t | r & n | t & n) >>> 0 : (console.error('invalid j for bool function FF'), 0);
232
131
  }
233
- get_reg() {
234
- return this.rc4_encrypt(this.from_char_code(...this.reg_to_array(this.reg)), "x");
132
+ he(e, r, t, n) {
133
+ return 0 <= e && e < 16 ? (r ^ t ^ n) >>> 0 : 16 <= e && e < 64 ? (r & t | ~r & n) >>> 0 : (console.error('invalid j for bool function GG'), 0);
235
134
  }
236
- get_value(url_params = '', method = "GET", start_time = 0, end_time = 0, random_num_1, random_num_2, random_num_3) {
237
- const string_1 = this.generate_string_1(random_num_1, random_num_2, random_num_3);
238
- // console.log(string_1)
239
- const string_2 = this.generateString((new URLSearchParams((new URL(url_params)).search)).toString(), method, start_time, end_time);
240
- const string = string_1 + string_2;
241
- // console.log(string)
242
- return this.generate_result(string, 's4');
135
+ le(e, r) {
136
+ return (e << (r %= 32) | e >>> 32 - r) >>> 0;
243
137
  }
244
- generateString(url_params, method, start_time, end_time) {
245
- let string_2;
246
- // console.log(new URLSearchParams(url_params).toString())
247
- if (typeof url_params === 'object' && !Array.isArray(url_params) && url_params !== null) {
248
- // 如果url_params是一个对象(字典),则使用URLSearchParams来编码它
249
- string_2 = this.generate_string_2((new URLSearchParams((new URL(url_params)).search)).toString(), method, start_time, end_time);
250
- }
251
- else {
252
- // 否则,假设url_params已经是编码后的字符串或可以直接使用的值
253
- string_2 = this.generate_string_2(url_params.toString(), method, start_time, end_time);
138
+ stringToBytes(str) {
139
+ const n = encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, r) => String.fromCharCode(parseInt(r, 16)));
140
+ const a = new Array(n.length);
141
+ for (let i = 0; i < n.length; i++) {
142
+ a[i] = n.charCodeAt(i);
254
143
  }
255
- return string_2;
144
+ return a;
256
145
  }
257
- generate_result(s, e = "s4") {
258
- const r = [];
259
- for (let i = 0; i < s.length; i += 3) {
260
- let n;
261
- if (i + 2 < s.length) {
262
- n = (s.charCodeAt(i) << 16) | (s.charCodeAt(i + 1) << 8) | s.charCodeAt(i + 2);
263
- }
264
- else if (i + 1 < s.length) {
265
- n = (s.charCodeAt(i) << 16) | (s.charCodeAt(i + 1) << 8);
266
- }
267
- else {
268
- n = s.charCodeAt(i) << 16;
269
- }
270
- for (let j = 18, k = [0xFC0000, 0x03F000, 0x0FC0, 0x3F]; j >= 0; j -= 6) {
271
- if ((j === 6 && i + 1 >= s.length) || (j === 0 && i + 2 >= s.length)) {
272
- break;
273
- }
274
- r.push(this.str[e][(n & k[(18 - j) / 6]) >> j]);
275
- }
146
+ padHex(num, size) {
147
+ return num.padStart(size, '0');
148
+ }
149
+ }
150
+ function rc4_encrypt(plaintext, key) {
151
+ const s = [];
152
+ for (var i = 0; i < 256; i++) {
153
+ s[i] = i;
154
+ }
155
+ var j = 0;
156
+ for (var i = 0; i < 256; i++) {
157
+ j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
158
+ var temp = s[i];
159
+ s[i] = s[j];
160
+ s[j] = temp;
161
+ }
162
+ var i = 0;
163
+ var j = 0;
164
+ const cipher = [];
165
+ for (let k = 0; k < plaintext.length; k++) {
166
+ i = (i + 1) % 256;
167
+ j = (j + s[i]) % 256;
168
+ var temp = s[i];
169
+ s[i] = s[j];
170
+ s[j] = temp;
171
+ const t = (s[i] + s[j]) % 256;
172
+ cipher.push(String.fromCharCode(s[t] ^ plaintext.charCodeAt(k)));
173
+ }
174
+ return cipher.join('');
175
+ }
176
+ function result_encrypt(long_str, num) {
177
+ const s_obj = {
178
+ s0: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
179
+ s1: 'Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=',
180
+ s2: 'Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=',
181
+ s3: 'ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe',
182
+ s4: 'Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe'
183
+ };
184
+ const constant = {
185
+ "0": 16515072,
186
+ "1": 258048,
187
+ "2": 4032,
188
+ "str": s_obj[num],
189
+ };
190
+ let result = "";
191
+ let lound = 0;
192
+ let long_int = get_long_int(lound, long_str);
193
+ for (let i = 0; i < long_str.length / 3 * 4; i++) {
194
+ if (Math.floor(i / 4) !== lound) {
195
+ lound += 1;
196
+ long_int = get_long_int(lound, long_str);
197
+ }
198
+ let key = i % 4;
199
+ let temp_int;
200
+ switch (key) {
201
+ case 0:
202
+ temp_int = (long_int & constant["0"]) >> 18;
203
+ result += constant["str"].charAt(temp_int);
204
+ break;
205
+ case 1:
206
+ temp_int = (long_int & constant["1"]) >> 12;
207
+ result += constant["str"].charAt(temp_int);
208
+ break;
209
+ case 2:
210
+ temp_int = (long_int & constant["2"]) >> 6;
211
+ result += constant["str"].charAt(temp_int);
212
+ break;
213
+ case 3:
214
+ temp_int = long_int & 63;
215
+ result += constant["str"].charAt(temp_int);
216
+ break;
217
+ default:
218
+ break;
276
219
  }
277
- r.push("=".repeat((4 - (r.length % 4)) % 4));
278
- return r.join("");
279
220
  }
221
+ return result;
222
+ }
223
+ function get_long_int(round, long_str) {
224
+ round = round * 3;
225
+ return (long_str.charCodeAt(round) << 16) | (long_str.charCodeAt(round + 1) << 8) | long_str.charCodeAt(round + 2);
226
+ }
227
+ function gener_random(random, option) {
228
+ return [
229
+ (random & 255 & 170) | option[0] & 85, // 163
230
+ (random & 255 & 85) | option[0] & 170, //87
231
+ (random >> 8 & 255 & 170) | option[1] & 85, //37
232
+ (random >> 8 & 255 & 85) | option[1] & 170, //41
233
+ ];
234
+ }
235
+ function generate_rc4_bb_str(url_search_params, user_agent, window_env_str, suffix = "cus", Arguments = [0, 1, 14]) {
236
+ let sm3 = new SM3();
237
+ let start_time = Date.now();
238
+ // url_search_params两次sm3之的结果
239
+ const url_search_params_list = sm3.sum(sm3.sum(url_search_params + suffix));
240
+ // 对后缀两次sm3之的结果
241
+ const cus = sm3.sum(sm3.sum(suffix));
242
+ // 对ua处理之后的结果
243
+ const ua = sm3.sum(result_encrypt(rc4_encrypt(user_agent, String.fromCharCode.apply(null, [0.00390625, 1, 14])), 's3'));
244
+ //
245
+ const end_time = Date.now();
246
+ // b object initialization
247
+ let b = {
248
+ 8: 3, // 固定
249
+ 10: end_time, // 3次加密结束时间
250
+ 15: {
251
+ aid: 6383,
252
+ pageId: 6241,
253
+ boe: false,
254
+ ddrt: 7,
255
+ paths: {
256
+ include: [{}, {}, {}, {}, {}, {}, {}],
257
+ exclude: []
258
+ },
259
+ track: {
260
+ mode: 0,
261
+ delay: 300,
262
+ paths: []
263
+ },
264
+ dump: true,
265
+ rpU: ''
266
+ },
267
+ 16: start_time, // 3次加密开始时间
268
+ 18: 44, // 固定
269
+ 19: [1, 0, 1, 5]
270
+ };
271
+ // 3次加密开始时间
272
+ b[20] = (b[16] >> 24) & 255;
273
+ b[21] = (b[16] >> 16) & 255;
274
+ b[22] = (b[16] >> 8) & 255;
275
+ b[23] = b[16] & 255;
276
+ b[24] = (b[16] / 256 / 256 / 256 / 256) >> 0;
277
+ b[25] = (b[16] / 256 / 256 / 256 / 256 / 256) >> 0;
278
+ // 参数Arguments [0, 1, 14, ...]
279
+ // let Arguments = [0, 1, 14]
280
+ b[26] = (Arguments[0] >> 24) & 255;
281
+ b[27] = (Arguments[0] >> 16) & 255;
282
+ b[28] = (Arguments[0] >> 8) & 255;
283
+ b[29] = Arguments[0] & 255;
284
+ b[30] = (Arguments[1] / 256) & 255;
285
+ b[31] = Arguments[1] % 256 & 255;
286
+ b[32] = (Arguments[1] >> 24) & 255;
287
+ b[33] = (Arguments[1] >> 16) & 255;
288
+ b[34] = (Arguments[2] >> 24) & 255;
289
+ b[35] = (Arguments[2] >> 16) & 255;
290
+ b[36] = (Arguments[2] >> 8) & 255;
291
+ b[37] = Arguments[2] & 255;
292
+ // (url_search_params + "cus") 两次sm3之的结果
293
+ /** let url_search_params_list = [
294
+ 91, 186, 35, 86, 143, 253, 6, 76,
295
+ 34, 21, 167, 148, 7, 42, 192, 219,
296
+ 188, 20, 182, 85, 213, 74, 213, 147,
297
+ 37, 155, 93, 139, 85, 118, 228, 213
298
+ ] */
299
+ b[38] = url_search_params_list[21];
300
+ b[39] = url_search_params_list[22];
301
+ // ("cus") 对后缀两次sm3之的结果
302
+ /**
303
+ * let cus = [
304
+ 136, 101, 114, 147, 58, 77, 207, 201,
305
+ 215, 162, 154, 93, 248, 13, 142, 160,
306
+ 105, 73, 215, 241, 83, 58, 51, 43,
307
+ 255, 38, 168, 141, 216, 194, 35, 236
308
+ ] */
309
+ b[40] = cus[21];
310
+ b[41] = cus[22];
311
+ // 对ua处理之后的结果
312
+ /**
313
+ * let ua = [
314
+ 129, 190, 70, 186, 86, 196, 199, 53,
315
+ 99, 38, 29, 209, 243, 17, 157, 69,
316
+ 147, 104, 53, 23, 114, 126, 66, 228,
317
+ 135, 30, 168, 185, 109, 156, 251, 88
318
+ ] */
319
+ b[42] = ua[23];
320
+ b[43] = ua[24];
321
+ // 3次加密结束时间
322
+ b[44] = (b[10] >> 24) & 255;
323
+ b[45] = (b[10] >> 16) & 255;
324
+ b[46] = (b[10] >> 8) & 255;
325
+ b[47] = b[10] & 255;
326
+ b[48] = b[8];
327
+ b[49] = (b[10] / 256 / 256 / 256 / 256) >> 0;
328
+ b[50] = (b[10] / 256 / 256 / 256 / 256 / 256) >> 0;
329
+ // object配置项
330
+ b[51] = b[15].pageId;
331
+ b[52] = (b[15].pageId >> 24) & 255;
332
+ b[53] = (b[15].pageId >> 16) & 255;
333
+ b[54] = (b[15].pageId >> 8) & 255;
334
+ b[55] = b[15].pageId & 255;
335
+ b[56] = b[15].aid;
336
+ b[57] = b[15].aid & 255;
337
+ b[58] = (b[15].aid >> 8) & 255;
338
+ b[59] = (b[15].aid >> 16) & 255;
339
+ b[60] = (b[15].aid >> 24) & 255;
340
+ // 中间进行了环境检测
341
+ // 代码索引: 2496 索引值: 17 (索引64关键条件)
342
+ // '1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32'.charCodeAt()得到65位数组
343
+ /**
344
+ * let window_env_list = [49, 53, 51, 54, 124, 55, 52, 55, 124, 49, 53, 51, 54, 124, 56, 51, 52, 124, 48, 124, 51,
345
+ * 48, 124, 48, 124, 48, 124, 49, 53, 51, 54, 124, 56, 51, 52, 124, 49, 53, 51, 54, 124, 56,
346
+ * 54, 52, 124, 49, 53, 50, 53, 124, 55, 52, 55, 124, 50, 52, 124, 50, 52, 124, 87, 105, 110,
347
+ * 51, 50]
348
+ */
349
+ const window_env_list = [];
350
+ for (let index = 0; index < window_env_str.length; index++) {
351
+ window_env_list.push(window_env_str.charCodeAt(index));
352
+ }
353
+ b[64] = window_env_list.length;
354
+ b[65] = b[64] & 255;
355
+ b[66] = (b[64] >> 8) & 255;
356
+ b[69] = [].length;
357
+ b[70] = b[69] & 255;
358
+ b[71] = (b[69] >> 8) & 255;
359
+ b[72] =
360
+ b[18] ^
361
+ b[20] ^
362
+ b[26] ^
363
+ b[30] ^
364
+ b[38] ^
365
+ b[40] ^
366
+ b[42] ^
367
+ b[21] ^
368
+ b[27] ^
369
+ b[31] ^
370
+ b[35] ^
371
+ b[39] ^
372
+ b[41] ^
373
+ b[43] ^
374
+ b[22] ^
375
+ b[28] ^
376
+ b[32] ^
377
+ b[36] ^
378
+ b[23] ^
379
+ b[29] ^
380
+ b[33] ^
381
+ b[37] ^
382
+ b[44] ^
383
+ b[45] ^
384
+ b[46] ^
385
+ b[47] ^
386
+ b[48] ^
387
+ b[49] ^
388
+ b[50] ^
389
+ b[24] ^
390
+ b[25] ^
391
+ b[52] ^
392
+ b[53] ^
393
+ b[54] ^
394
+ b[55] ^
395
+ b[57] ^
396
+ b[58] ^
397
+ b[59] ^
398
+ b[60] ^
399
+ b[65] ^
400
+ b[66] ^
401
+ b[70] ^
402
+ b[71];
403
+ let bb = [
404
+ b[18],
405
+ b[20],
406
+ b[52],
407
+ b[26],
408
+ b[30],
409
+ b[34],
410
+ b[58],
411
+ b[38],
412
+ b[40],
413
+ b[53],
414
+ b[42],
415
+ b[21],
416
+ b[27],
417
+ b[54],
418
+ b[55],
419
+ b[31],
420
+ b[35],
421
+ b[57],
422
+ b[39],
423
+ b[41],
424
+ b[43],
425
+ b[22],
426
+ b[28],
427
+ b[32],
428
+ b[60],
429
+ b[36],
430
+ b[23],
431
+ b[29],
432
+ b[33],
433
+ b[37],
434
+ b[44],
435
+ b[45],
436
+ b[59],
437
+ b[46],
438
+ b[47],
439
+ b[48],
440
+ b[49],
441
+ b[50],
442
+ b[24],
443
+ b[25],
444
+ b[65],
445
+ b[66],
446
+ b[70],
447
+ b[71]
448
+ ];
449
+ bb = bb.concat(window_env_list).concat(b[72]);
450
+ return rc4_encrypt(String.fromCharCode.apply(null, bb), String.fromCharCode.apply(null, [121]));
451
+ }
452
+ function generate_random_str() {
453
+ let random_str_list = [];
454
+ random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [3, 45]));
455
+ random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [1, 0]));
456
+ random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [1, 5]));
457
+ return String.fromCharCode.apply(null, random_str_list);
280
458
  }
281
- export default (url, ua) => {
282
- return encodeURIComponent(new ABogus(ua).get_value(url));
459
+ export default (url, user_agent) => {
460
+ let result_str = generate_random_str() + generate_rc4_bb_str((new URLSearchParams((new URL(url)).search)).toString(), user_agent, "1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32");
461
+ return result_encrypt(result_str, 's4') + '=';
283
462
  };
@@ -1,5 +1,6 @@
1
1
  import fetch, { Response } from 'node-fetch';
2
2
  import { logger } from '../model/index.js';
3
+ const controller = new AbortController();
3
4
  export default class Networks {
4
5
  url;
5
6
  method;
@@ -92,6 +93,10 @@ export default class Networks {
92
93
  if (result.status === 504) {
93
94
  return result;
94
95
  }
96
+ if (result.status === 429) {
97
+ logger.warn('HTTP 响应状态码: 429');
98
+ throw new Error('ratelimit triggered, 触发 https://www.douyin.com/ 的速率限制!!!');
99
+ }
95
100
  this.fetch = result;
96
101
  this.isGetResult = true;
97
102
  }
@@ -212,7 +217,6 @@ export default class Networks {
212
217
  this.fetch = await this.fetch.blob();
213
218
  }
214
219
  timeoutPromise(timeout) {
215
- const controller = new AbortController();
216
220
  return new Promise((resolve, reject) => {
217
221
  this.timer = setTimeout(() => {
218
222
  logger.info('执行力');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikenxuan/amagi",
3
- "version": "1.5.4",
3
+ "version": "1.5.5",
4
4
  "type": "module",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -38,8 +38,7 @@
38
38
  "loglevel": "^1.9.1",
39
39
  "loglevel-plugin-prefix": "^0.8.4",
40
40
  "md5": "^2.3.0",
41
- "node-fetch": "^3.3.2",
42
- "sm-crypto-v2": "^1.9.1"
41
+ "node-fetch": "^3.3.2"
43
42
  },
44
43
  "devDependencies": {
45
44
  "@types/lodash": "latest",