@skrillex1224/playwright-toolkit 2.1.27 → 2.1.28
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.
- package/dist/index.cjs +31 -67
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +32 -68
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1282,18 +1282,9 @@ var Captcha = {
|
|
|
1282
1282
|
};
|
|
1283
1283
|
|
|
1284
1284
|
// src/sse.js
|
|
1285
|
-
var
|
|
1286
|
-
var
|
|
1287
|
-
var import_https = require("https");
|
|
1285
|
+
var import_https = __toESM(require("https"), 1);
|
|
1286
|
+
var import_url = require("url");
|
|
1288
1287
|
var logger7 = createLogger("Sse");
|
|
1289
|
-
var SHARED_HTTP_AGENT = new import_http.Agent({ keepAlive: false });
|
|
1290
|
-
var SHARED_HTTPS_AGENT = new import_https.Agent({ keepAlive: false, rejectUnauthorized: false });
|
|
1291
|
-
var SHARED_GOT_OPTIONS = {
|
|
1292
|
-
http2: false,
|
|
1293
|
-
retry: { limit: 0 },
|
|
1294
|
-
throwHttpErrors: false,
|
|
1295
|
-
decompress: false
|
|
1296
|
-
};
|
|
1297
1288
|
var Sse = {
|
|
1298
1289
|
/**
|
|
1299
1290
|
* 解析 SSE 流文本
|
|
@@ -1320,7 +1311,7 @@ var Sse = {
|
|
|
1320
1311
|
return events;
|
|
1321
1312
|
},
|
|
1322
1313
|
/**
|
|
1323
|
-
* 拦截网络请求并使用
|
|
1314
|
+
* 拦截网络请求并使用 Node.js 原生 https 模块转发,以解决流式数据捕获问题。
|
|
1324
1315
|
* @param {import('playwright').Page} page
|
|
1325
1316
|
* @param {string|RegExp} urlPattern - 拦截的 URL 模式
|
|
1326
1317
|
* @param {object} options
|
|
@@ -1328,7 +1319,7 @@ var Sse = {
|
|
|
1328
1319
|
* @param {function(string, function): void} [options.onEnd] - (fullText, resolve) => void
|
|
1329
1320
|
* @param {function(Error, function): void} [options.onTimeout] - (error, reject) => void
|
|
1330
1321
|
* @param {number} [options.initialTimeout=90000] - 初始数据接收超时 (ms),默认 90s
|
|
1331
|
-
* @param {number} [options.
|
|
1322
|
+
* @param {number} [options.timeout=180000] - 整体请求超时时间 (ms),默认 180s
|
|
1332
1323
|
* @returns {Promise<any>} - 返回 Promise,当流满足条件时 resolve
|
|
1333
1324
|
*/
|
|
1334
1325
|
async intercept(page, urlPattern, options = {}) {
|
|
@@ -1354,39 +1345,19 @@ var Sse = {
|
|
|
1354
1345
|
logger7.info(`[MITM] \u5DF2\u62E6\u622A\u8BF7\u6C42: ${request.url()}`);
|
|
1355
1346
|
try {
|
|
1356
1347
|
const headers = await request.allHeaders();
|
|
1357
|
-
|
|
1348
|
+
const postData = request.postData();
|
|
1349
|
+
const urlObj = new import_url.URL(request.url());
|
|
1358
1350
|
delete headers["accept-encoding"];
|
|
1359
1351
|
delete headers["content-length"];
|
|
1360
|
-
const currentAcceptLanguage = headers["accept-language"] || "";
|
|
1361
|
-
AntiCheat.applyLocaleHeaders(headers, currentAcceptLanguage);
|
|
1362
|
-
const resolvedAcceptLanguage = headers["accept-language"] || "";
|
|
1363
|
-
const userAgent = headers["user-agent"] || "";
|
|
1364
|
-
const method = request.method();
|
|
1365
|
-
const postData = method !== "GET" && method !== "HEAD" ? request.postDataBuffer() : void 0;
|
|
1366
1352
|
const reqOptions = {
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1353
|
+
hostname: urlObj.hostname,
|
|
1354
|
+
port: 443,
|
|
1355
|
+
path: urlObj.pathname + urlObj.search,
|
|
1356
|
+
method: request.method(),
|
|
1370
1357
|
headers,
|
|
1371
|
-
|
|
1372
|
-
agent: {
|
|
1373
|
-
http: SHARED_HTTP_AGENT,
|
|
1374
|
-
https: SHARED_HTTPS_AGENT
|
|
1375
|
-
},
|
|
1376
|
-
timeout: { request: overallTimeout }
|
|
1377
|
-
};
|
|
1378
|
-
if (postData) {
|
|
1379
|
-
reqOptions.body = postData;
|
|
1380
|
-
}
|
|
1381
|
-
const stream = import_got_scraping.gotScraping.stream(reqOptions);
|
|
1382
|
-
const handleStreamError = (error) => {
|
|
1383
|
-
clearAllTimers();
|
|
1384
|
-
stream.destroy();
|
|
1385
|
-
route.abort().catch(() => {
|
|
1386
|
-
});
|
|
1387
|
-
reject(error);
|
|
1358
|
+
timeout: overallTimeout
|
|
1388
1359
|
};
|
|
1389
|
-
|
|
1360
|
+
const req = import_https.default.request(reqOptions, (res) => {
|
|
1390
1361
|
const chunks = [];
|
|
1391
1362
|
let accumulatedText = "";
|
|
1392
1363
|
res.on("data", (chunk) => {
|
|
@@ -1409,7 +1380,6 @@ var Sse = {
|
|
|
1409
1380
|
}
|
|
1410
1381
|
}
|
|
1411
1382
|
});
|
|
1412
|
-
res.on("error", handleStreamError);
|
|
1413
1383
|
res.on("end", () => {
|
|
1414
1384
|
logger7.info("[MITM] \u4E0A\u6E38\u54CD\u5E94\u7ED3\u675F");
|
|
1415
1385
|
clearAllTimers();
|
|
@@ -1422,28 +1392,22 @@ var Sse = {
|
|
|
1422
1392
|
} else if (!onData) {
|
|
1423
1393
|
resolve(accumulatedText);
|
|
1424
1394
|
}
|
|
1425
|
-
const resHeaders = {};
|
|
1426
|
-
for (const [key, value] of Object.entries(res.headers || {})) {
|
|
1427
|
-
if (Array.isArray(value)) {
|
|
1428
|
-
resHeaders[key] = value.join(", ");
|
|
1429
|
-
} else if (value) {
|
|
1430
|
-
resHeaders[key] = String(value);
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
delete resHeaders["content-encoding"];
|
|
1434
|
-
delete resHeaders["content-length"];
|
|
1435
|
-
delete resHeaders["transfer-encoding"];
|
|
1436
|
-
delete resHeaders["connection"];
|
|
1437
|
-
delete resHeaders["keep-alive"];
|
|
1438
1395
|
route.fulfill({
|
|
1439
|
-
status: res.statusCode
|
|
1440
|
-
headers:
|
|
1396
|
+
status: res.statusCode,
|
|
1397
|
+
headers: res.headers,
|
|
1441
1398
|
body: Buffer.concat(chunks)
|
|
1442
1399
|
}).catch(() => {
|
|
1443
1400
|
});
|
|
1444
1401
|
});
|
|
1445
1402
|
});
|
|
1446
|
-
|
|
1403
|
+
req.on("error", (e) => {
|
|
1404
|
+
clearAllTimers();
|
|
1405
|
+
route.abort().catch(() => {
|
|
1406
|
+
});
|
|
1407
|
+
reject(e);
|
|
1408
|
+
});
|
|
1409
|
+
if (postData) req.write(postData);
|
|
1410
|
+
req.end();
|
|
1447
1411
|
} catch (e) {
|
|
1448
1412
|
clearAllTimers();
|
|
1449
1413
|
route.continue().catch(() => {
|
|
@@ -1502,12 +1466,12 @@ var Sse = {
|
|
|
1502
1466
|
};
|
|
1503
1467
|
|
|
1504
1468
|
// src/interception.js
|
|
1505
|
-
var
|
|
1506
|
-
var
|
|
1469
|
+
var import_got_scraping = require("got-scraping");
|
|
1470
|
+
var import_http = require("http");
|
|
1507
1471
|
var import_https2 = require("https");
|
|
1508
1472
|
var logger8 = createLogger("Interception");
|
|
1509
|
-
var
|
|
1510
|
-
var
|
|
1473
|
+
var SHARED_HTTP_AGENT = new import_http.Agent({ keepAlive: false });
|
|
1474
|
+
var SHARED_HTTPS_AGENT = new import_https2.Agent({ keepAlive: false, rejectUnauthorized: false });
|
|
1511
1475
|
var DirectConfig = {
|
|
1512
1476
|
/** 直连请求超时时间(秒) */
|
|
1513
1477
|
directTimeout: 12,
|
|
@@ -1560,7 +1524,7 @@ var DEFAULT_BLOCKING_CONFIG = {
|
|
|
1560
1524
|
/** 额外自定义扩展名列表 */
|
|
1561
1525
|
customExtensions: []
|
|
1562
1526
|
};
|
|
1563
|
-
var
|
|
1527
|
+
var SHARED_GOT_OPTIONS = {
|
|
1564
1528
|
http2: false,
|
|
1565
1529
|
// 禁用 HTTP2 避免在拦截场景下的握手兼容性问题
|
|
1566
1530
|
retry: { limit: 0 },
|
|
@@ -1669,8 +1633,8 @@ var Interception = {
|
|
|
1669
1633
|
const userAgent = reqHeaders["user-agent"] || "";
|
|
1670
1634
|
const method = request.method();
|
|
1671
1635
|
const postData = method !== "GET" && method !== "HEAD" ? request.postDataBuffer() : void 0;
|
|
1672
|
-
const response = await (0,
|
|
1673
|
-
...
|
|
1636
|
+
const response = await (0, import_got_scraping.gotScraping)({
|
|
1637
|
+
...SHARED_GOT_OPTIONS,
|
|
1674
1638
|
// 应用通用配置
|
|
1675
1639
|
url,
|
|
1676
1640
|
method,
|
|
@@ -1682,8 +1646,8 @@ var Interception = {
|
|
|
1682
1646
|
headerGeneratorOptions: AntiCheat.getTlsFingerprintOptions(userAgent, resolvedAcceptLanguage),
|
|
1683
1647
|
// 使用共享的 Agent 单例(keepAlive: false,不会池化连接)
|
|
1684
1648
|
agent: {
|
|
1685
|
-
http:
|
|
1686
|
-
https:
|
|
1649
|
+
http: SHARED_HTTP_AGENT,
|
|
1650
|
+
https: SHARED_HTTPS_AGENT
|
|
1687
1651
|
},
|
|
1688
1652
|
// 超时时间
|
|
1689
1653
|
timeout: { request: DirectConfig.directTimeout * 1e3 }
|