fingerprint-chromium-engine 0.1.0

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.
@@ -0,0 +1,459 @@
1
+ import { BrowserContext, BrowserType } from 'playwright-core';
2
+
3
+ /**
4
+ * Tùy chọn cấu hình profile cho trình duyệt.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * browser.useProfile('./profiles/user_01', {
9
+ * loadProxy: true,
10
+ * loadFingerprint: true,
11
+ * });
12
+ * ```
13
+ */
14
+ interface ProfileOptions {
15
+ /**
16
+ * Tự động load proxy đã dùng lần trước từ thư mục profile.
17
+ *
18
+ * @default true
19
+ */
20
+ loadProxy?: boolean;
21
+ /**
22
+ * Tự động load fingerprint đã dùng lần trước từ thư mục profile.
23
+ *
24
+ * @default true
25
+ */
26
+ loadFingerprint?: boolean;
27
+ }
28
+
29
+ /**
30
+ * Tùy chọn kiểm soát các kỹ thuật giả lập fingerprint trên trình duyệt.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * browser.useFingerprint(data, {
35
+ * usePerfectCanvas: true,
36
+ * safeWebGL: true,
37
+ * safeAudio: true,
38
+ * });
39
+ * ```
40
+ */
41
+ interface FingerprintOptions {
42
+ /**
43
+ * Giả lập màn hình mật độ pixel cao (HiDPI/Retina) theo fingerprint.
44
+ * Trình duyệt sẽ render ở độ phân giải cao hơn, tốn thêm tài nguyên hệ thống.
45
+ * Các giá trị JS liên quan như `devicePixelRatio` luôn được thay thế đúng dù bật hay tắt.
46
+ *
47
+ * @default true
48
+ */
49
+ emulateDeviceScaleFactor?: boolean;
50
+ /**
51
+ * Giả lập Sensor API (gia tốc kế, con quay hồi chuyển...) theo fingerprint.
52
+ * Nên bật khi giả lập fingerprint thiết bị di động.
53
+ *
54
+ * @default true
55
+ */
56
+ emulateSensorAPI?: boolean;
57
+ /**
58
+ * Bật chế độ PerfectCanvas để thay thế dữ liệu Canvas chính xác theo fingerprint.
59
+ * Yêu cầu fingerprint phải chứa dữ liệu PerfectCanvas.
60
+ *
61
+ * @default true
62
+ */
63
+ usePerfectCanvas?: boolean;
64
+ /**
65
+ * Cho phép dùng bộ FontPack (nếu đã cài) để đồng bộ font với fingerprint.
66
+ * Tránh sai lệch khi fingerprint mục tiêu có nhiều font hơn hệ thống hiện tại.
67
+ *
68
+ * Tải FontPack tại: https://wiki.bablosoft.com/doku.php?id=fontpack
69
+ *
70
+ * @default true
71
+ */
72
+ useFontPack?: boolean;
73
+ /**
74
+ * Che giấu tọa độ thực của DOM element, chống lại kỹ thuật ClientRects fingerprinting.
75
+ *
76
+ * @default false
77
+ */
78
+ safeElementSize?: boolean;
79
+ /**
80
+ * Giả lập Battery API với giá trị khác nhau cho mỗi phiên.
81
+ * Nếu thiết bị gốc không có Battery API, luôn trả về 100%.
82
+ *
83
+ * @default true
84
+ */
85
+ safeBattery?: boolean;
86
+ /**
87
+ * Thêm nhiễu vào dữ liệu Canvas 2D để chống canvas fingerprinting.
88
+ *
89
+ * @default true
90
+ */
91
+ safeCanvas?: boolean;
92
+ /**
93
+ * Thêm nhiễu vào Web Audio API, che giấu thông tin phần cứng âm thanh
94
+ * như sample rate và số kênh âm thanh.
95
+ *
96
+ * @default true
97
+ */
98
+ safeAudio?: boolean;
99
+ /**
100
+ * Thêm nhiễu vào WebGL, che giấu thông tin GPU
101
+ * như tên nhà sản xuất và renderer của card đồ họa.
102
+ *
103
+ * @default true
104
+ */
105
+ safeWebGL?: boolean;
106
+ }
107
+
108
+ /**
109
+ * Phương thức trích xuất địa chỉ IP từ response của service URL.
110
+ *
111
+ * - `raw` - Lấy toàn bộ nội dung response làm IP.
112
+ * - `xpath` - Trích xuất IP bằng biểu thức XPath.
113
+ * - `regexp` - Trích xuất IP bằng biểu thức chính quy.
114
+ * - `jsonpath` - Trích xuất IP bằng biểu thức JSONPath.
115
+ */
116
+ type IPExtractionMethod = 'raw' | 'xpath' | 'regexp' | 'jsonpath';
117
+ /**
118
+ * Giá trị thay thế cho địa chỉ IP nội bộ (private IP) trong WebRTC.
119
+ *
120
+ * - `disable` - Không hiển thị IP nội bộ.
121
+ * - `local` - Dùng địa chỉ IP nội bộ thực của máy.
122
+ * - Hoặc truyền vào một địa chỉ IP cụ thể.
123
+ */
124
+ type PrivateIPReplacement = IPString | 'disable' | 'local';
125
+ /**
126
+ * Giá trị thay thế cho địa chỉ IP công khai (public IP) trong WebRTC.
127
+ *
128
+ * - `disable` - Không hiển thị IP công khai.
129
+ * - `auto` - Tự động lấy IP công khai từ proxy.
130
+ * - Hoặc truyền vào một địa chỉ IP cụ thể.
131
+ */
132
+ type PublicIPReplacement = IPString | 'disable' | 'auto';
133
+ /**
134
+ * Bất kỳ chuỗi nào có thể được dùng làm địa chỉ IP.
135
+ */
136
+ type IPString = string & {};
137
+ /**
138
+ * Tùy chọn cấu hình proxy cho trình duyệt.
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * browser.useProxy('http://user:pass@host:port', {
143
+ * changeBrowserLanguage: true,
144
+ * changeTimezone: true,
145
+ * changeWebRTC: 'replace',
146
+ * enableTunneling: true,
147
+ * });
148
+ * ```
149
+ */
150
+ interface ProxyOptions {
151
+ /**
152
+ * Tự động đổi ngôn ngữ trình duyệt theo quốc gia của proxy.
153
+ * Ảnh hưởng đến header `Accept-Language` và `navigator.language`.
154
+ *
155
+ * @default true
156
+ */
157
+ changeBrowserLanguage?: boolean;
158
+ /**
159
+ * Đổi vị trí địa lý (geolocation) của trình duyệt theo IP của proxy.
160
+ * Nếu tắt, trình duyệt sẽ từ chối mọi yêu cầu truy cập vị trí.
161
+ *
162
+ * @default false
163
+ */
164
+ changeGeolocation?: boolean;
165
+ /**
166
+ * Đổi múi giờ trình duyệt theo IP của proxy.
167
+ *
168
+ * @default true
169
+ */
170
+ changeTimezone?: boolean;
171
+ /**
172
+ * Cấu hình hành vi WebRTC.
173
+ *
174
+ * - `enable` - Bật WebRTC, lộ IP thật.
175
+ * - `disable` - Tắt hoàn toàn WebRTC.
176
+ * - `replace` - Thay thế IP trong WebRTC bằng IP của proxy.
177
+ *
178
+ * @default 'replace'
179
+ */
180
+ changeWebRTC?: 'enable' | 'disable' | 'replace';
181
+ /**
182
+ * Địa chỉ IPv4 công khai hiển thị qua WebRTC.
183
+ * Chỉ có hiệu lực khi `changeWebRTC` là `replace`.
184
+ *
185
+ * @default 'auto'
186
+ */
187
+ publicIPv4?: PublicIPReplacement;
188
+ /**
189
+ * Địa chỉ IPv6 công khai hiển thị qua WebRTC.
190
+ * Chỉ có hiệu lực khi `changeWebRTC` là `replace`.
191
+ *
192
+ * @default 'auto'
193
+ */
194
+ publicIPv6?: PublicIPReplacement;
195
+ /**
196
+ * Địa chỉ IPv4 nội bộ hiển thị qua WebRTC.
197
+ * Chỉ có hiệu lực khi `changeWebRTC` là `replace`.
198
+ *
199
+ * @default 'local'
200
+ */
201
+ privateIPv4?: PrivateIPReplacement | 'private class a' | 'private class b' | 'private class c';
202
+ /**
203
+ * Địa chỉ IPv6 nội bộ hiển thị qua WebRTC.
204
+ * Chỉ có hiệu lực khi `changeWebRTC` là `replace`.
205
+ *
206
+ * @default 'local'
207
+ */
208
+ privateIPv6?: PrivateIPReplacement | 'unique local address';
209
+ /**
210
+ * Phương thức trích xuất IP từ response của `ipExtractionURL`.
211
+ * Cần dùng kết hợp với `ipExtractionParam`.
212
+ * Có thể cấu hình riêng cho IPv4 và IPv6 bằng object notation.
213
+ *
214
+ * @default 'raw'
215
+ */
216
+ ipExtractionMethod?: IPExtractionMethod | {
217
+ v4: IPExtractionMethod;
218
+ v6: IPExtractionMethod;
219
+ };
220
+ /**
221
+ * Tham số dùng để trích xuất IP từ response của `ipExtractionURL`.
222
+ * Cần dùng kết hợp với `ipExtractionMethod`.
223
+ * Có thể cấu hình riêng cho IPv4 và IPv6 bằng object notation.
224
+ *
225
+ * @default ''
226
+ */
227
+ ipExtractionParam?: string | {
228
+ v4: string;
229
+ v6: string;
230
+ };
231
+ /**
232
+ * URL dùng để xác định IP công khai hiện tại qua proxy.
233
+ * Response phải chứa địa chỉ IP.
234
+ * Có thể cấu hình riêng cho IPv4 và IPv6 bằng object notation.
235
+ *
236
+ * @default ''
237
+ */
238
+ ipExtractionURL?: string | {
239
+ v4: string;
240
+ v6: string;
241
+ };
242
+ /**
243
+ * Tự động phát hiện IP công khai bằng cách truy vấn service bên ngoài.
244
+ * Hữu ích khi IP kết nối proxy khác với IP hiển thị ra bên ngoài.
245
+ * Có thể cấu hình riêng cho IPv4 và IPv6 bằng object notation.
246
+ *
247
+ * @default true
248
+ */
249
+ detectExternalIP?: boolean | {
250
+ v4: boolean;
251
+ v6: boolean;
252
+ };
253
+ /**
254
+ * Phương thức tra cứu thông tin địa lý từ địa chỉ IP.
255
+ *
256
+ * - `database` - Dùng database nội bộ, nhanh nhưng kém chính xác hơn.
257
+ * - `ip-api.com` - Dùng service bên ngoài, chính xác hơn nhưng giới hạn 45 request/IP (bản free).
258
+ *
259
+ * @default 'database'
260
+ */
261
+ ipInfoMethod?: 'database' | 'ip-api.com';
262
+ /**
263
+ * API key của dịch vụ [ip-api.com](https://ip-api.com/) (bản trả phí).
264
+ * Chỉ có hiệu lực khi `ipInfoMethod` là `ip-api.com`.
265
+ *
266
+ * @default ''
267
+ */
268
+ ipInfoKey?: string;
269
+ /**
270
+ * Bật/tắt hệ thống tunneling tích hợp.
271
+ * Nếu tắt, proxy sẽ không hoạt động — dùng khi đã có VPN hoặc muốn kết nối trực tiếp.
272
+ *
273
+ * @default true
274
+ */
275
+ enableTunneling?: boolean;
276
+ /**
277
+ * Bật giao thức QUIC (chạy trên UDP).
278
+ * Chỉ bật nếu proxy server hỗ trợ UDP.
279
+ *
280
+ * @default false
281
+ */
282
+ enableQUIC?: boolean;
283
+ /**
284
+ * Chế độ phân giải DNS.
285
+ *
286
+ * - `system-proxy` - Dùng DNS hệ thống, hostname được gửi đến proxy để phân giải.
287
+ * - `custom-proxy` - Dùng DNS tùy chỉnh của Chrome, truy vấn DNS qua proxy (proxy phải hỗ trợ UDP).
288
+ * - `custom-direct` - Dùng DNS tùy chỉnh của Chrome, phân giải DNS cục bộ, traffic còn lại đi qua proxy.
289
+ *
290
+ * Khuyến nghị dùng `custom-direct` nếu muốn sử dụng DNS tùy chỉnh.
291
+ * Lưu ý: cần chỉ định `dnsIP` khi dùng `custom-proxy` hoặc `custom-direct`.
292
+ *
293
+ * @default 'system-proxy'
294
+ */
295
+ dnsMode?: 'system-proxy' | 'custom-proxy' | 'custom-direct';
296
+ /**
297
+ * Địa chỉ IP của DNS server khi dùng chế độ `custom-proxy` hoặc `custom-direct`.
298
+ * Không có hiệu lực khi `dnsMode` là `system-proxy`.
299
+ *
300
+ * @default '1.1.1.1'
301
+ */
302
+ dnsIP?: string;
303
+ }
304
+
305
+ /**
306
+ * Interface điều khiển trình duyệt Chromium với hỗ trợ fingerprint, proxy và profile.
307
+ *
308
+ * Các method cấu hình (`useFingerprint`, `useProxy`, `useProfile`, `usePrivateKey`)
309
+ * phải được gọi trước `launch()`. Sau khi `launch()` được gọi, cấu hình sẽ không thể thay đổi.
310
+ *
311
+ * @example
312
+ * ```ts
313
+ * const browser: PWChromium = new BrowserEngine();
314
+ *
315
+ * const context = await browser
316
+ * .usePrivateKey('your-private-key')
317
+ * .useFingerprint(fingerprintData, { usePerfectCanvas: true })
318
+ * .useProxy('http://user:pass@host:port', { changeTimezone: true })
319
+ * .useProfile('./profiles/user_01', { loadFingerprint: true })
320
+ * .launch({ headless: false })
321
+ * .newContext();
322
+ *
323
+ * const page = await context.newPage();
324
+ * await page.goto('https://example.com');
325
+ *
326
+ * await browser.quit('./profiles/user_01'); // đóng và lưu profile
327
+ * ```
328
+ */
329
+ interface PWChromium {
330
+ /**
331
+ * Thiết lập private key để xác thực với engine.
332
+ *
333
+ * Nếu không gọi, engine sẽ dùng key mặc định từ biến môi trường `BABLOSOFT_KEY`.
334
+ * Cần gọi trước `launch()`.
335
+ *
336
+ * @param privateKey - Key xác thực do bablosoft cung cấp.
337
+ *
338
+ * @example
339
+ * browser.usePrivateKey('your-private-key')
340
+ */
341
+ usePrivateKey(privateKey: string): this;
342
+ /**
343
+ * Thay thế Chromium mặc định bằng một launcher tùy chỉnh.
344
+ *
345
+ * Launcher mặc định đã được patch sẵn để chống detection — chỉ dùng method này
346
+ * khi có lý do đặc biệt và hiểu rõ rủi ro bị detect.
347
+ * Cần gọi trước `launch()`.
348
+ *
349
+ * @param launcher - Launcher tùy chỉnh thay thế Chromium mặc định.
350
+ *
351
+ * @example
352
+ * browser.repackChromium(customLauncher)
353
+ */
354
+ repackChromium(launcher: Launcher): this;
355
+ /**
356
+ * Gắn fingerprint vào trình duyệt để giả lập thiết bị, tránh bị detect.
357
+ *
358
+ * Fingerprint chứa thông tin phần cứng, màn hình, trình duyệt...
359
+ * giúp trình duyệt trông như một thiết bị thật.
360
+ * Cần gọi trước `launch()`.
361
+ *
362
+ * @param data - Chuỗi fingerprint lấy từ service bablosoft.
363
+ * @param options - Tùy chọn kiểm soát các kỹ thuật giả lập, xem {@link FingerprintOptions}.
364
+ *
365
+ * @example
366
+ * browser.useFingerprint(fingerprintData, {
367
+ * usePerfectCanvas: true,
368
+ * safeWebGL: true,
369
+ * })
370
+ */
371
+ useFingerprint(data: string, options?: FingerprintOptions): this;
372
+ /**
373
+ * Định tuyến toàn bộ traffic của trình duyệt qua proxy.
374
+ *
375
+ * Hỗ trợ các giao thức HTTP, HTTPS, SOCKS4, SOCKS5.
376
+ * Cần gọi trước `launch()`.
377
+ *
378
+ * @param data - Proxy string theo định dạng `protocol://user:pass@host:port`.
379
+ * @param options - Tùy chọn bổ sung như đổi timezone, geolocation, WebRTC... xem {@link ProxyOptions}.
380
+ *
381
+ * @example
382
+ * browser.useProxy('http://user:pass@127.0.0.1:8080', {
383
+ * changeTimezone: true,
384
+ * changeGeolocation: true,
385
+ * changeWebRTC: 'replace',
386
+ * })
387
+ */
388
+ useProxy(data: string, options?: ProxyOptions): this;
389
+ /**
390
+ * Liên kết thư mục profile với trình duyệt.
391
+ *
392
+ * Profile lưu trữ cookies, localStorage, session, lịch sử đăng nhập...
393
+ * giúp duy trì trạng thái giữa các phiên. Profile sẽ tự động được lưu
394
+ * về `dirPath` khi gọi `quit()`.
395
+ * Cần gọi trước `launch()`.
396
+ *
397
+ * @param dirPath - Đường dẫn thư mục lưu profile.
398
+ * @param options - Tùy chọn load proxy/fingerprint từ profile, xem {@link ProfileOptions}.
399
+ *
400
+ * @example
401
+ * browser.useProfile('./profiles/user_01', {
402
+ * loadProxy: true,
403
+ * loadFingerprint: true,
404
+ * })
405
+ */
406
+ useProfile(dirPath: string, options?: ProfileOptions): this;
407
+ /**
408
+ * Khởi tạo engine với toàn bộ cấu hình đã thiết lập.
409
+ *
410
+ * Bắt buộc phải gọi trước `newContext()`.
411
+ * Chỉ được gọi một lần trong vòng đời của instance —
412
+ * gọi lại sẽ ném lỗi.
413
+ *
414
+ * @param options - Override các tùy chọn launch mặc định (headless, viewport...).
415
+ * @throws {Error} Nếu gọi lại sau khi đã launch.
416
+ *
417
+ * @example
418
+ * browser.launch({ headless: false })
419
+ */
420
+ launch(options?: Partial<PluginLaunchOptions>): this;
421
+ /**
422
+ * Tạo một `BrowserContext` để bắt đầu phiên duyệt web.
423
+ *
424
+ * Bắt buộc phải gọi `launch()` trước. Mỗi instance chỉ cho phép
425
+ * một context tồn tại tại một thời điểm — cần gọi `quit()` để
426
+ * đóng context hiện tại trước khi tạo mới.
427
+ *
428
+ * @param options - Override các tùy chọn context (viewport, locale...).
429
+ * @returns `BrowserContext` của Playwright để tạo page và thao tác với trình duyệt.
430
+ * @throws {Error} Nếu chưa gọi `launch()`.
431
+ * @throws {Error} Nếu context đã tồn tại.
432
+ *
433
+ * @example
434
+ * const context = await browser.newContext();
435
+ * const page = await context.newPage();
436
+ * await page.goto('https://example.com');
437
+ */
438
+ newContext(options?: Partial<PluginLaunchOptions>): Promise<BrowserContext>;
439
+ /**
440
+ * Đóng trình duyệt, giải phóng tài nguyên và lưu profile.
441
+ *
442
+ * Nếu đã gọi `useProfile()`, profile sẽ được lưu về đường dẫn đó.
443
+ * Truyền `saveDataPath` để ghi đè đường dẫn lưu profile cho lần `quit()` này.
444
+ * Gọi khi chưa `launch()` sẽ không làm gì.
445
+ *
446
+ * @param saveDataPath - Ghi đè đường dẫn lưu profile, ưu tiên hơn path trong `useProfile()`.
447
+ *
448
+ * @example
449
+ * await browser.quit(); // lưu về path đã dùng trong useProfile
450
+ * await browser.quit('./profiles/user_backup'); // lưu về path khác
451
+ */
452
+ quit(saveDataPath?: string): Promise<void>;
453
+ }
454
+
455
+ type PluginLaunchOptions = Parameters<BrowserType['launchPersistentContext']>[1];
456
+ type Launcher = Pick<BrowserType, 'launch' | 'launchPersistentContext'>;
457
+ declare const Chromium: PWChromium;
458
+
459
+ export { Chromium };