@leeguoo/pwtk-network-debugger 1.2.5 → 1.2.7
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.js +3 -3
- package/dist/index.esm.js +69 -31
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -6674,6 +6674,7 @@ class NetworkInterceptor {
|
|
|
6674
6674
|
constructor() {
|
|
6675
6675
|
this.requests = /* @__PURE__ */ new Map();
|
|
6676
6676
|
this.listeners = [];
|
|
6677
|
+
this.wasmCheckInterval = null;
|
|
6677
6678
|
this.decryptConfig = { enabled: false };
|
|
6678
6679
|
window.__originalFetch = window.fetch;
|
|
6679
6680
|
this.interceptXHR();
|
|
@@ -6728,6 +6729,11 @@ class NetworkInterceptor {
|
|
|
6728
6729
|
if (!this.decryptConfig.enabled || !data) {
|
|
6729
6730
|
return null;
|
|
6730
6731
|
}
|
|
6732
|
+
const isDecryptAvailable = typeof window.decrypt === "function";
|
|
6733
|
+
if (!isDecryptAvailable) {
|
|
6734
|
+
console.log("NetworkDebugger: window.decrypt 不可用,跳过解密");
|
|
6735
|
+
return null;
|
|
6736
|
+
}
|
|
6731
6737
|
try {
|
|
6732
6738
|
let key = "";
|
|
6733
6739
|
let slk = "";
|
|
@@ -6745,9 +6751,15 @@ class NetworkInterceptor {
|
|
|
6745
6751
|
});
|
|
6746
6752
|
const result = await response.json();
|
|
6747
6753
|
if (result.success && result.data) {
|
|
6748
|
-
const num = result.data;
|
|
6749
|
-
|
|
6750
|
-
|
|
6754
|
+
const num = String(result.data);
|
|
6755
|
+
if (num.length >= 9) {
|
|
6756
|
+
key = num.charAt(2) + num.charAt(5) + num.charAt(8);
|
|
6757
|
+
console.log("NetworkDebugger: 自动获取密钥成功 key:", key, "from num:", num);
|
|
6758
|
+
} else {
|
|
6759
|
+
console.warn("NetworkDebugger: getSK返回数据长度不足:", num);
|
|
6760
|
+
}
|
|
6761
|
+
} else {
|
|
6762
|
+
console.warn("NetworkDebugger: getSK返回失败:", result);
|
|
6751
6763
|
}
|
|
6752
6764
|
} catch (e) {
|
|
6753
6765
|
console.warn("NetworkDebugger: 自动获取密钥失败:", e);
|
|
@@ -6756,20 +6768,33 @@ class NetworkInterceptor {
|
|
|
6756
6768
|
if (!key && this.decryptConfig.keyExtractor) {
|
|
6757
6769
|
key = this.decryptConfig.keyExtractor(headers);
|
|
6758
6770
|
} else if (!key) {
|
|
6759
|
-
key = headers.keys || headers.cid || "";
|
|
6771
|
+
key = headers.decryptKey || headers.keys || headers.cid || "";
|
|
6760
6772
|
}
|
|
6761
6773
|
if (this.decryptConfig.slkExtractor) {
|
|
6762
6774
|
slk = this.decryptConfig.slkExtractor(headers);
|
|
6763
6775
|
} else {
|
|
6764
|
-
slk = headers.slk || "";
|
|
6776
|
+
slk = headers.decryptSlk || headers.slk || "";
|
|
6765
6777
|
}
|
|
6766
6778
|
const fullKey = key + slk;
|
|
6779
|
+
console.log("NetworkDebugger: 尝试解密", { key, slk, fullKey, hasDecryptFunction: typeof window.decrypt === "function" });
|
|
6767
6780
|
if (fullKey) {
|
|
6768
|
-
const
|
|
6769
|
-
|
|
6770
|
-
|
|
6781
|
+
const dataStr = typeof data === "string" ? data : JSON.stringify(data);
|
|
6782
|
+
const decrypted = decrypt(dataStr, fullKey);
|
|
6783
|
+
if (decrypted && decrypted !== dataStr && decrypted !== data) {
|
|
6784
|
+
console.log("NetworkDebugger: 解密成功", {
|
|
6785
|
+
key,
|
|
6786
|
+
slk,
|
|
6787
|
+
fullKey,
|
|
6788
|
+
originalLength: dataStr.length,
|
|
6789
|
+
decryptedType: typeof decrypted,
|
|
6790
|
+
preview: JSON.stringify(decrypted).substring(0, 100) + "..."
|
|
6791
|
+
});
|
|
6771
6792
|
return decrypted;
|
|
6793
|
+
} else {
|
|
6794
|
+
console.log("NetworkDebugger: 解密未生效", { key, slk, fullKey, dataStr: dataStr.substring(0, 50) });
|
|
6772
6795
|
}
|
|
6796
|
+
} else {
|
|
6797
|
+
console.log("NetworkDebugger: 没有密钥,跳过解密", { headers });
|
|
6773
6798
|
}
|
|
6774
6799
|
} catch (error) {
|
|
6775
6800
|
console.warn("NetworkDebugger: Decryption failed:", error);
|
|
@@ -6817,7 +6842,6 @@ class NetworkInterceptor {
|
|
|
6817
6842
|
if (decrypted !== null) {
|
|
6818
6843
|
requestData.decryptedRequest = decrypted;
|
|
6819
6844
|
self2.requests.set(requestId, requestData);
|
|
6820
|
-
self2.notifyListeners(requestData);
|
|
6821
6845
|
}
|
|
6822
6846
|
}).catch((e) => console.warn("解密请求失败:", e));
|
|
6823
6847
|
}
|
|
@@ -6857,9 +6881,10 @@ class NetworkInterceptor {
|
|
|
6857
6881
|
self2.notifyListeners(requestData);
|
|
6858
6882
|
}
|
|
6859
6883
|
}).catch((e) => console.warn("解密响应失败:", e));
|
|
6884
|
+
} else {
|
|
6885
|
+
self2.requests.set(requestId, requestData);
|
|
6886
|
+
self2.notifyListeners(requestData);
|
|
6860
6887
|
}
|
|
6861
|
-
self2.requests.set(requestId, requestData);
|
|
6862
|
-
self2.notifyListeners(requestData);
|
|
6863
6888
|
}
|
|
6864
6889
|
}
|
|
6865
6890
|
});
|
|
@@ -6919,7 +6944,6 @@ class NetworkInterceptor {
|
|
|
6919
6944
|
if (decrypted !== null) {
|
|
6920
6945
|
requestData.decryptedRequest = decrypted;
|
|
6921
6946
|
self2.requests.set(requestId, requestData);
|
|
6922
|
-
self2.notifyListeners(requestData);
|
|
6923
6947
|
}
|
|
6924
6948
|
}).catch((e) => console.warn("解密请求失败:", e));
|
|
6925
6949
|
}
|
|
@@ -6957,12 +6981,15 @@ class NetworkInterceptor {
|
|
|
6957
6981
|
self2.notifyListeners(updatedRequestData);
|
|
6958
6982
|
}
|
|
6959
6983
|
}).catch((e) => console.warn("解密响应失败:", e));
|
|
6984
|
+
} else {
|
|
6985
|
+
self2.requests.set(requestId, updatedRequestData);
|
|
6986
|
+
self2.notifyListeners(updatedRequestData);
|
|
6960
6987
|
}
|
|
6961
6988
|
} catch (error) {
|
|
6962
6989
|
updatedRequestData.error = `Failed to read response: ${error}`;
|
|
6990
|
+
self2.requests.set(requestId, updatedRequestData);
|
|
6991
|
+
self2.notifyListeners(updatedRequestData);
|
|
6963
6992
|
}
|
|
6964
|
-
self2.requests.set(requestId, updatedRequestData);
|
|
6965
|
-
self2.notifyListeners(updatedRequestData);
|
|
6966
6993
|
}
|
|
6967
6994
|
return response;
|
|
6968
6995
|
} catch (error) {
|
|
@@ -6985,6 +7012,11 @@ class WasmLoader {
|
|
|
6985
7012
|
this.loading = false;
|
|
6986
7013
|
}
|
|
6987
7014
|
async loadWasm(wasmUrl, jsUrl) {
|
|
7015
|
+
if (typeof window.decrypt === "function") {
|
|
7016
|
+
console.log("NetworkDebugger: window.decrypt 已存在,跳过 WASM 加载");
|
|
7017
|
+
this.loaded = true;
|
|
7018
|
+
return true;
|
|
7019
|
+
}
|
|
6988
7020
|
if (this.loaded) return true;
|
|
6989
7021
|
if (this.loading) {
|
|
6990
7022
|
return new Promise((resolve) => {
|
|
@@ -7068,9 +7100,15 @@ class WasmLoader {
|
|
|
7068
7100
|
throw new Error("Unable to load WebAssembly from any path");
|
|
7069
7101
|
}
|
|
7070
7102
|
go.run(wasmModule.instance);
|
|
7071
|
-
|
|
7072
|
-
|
|
7073
|
-
|
|
7103
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
7104
|
+
if (typeof window.decrypt === "function") {
|
|
7105
|
+
this.loaded = true;
|
|
7106
|
+
console.log("NetworkDebugger: WebAssembly 加密模块已加载,decrypt 函数可用");
|
|
7107
|
+
return true;
|
|
7108
|
+
} else {
|
|
7109
|
+
console.warn("NetworkDebugger: WebAssembly 已加载但 decrypt 函数不可用");
|
|
7110
|
+
return false;
|
|
7111
|
+
}
|
|
7074
7112
|
} catch (error) {
|
|
7075
7113
|
console.warn("NetworkDebugger: WebAssembly 加载失败:", error);
|
|
7076
7114
|
return false;
|
|
@@ -7987,7 +8025,7 @@ class DebugPanel {
|
|
|
7987
8025
|
<div class="request-header">
|
|
7988
8026
|
<span class="request-method ${methodClass}">${request.method}</span>
|
|
7989
8027
|
<span class="request-url" title="${request.url}">${this.truncateUrl(request.url)}</span>
|
|
7990
|
-
<span class="request-status ${statusClass}">${request.status
|
|
8028
|
+
<span class="request-status ${statusClass}">${request.status ? request.status : request.duration !== void 0 ? "ERR" : "Pending"}</span>
|
|
7991
8029
|
${hasError ? '<span class="error-badge">⚠️</span>' : ""}
|
|
7992
8030
|
<button class="share-btn" title="分享此请求 (by Leo)" onclick="event.stopPropagation()">🔗</button>
|
|
7993
8031
|
</div>
|
|
@@ -8066,20 +8104,20 @@ class DebugPanel {
|
|
|
8066
8104
|
</div>
|
|
8067
8105
|
`;
|
|
8068
8106
|
}
|
|
8069
|
-
if (request.requestBody
|
|
8107
|
+
if (request.requestBody) {
|
|
8070
8108
|
html += `
|
|
8071
8109
|
<div class="detail-section">
|
|
8072
|
-
<div class="detail-title"
|
|
8110
|
+
<div class="detail-title">${request.decryptedRequest ? "原始请求数据" : "请求数据"}</div>
|
|
8073
8111
|
<div class="detail-content">
|
|
8074
8112
|
<div class="json-content">${this.formatData(request.requestBody)}</div>
|
|
8075
8113
|
</div>
|
|
8076
8114
|
</div>
|
|
8077
8115
|
`;
|
|
8078
8116
|
}
|
|
8079
|
-
if (request.responseBody
|
|
8117
|
+
if (request.responseBody) {
|
|
8080
8118
|
html += `
|
|
8081
8119
|
<div class="detail-section">
|
|
8082
|
-
<div class="detail-title"
|
|
8120
|
+
<div class="detail-title">${request.decryptedResponse ? "原始响应数据" : "响应数据"}</div>
|
|
8083
8121
|
<div class="detail-content">
|
|
8084
8122
|
<div class="json-content">${this.formatData(request.responseBody)}</div>
|
|
8085
8123
|
</div>
|
|
@@ -8118,12 +8156,7 @@ class DebugPanel {
|
|
|
8118
8156
|
return "status-error";
|
|
8119
8157
|
}
|
|
8120
8158
|
truncateUrl(url) {
|
|
8121
|
-
|
|
8122
|
-
const parts = url.split("/");
|
|
8123
|
-
const domain = parts.slice(0, 3).join("/");
|
|
8124
|
-
const path = parts.slice(3).join("/");
|
|
8125
|
-
if (path.length <= 20) return url;
|
|
8126
|
-
return `${domain}/...${path.slice(-20)}`;
|
|
8159
|
+
return url;
|
|
8127
8160
|
}
|
|
8128
8161
|
switchTab(tabName) {
|
|
8129
8162
|
this.container.querySelectorAll(".debugger-tab").forEach((tab) => {
|
|
@@ -8443,9 +8476,14 @@ class NetworkDebugger {
|
|
|
8443
8476
|
...config
|
|
8444
8477
|
};
|
|
8445
8478
|
try {
|
|
8446
|
-
if (this.config.wasm?.enabled) {
|
|
8479
|
+
if (this.config.wasm?.enabled !== false) {
|
|
8447
8480
|
this.wasmLoader = new WasmLoader();
|
|
8448
|
-
await this.wasmLoader.loadWasm(this.config.wasm
|
|
8481
|
+
const wasmLoaded = await this.wasmLoader.loadWasm(this.config.wasm?.wasmUrl, this.config.wasm?.jsUrl);
|
|
8482
|
+
if (wasmLoaded) {
|
|
8483
|
+
console.log("NetworkDebugger: WASM decrypt 函数已就绪");
|
|
8484
|
+
} else {
|
|
8485
|
+
console.log("NetworkDebugger: WASM 加载失败或 decrypt 函数不可用,将依赖页面自带的解密功能");
|
|
8486
|
+
}
|
|
8449
8487
|
}
|
|
8450
8488
|
this.interceptor = new NetworkInterceptor();
|
|
8451
8489
|
if (this.config.decrypt?.enabled) {
|
|
@@ -8462,7 +8500,7 @@ class NetworkDebugger {
|
|
|
8462
8500
|
this.initialized = true;
|
|
8463
8501
|
console.log(`
|
|
8464
8502
|
╔════════════════════════════════════════╗
|
|
8465
|
-
║ 🔓 PWTK 解密小工具 v1.2.
|
|
8503
|
+
║ 🔓 PWTK 解密小工具 v1.2.7 ║
|
|
8466
8504
|
║ Created by Leo (@leeguoo) ║
|
|
8467
8505
|
║ 技术支持: 请联系 Leo ║
|
|
8468
8506
|
║ 分享服务: curl.bwg.leeguoo.com ║
|