@leeguoo/pwtk-network-debugger 1.2.0 → 1.2.3

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.esm.js CHANGED
@@ -6711,6 +6711,9 @@ class NetworkInterceptor {
6711
6711
  generateRequestId() {
6712
6712
  return Math.random().toString(36).substr(2, 9);
6713
6713
  }
6714
+ isInternalUrl(url) {
6715
+ return url.includes("/ip/getSK") || url.includes("/api/dokv/storage") || url.includes("/api/share");
6716
+ }
6714
6717
  notifyListeners(request) {
6715
6718
  this.listeners.forEach((listener) => {
6716
6719
  try {
@@ -6781,10 +6784,12 @@ class NetworkInterceptor {
6781
6784
  let url = "";
6782
6785
  let requestHeaders = {};
6783
6786
  const startTime = Date.now();
6787
+ let isInternalRequest = false;
6784
6788
  const originalOpen = xhr.open;
6785
6789
  xhr.open = function(methodArg, urlArg, ...rest) {
6786
6790
  method = methodArg.toUpperCase();
6787
6791
  url = urlArg;
6792
+ isInternalRequest = self2.isInternalUrl(url);
6788
6793
  return originalOpen.apply(this, [methodArg, urlArg, ...rest]);
6789
6794
  };
6790
6795
  const originalSetRequestHeader = xhr.setRequestHeader;
@@ -6794,6 +6799,9 @@ class NetworkInterceptor {
6794
6799
  };
6795
6800
  const originalSend = xhr.send;
6796
6801
  xhr.send = function(body) {
6802
+ if (isInternalRequest) {
6803
+ return originalSend.call(this, body);
6804
+ }
6797
6805
  const requestData = {
6798
6806
  id: requestId,
6799
6807
  url,
@@ -6816,7 +6824,7 @@ class NetworkInterceptor {
6816
6824
  return originalSend.call(this, body);
6817
6825
  };
6818
6826
  xhr.addEventListener("readystatechange", function() {
6819
- if (xhr.readyState === XMLHttpRequest.DONE) {
6827
+ if (xhr.readyState === XMLHttpRequest.DONE && !isInternalRequest) {
6820
6828
  const endTime = Date.now();
6821
6829
  const requestData = self2.requests.get(requestId);
6822
6830
  if (requestData) {
@@ -6858,13 +6866,16 @@ class NetworkInterceptor {
6858
6866
  window.XMLHttpRequest.prototype = originalXHR.prototype;
6859
6867
  }
6860
6868
  interceptFetch() {
6861
- const originalFetch = window.fetch;
6869
+ const originalFetch = window.fetch(window).__originalFetch = originalFetch;
6862
6870
  const self2 = this;
6863
6871
  window.fetch = async function(input, init) {
6864
6872
  const requestId = self2.generateRequestId();
6865
6873
  const startTime = Date.now();
6866
6874
  const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
6867
6875
  const method = (init?.method || "GET").toUpperCase();
6876
+ if (self2.isInternalUrl(url)) {
6877
+ return originalFetch.call(this, input, init);
6878
+ }
6868
6879
  const requestHeaders = {};
6869
6880
  if (init?.headers) {
6870
6881
  if (init.headers instanceof Headers) {
@@ -7146,6 +7157,16 @@ const styles = `
7146
7157
  #network-debugger-panel.minimized {
7147
7158
  height: 40px !important;
7148
7159
  overflow: hidden;
7160
+ width: auto !important;
7161
+ min-width: 200px;
7162
+ }
7163
+
7164
+ #network-debugger-panel.minimized .debugger-content {
7165
+ display: none;
7166
+ }
7167
+
7168
+ #network-debugger-panel.minimized .resize-handle {
7169
+ display: none;
7149
7170
  }
7150
7171
 
7151
7172
  #network-debugger-panel.bottom-right {
@@ -7354,6 +7375,19 @@ const styles = `
7354
7375
  display: none;
7355
7376
  }
7356
7377
 
7378
+ /* 默认折叠headers */
7379
+ .request-details .detail-section.collapsible {
7380
+ /* 默认折叠状态 */
7381
+ }
7382
+
7383
+ .request-details .detail-section.collapsible:not(.expanded) .detail-content {
7384
+ display: none;
7385
+ }
7386
+
7387
+ .request-details .detail-section.collapsible:not(.expanded) .collapse-icon {
7388
+ transform: rotate(-90deg);
7389
+ }
7390
+
7357
7391
  .request-item.expanded .request-details {
7358
7392
  display: block;
7359
7393
  }
@@ -7372,6 +7406,45 @@ const styles = `
7372
7406
  padding-bottom: 4px;
7373
7407
  }
7374
7408
 
7409
+ .detail-title.highlight {
7410
+ color: #FFD700;
7411
+ font-size: 12px;
7412
+ background: rgba(255, 215, 0, 0.1);
7413
+ padding: 6px 8px;
7414
+ border-radius: 4px;
7415
+ border-bottom: 2px solid #FFD700;
7416
+ }
7417
+
7418
+ .detail-title.clickable {
7419
+ cursor: pointer;
7420
+ user-select: none;
7421
+ display: flex;
7422
+ align-items: center;
7423
+ gap: 4px;
7424
+ }
7425
+
7426
+ .detail-title.clickable:hover {
7427
+ background: rgba(76, 175, 80, 0.1);
7428
+ }
7429
+
7430
+ .collapse-icon {
7431
+ display: inline-block;
7432
+ transition: transform 0.2s;
7433
+ font-size: 10px;
7434
+ }
7435
+
7436
+ .detail-section.collapsible {
7437
+ position: relative;
7438
+ }
7439
+
7440
+ .detail-section.collapsible.collapsed .detail-content {
7441
+ display: none;
7442
+ }
7443
+
7444
+ .detail-section.collapsible.collapsed .collapse-icon {
7445
+ transform: rotate(-90deg);
7446
+ }
7447
+
7375
7448
  .detail-content {
7376
7449
  background: #222;
7377
7450
  padding: 8px;
@@ -7620,54 +7693,58 @@ const styles = `
7620
7693
  `;
7621
7694
  async function createShareLink(requestData) {
7622
7695
  try {
7696
+ const curlCommand = formatAsCurl(requestData);
7623
7697
  const shareData = {
7624
- // 基础信息
7625
- url: requestData.url,
7626
- method: requestData.method,
7627
- headers: requestData.headers,
7628
- status: requestData.status,
7629
- statusText: requestData.statusText,
7630
- timestamp: requestData.timestamp,
7631
- duration: requestData.duration,
7632
- // 请求和响应数据
7633
- requestBody: requestData.requestBody,
7634
- responseBody: requestData.responseBody,
7635
- responseHeaders: requestData.responseHeaders,
7636
- // 解密后的数据(如果有)
7637
- decryptedRequest: requestData.decryptedRequest,
7638
- decryptedResponse: requestData.decryptedResponse,
7639
- // 错误信息(如果有)
7640
- error: requestData.error,
7641
- // 元数据
7642
- creator: "PWTK Network Debugger by Leo (@leeguoo)",
7643
- createdAt: Date.now(),
7644
- version: "1.2.0"
7698
+ // 原项目需要的核心字段
7699
+ curl: curlCommand,
7700
+ response: requestData.responseBody || null,
7701
+ timestamp: Date.now(),
7702
+ // 密钥相关(如果有)
7703
+ keys: extractKeys(requestData.headers),
7704
+ slk: requestData.headers?.slk || "",
7705
+ // 额外的调试信息(向后兼容)
7706
+ debuggerData: {
7707
+ url: requestData.url,
7708
+ method: requestData.method,
7709
+ headers: requestData.headers,
7710
+ status: requestData.status,
7711
+ statusText: requestData.statusText,
7712
+ duration: requestData.duration,
7713
+ responseHeaders: requestData.responseHeaders,
7714
+ decryptedRequest: requestData.decryptedRequest,
7715
+ decryptedResponse: requestData.decryptedResponse,
7716
+ error: requestData.error,
7717
+ creator: "PWTK Network Debugger by Leo (@leeguoo)",
7718
+ version: "1.2.0"
7719
+ }
7645
7720
  };
7646
- const response = await fetch("https://gw-card-pay.buyacard.cc/api/dokv/storage", {
7721
+ const originalFetch = window.__originalFetch || window.fetch;
7722
+ const response = await originalFetch("https://curl.bwg.leeguoo.com/api/share", {
7647
7723
  method: "POST",
7648
7724
  headers: {
7649
7725
  "Content-Type": "application/json"
7650
7726
  },
7651
7727
  body: JSON.stringify({
7652
- data: shareData,
7653
- type: "network-request",
7654
- expireIn: 7 * 24 * 60 * 60 * 1e3
7655
- // 7天过期
7728
+ data: shareData
7656
7729
  })
7657
7730
  });
7658
7731
  const result = await response.json();
7659
- if (result.success && result.id) {
7660
- const shareUrl = `https://curl.bwg.leeguoo.com/share/${result.id}`;
7732
+ if (result.shareId) {
7733
+ const shareUrl = `https://curl.bwg.leeguoo.com/share/${result.shareId}`;
7661
7734
  console.log(`🔗 分享链接创建成功 (by Leo): ${shareUrl}`);
7662
7735
  return shareUrl;
7663
7736
  } else {
7664
- throw new Error(result.message || "创建分享失败");
7737
+ throw new Error(result.error || "创建分享失败");
7665
7738
  }
7666
7739
  } catch (error) {
7667
7740
  console.error("NetworkDebugger: 创建分享链接失败:", error);
7668
7741
  throw error;
7669
7742
  }
7670
7743
  }
7744
+ function extractKeys(headers) {
7745
+ if (!headers) return "";
7746
+ return headers.keys || headers.cid || headers["x-api-key"] || "";
7747
+ }
7671
7748
  async function copyToClipboard(text) {
7672
7749
  try {
7673
7750
  if (navigator.clipboard && navigator.clipboard.writeText) {
@@ -7689,6 +7766,22 @@ async function copyToClipboard(text) {
7689
7766
  return false;
7690
7767
  }
7691
7768
  }
7769
+ function formatAsCurl(requestData) {
7770
+ let curl = `curl '${requestData.url}'`;
7771
+ if (requestData.method !== "GET") {
7772
+ curl += ` -X ${requestData.method}`;
7773
+ }
7774
+ if (requestData.headers) {
7775
+ Object.entries(requestData.headers).forEach(([key, value]) => {
7776
+ curl += ` -H '${key}: ${value}'`;
7777
+ });
7778
+ }
7779
+ if (requestData.requestBody) {
7780
+ const body = typeof requestData.requestBody === "string" ? requestData.requestBody : JSON.stringify(requestData.requestBody);
7781
+ curl += ` --data '${body}'`;
7782
+ }
7783
+ return curl;
7784
+ }
7692
7785
  class DebugPanel {
7693
7786
  constructor(interceptor, config = {}) {
7694
7787
  this.isDragging = false;
@@ -7721,12 +7814,12 @@ class DebugPanel {
7721
7814
  this.container.className = `${this.config.position} ${this.config.minimized ? "minimized" : ""}`;
7722
7815
  this.container.innerHTML = `
7723
7816
  <div class="debugger-header">
7724
- <div class="debugger-title">🔍 Network Debugger <span style="font-size: 10px; opacity: 0.7;">by Leo</span></div>
7817
+ <div class="debugger-title">🔓 ${this.config.minimized ? "PWTK" : "PWTK 解密小工具"} <span style="font-size: 10px; opacity: 0.7;">by Leo</span></div>
7725
7818
  <div class="debugger-controls">
7726
- <button class="debugger-btn" data-action="clear" title="清空">🗑️</button>
7727
- <button class="debugger-btn" data-action="export" title="导出">💾</button>
7728
- <button class="debugger-btn" data-action="minimize" title="最小化">${this.config.minimized ? "📖" : "📕"}</button>
7729
- <button class="debugger-btn" data-action="fullscreen" title="全屏">⛶</button>
7819
+ ${!this.config.minimized ? '<button class="debugger-btn" data-action="clear" title="清空">🗑️</button>' : ""}
7820
+ ${!this.config.minimized ? '<button class="debugger-btn" data-action="export" title="导出">💾</button>' : ""}
7821
+ <button class="debugger-btn" data-action="minimize" title="${this.config.minimized ? "展开" : "最小化"}">${this.config.minimized ? "📖" : "📕"}</button>
7822
+ ${!this.config.minimized ? '<button class="debugger-btn" data-action="fullscreen" title="全屏">⛶</button>' : ""}
7730
7823
  <button class="debugger-btn" data-action="close" title="关闭">✕</button>
7731
7824
  </div>
7732
7825
  </div>
@@ -7765,8 +7858,8 @@ class DebugPanel {
7765
7858
  </div>
7766
7859
  <div class="about-panel" data-panel="about" style="display: none;">
7767
7860
  <div style="padding: 20px; color: #fff; text-align: center;">
7768
- <h2 style="margin: 0 0 20px 0;">🔍 PWTK Network Debugger</h2>
7769
- <p style="margin: 10px 0;">Version: 1.2.0</p>
7861
+ <h2 style="margin: 0 0 20px 0;">🔓 PWTK 解密小工具</h2>
7862
+ <p style="margin: 10px 0;">Version: 1.2.3</p>
7770
7863
  <p style="margin: 10px 0;">👨‍💻 Created by <strong>Leo (@leeguoo)</strong></p>
7771
7864
  <p style="margin: 10px 0;">📧 技术支持:请联系 Leo</p>
7772
7865
  <p style="margin: 10px 0;">🌐 分享服务:curl.bwg.leeguoo.com</p>
@@ -7919,44 +8012,49 @@ class DebugPanel {
7919
8012
  }
7920
8013
  renderRequestDetails(request) {
7921
8014
  let html = "";
7922
- if (Object.keys(request.headers).length > 0) {
8015
+ request.id.replace(/[^a-zA-Z0-9]/g, "");
8016
+ if (request.decryptedRequest) {
7923
8017
  html += `
7924
8018
  <div class="detail-section">
7925
- <div class="detail-title">请求头</div>
8019
+ <div class="detail-title highlight">🔓 解密请求数据</div>
7926
8020
  <div class="detail-content">
7927
- <table class="headers-table">
7928
- ${Object.entries(request.headers).map(
7929
- ([key, value]) => `<tr><td>${key}</td><td>${value}</td></tr>`
7930
- ).join("")}
7931
- </table>
8021
+ <div class="json-content">${this.formatData(request.decryptedRequest)}</div>
7932
8022
  </div>
7933
8023
  </div>
7934
8024
  `;
7935
8025
  }
7936
- if (request.requestBody) {
8026
+ if (request.decryptedResponse) {
7937
8027
  html += `
7938
8028
  <div class="detail-section">
7939
- <div class="detail-title">请求数据</div>
8029
+ <div class="detail-title highlight">🔓 解密响应数据</div>
7940
8030
  <div class="detail-content">
7941
- <div class="json-content">${this.formatData(request.requestBody)}</div>
8031
+ <div class="json-content">${this.formatData(request.decryptedResponse)}</div>
7942
8032
  </div>
7943
8033
  </div>
7944
8034
  `;
7945
8035
  }
7946
- if (request.decryptedRequest) {
8036
+ if (Object.keys(request.headers).length > 0) {
7947
8037
  html += `
7948
- <div class="detail-section">
7949
- <div class="detail-title">解密请求数据 🔓</div>
8038
+ <div class="detail-section collapsible collapsed">
8039
+ <div class="detail-title clickable" onclick="this.parentElement.classList.toggle('collapsed')">
8040
+ <span class="collapse-icon">▼</span> 请求头 (${Object.keys(request.headers).length})
8041
+ </div>
7950
8042
  <div class="detail-content">
7951
- <div class="json-content">${this.formatData(request.decryptedRequest)}</div>
8043
+ <table class="headers-table">
8044
+ ${Object.entries(request.headers).map(
8045
+ ([key, value]) => `<tr><td>${key}</td><td>${value}</td></tr>`
8046
+ ).join("")}
8047
+ </table>
7952
8048
  </div>
7953
8049
  </div>
7954
8050
  `;
7955
8051
  }
7956
8052
  if (request.responseHeaders && Object.keys(request.responseHeaders).length > 0) {
7957
8053
  html += `
7958
- <div class="detail-section">
7959
- <div class="detail-title">响应头</div>
8054
+ <div class="detail-section collapsible collapsed">
8055
+ <div class="detail-title clickable" onclick="this.parentElement.classList.toggle('collapsed')">
8056
+ <span class="collapse-icon">▼</span> 响应头 (${Object.keys(request.responseHeaders).length})
8057
+ </div>
7960
8058
  <div class="detail-content">
7961
8059
  <table class="headers-table">
7962
8060
  ${Object.entries(request.responseHeaders).map(
@@ -7967,22 +8065,22 @@ class DebugPanel {
7967
8065
  </div>
7968
8066
  `;
7969
8067
  }
7970
- if (request.responseBody) {
8068
+ if (request.requestBody && !request.decryptedRequest) {
7971
8069
  html += `
7972
8070
  <div class="detail-section">
7973
- <div class="detail-title">响应数据</div>
8071
+ <div class="detail-title">请求数据</div>
7974
8072
  <div class="detail-content">
7975
- <div class="json-content">${this.formatData(request.responseBody)}</div>
8073
+ <div class="json-content">${this.formatData(request.requestBody)}</div>
7976
8074
  </div>
7977
8075
  </div>
7978
8076
  `;
7979
8077
  }
7980
- if (request.decryptedResponse) {
8078
+ if (request.responseBody && !request.decryptedResponse) {
7981
8079
  html += `
7982
8080
  <div class="detail-section">
7983
- <div class="detail-title">解密响应数据 🔓</div>
8081
+ <div class="detail-title">响应数据</div>
7984
8082
  <div class="detail-content">
7985
- <div class="json-content">${this.formatData(request.decryptedResponse)}</div>
8083
+ <div class="json-content">${this.formatData(request.responseBody)}</div>
7986
8084
  </div>
7987
8085
  </div>
7988
8086
  `;
@@ -8087,8 +8185,41 @@ Created by Leo (@leeguoo)`);
8087
8185
  toggleMinimize() {
8088
8186
  this.config.minimized = !this.config.minimized;
8089
8187
  this.container.classList.toggle("minimized", this.config.minimized);
8090
- const btn = this.container.querySelector('[data-action="minimize"]');
8091
- btn.textContent = this.config.minimized ? "📖" : "📕";
8188
+ const header = this.container.querySelector(".debugger-header");
8189
+ if (header) {
8190
+ header.innerHTML = `
8191
+ <div class="debugger-title">🔓 ${this.config.minimized ? "PWTK" : "PWTK 解密小工具"} <span style="font-size: 10px; opacity: 0.7;">by Leo</span></div>
8192
+ <div class="debugger-controls">
8193
+ ${!this.config.minimized ? '<button class="debugger-btn" data-action="clear" title="清空">🗑️</button>' : ""}
8194
+ ${!this.config.minimized ? '<button class="debugger-btn" data-action="export" title="导出">💾</button>' : ""}
8195
+ <button class="debugger-btn" data-action="minimize" title="${this.config.minimized ? "展开" : "最小化"}">${this.config.minimized ? "📖" : "📕"}</button>
8196
+ ${!this.config.minimized ? '<button class="debugger-btn" data-action="fullscreen" title="全屏">⛶</button>' : ""}
8197
+ <button class="debugger-btn" data-action="close" title="关闭">✕</button>
8198
+ </div>
8199
+ `;
8200
+ const controls = header.querySelector(".debugger-controls");
8201
+ controls.addEventListener("click", (e) => {
8202
+ const target = e.target;
8203
+ const action = target.dataset.action;
8204
+ switch (action) {
8205
+ case "clear":
8206
+ this.clearRequests();
8207
+ break;
8208
+ case "export":
8209
+ this.exportData();
8210
+ break;
8211
+ case "minimize":
8212
+ this.toggleMinimize();
8213
+ break;
8214
+ case "fullscreen":
8215
+ this.toggleFullscreen();
8216
+ break;
8217
+ case "close":
8218
+ this.hide();
8219
+ break;
8220
+ }
8221
+ });
8222
+ }
8092
8223
  }
8093
8224
  toggleFullscreen() {
8094
8225
  this.container.classList.toggle("fullscreen");
@@ -8330,7 +8461,7 @@ class NetworkDebugger {
8330
8461
  this.initialized = true;
8331
8462
  console.log(`
8332
8463
  ╔════════════════════════════════════════╗
8333
- ║ PWTK Network Debugger v1.2.0
8464
+ 🔓 PWTK 解密小工具 v1.2.3
8334
8465
  ║ Created by Leo (@leeguoo) ║
8335
8466
  ║ 技术支持: 请联系 Leo ║
8336
8467
  ║ 分享服务: curl.bwg.leeguoo.com ║