URL参数解析器

解析当前URL参数并在页面上展示(无参数时不显示按钮)

当前为 2025-06-20 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         URL参数解析器
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  解析当前URL参数并在页面上展示(无参数时不显示按钮)
// @author       YourName
// @match        *://*/*
// @license MIT
// @grant        none
// ==/UserScript==

(function () {
  "use strict";

  // 检查当前URL是否有参数
  function hasUrlParams() {
    const url = window.location.href;
    return url.includes("?") && url.split("?")[1].length > 0;
  }

  // 如果没有参数,直接退出
  if (!hasUrlParams()) return;

  // 创建UI容器
  const container = document.createElement("div");
  container.className = "url-param-analyzer";
  container.innerHTML = `
      <button class="analyzer-button" title="解析URL参数">🔍</button>
      <div class="analyzer-panel">
          <div class="panel-body">
              <div class="params-container">
                  <table class="params-table">
                      <thead>
                          <tr>
                              <th width="40%">参数名</th>
                              <th width="55%">参数值</th>
                              <th width="5%">操作</th>
                          </tr>
                      </thead>
                      <tbody id="params-list"></tbody>
                  </table>
              </div>
          </div>
      </div>
      <div class="copied-message">已复制到剪贴板!</div>
  `;

  // 简化后的CSS样式
  const style = document.createElement("style");
  style.textContent = `
      .url-param-analyzer {
          font-family: Arial, sans-serif;
      }

      .analyzer-button {
          position: fixed;
          bottom: 20px;
          right: 20px;
          width: 50px;
          height: 50px;
          background-color: #4a6cf7;
          color: white;
          border-radius: 50%;
          display: flex;
          align-items: center;
          justify-content: center;
          cursor: pointer;
          box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
          z-index: 9999;
          border: none;
          font-size: 20px;
      }

      .analyzer-panel {
          position: fixed;
          bottom: 80px;
          right: 20px;
          width: 420px;
          max-height: 400px;
          background-color: white;
          border-radius: 8px;
          box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
          z-index: 9998;
          display: none;
          overflow: hidden;
          border: 1px solid #ddd;
      }

      .panel-body {
          padding: 15px;
          overflow-y: auto;
          max-height: 350px;
      }

      .params-table {
          width: 100%;
          border-collapse: collapse;
          font-size: 13px;
      }

      .params-table th {
          background-color: #f1f1f1;
          text-align: left;
          padding: 8px 10px;
      }

      .params-table td {
          padding: 8px 10px;
          border-bottom: 1px solid #eee;
          word-break: break-word;
      }

      .copy-btn {
          background-color: #f1f1f1;
          border: 1px solid #ddd;
          border-radius: 3px;
          padding: 3px 6px;
          font-size: 12px;
          cursor: pointer;
      }

      .no-params {
          text-align: center;
          padding: 20px;
          color: #777;
      }

      .copied-message {
          position: fixed;
          top: 20px;
          left: 50%;
          transform: translateX(-50%);
          background-color: #4CAF50;
          color: white;
          padding: 8px 15px;
          border-radius: 3px;
          z-index: 10000;
          display: none;
      }
  `;

  // 将样式和容器添加到页面
  document.head.appendChild(style);
  document.body.appendChild(container);

  // 脚本功能
  const analyzerButton = container.querySelector(".analyzer-button");
  const analyzerPanel = container.querySelector(".analyzer-panel");
  const paramsListElement = container.querySelector("#params-list");
  const copiedMessage = container.querySelector(".copied-message");

  // 显示面板
  analyzerButton.addEventListener("click", function () {
    // 解析当前URL参数
    const currentUrl = decodeURI(window.location.href); // 先解码整个URL
    const urlParams = parseUrlParams(currentUrl);

    // 更新UI
    updateParamsList(urlParams);

    // 显示面板
    analyzerPanel.style.display = "block";
  });

  // 复制按钮事件
  paramsListElement.addEventListener("click", function (e) {
    if (e.target.classList.contains("copy-btn")) {
      const value = e.target.getAttribute("data-value");
      copyToClipboard(value);
      showCopiedMessage();
    }
  });

  // 解析URL参数函数
  function parseUrlParams(url) {
    const params = {};
    const parser = document.createElement("a");
    parser.href = url;
    const query = parser.search.substring(1);
    const vars = query.split("&");

    for (let i = 0; i < vars.length; i++) {
      const pair = vars[i].split("=");
      if (pair.length === 2) {
        const key = decodeURIComponent(pair[0]);
        const value = decodeURIComponent(pair[1]);
        params[key] = value;
      }
    }

    return params;
  }

  // 更新参数列表
  function updateParamsList(params) {
    paramsListElement.innerHTML = "";

    if (Object.keys(params).length === 0) {
      paramsListElement.innerHTML = `
              <tr>
                  <td colspan="3" class="no-params">当前URL没有参数</td>
              </tr>
          `;
      return;
    }

    for (const [key, value] of Object.entries(params)) {
      const row = document.createElement("tr");
      row.innerHTML = `
              <td class="param-name">${key}</td>
              <td>${value}</td>
              <td><button class="copy-btn" data-value="${value}">复制</button></td>
          `;
      paramsListElement.appendChild(row);
    }
  }

  // 复制到剪贴板
  function copyToClipboard(text) {
    const textarea = document.createElement("textarea");
    textarea.value = text;
    document.body.appendChild(textarea);
    textarea.select();
    document.execCommand("copy");
    document.body.removeChild(textarea);
  }

  // 显示复制成功消息
  function showCopiedMessage() {
    copiedMessage.style.display = "block";
    setTimeout(() => {
      copiedMessage.style.display = "none";
    }, 2000);
  }

  // 点击面板外部关闭面板
  document.addEventListener("click", function (e) {
    if (
      analyzerPanel.style.display === "block" &&
      !analyzerPanel.contains(e.target) &&
      e.target !== analyzerButton
    ) {
      analyzerPanel.style.display = "none";
    }
  });
})();