Greasy Fork

XPath 文本复制工具

在页面右下角输入XPath并复制匹配的文本内容

// ==UserScript==
// @name         XPath 文本复制工具
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  在页面右下角输入XPath并复制匹配的文本内容
// @author       qztan
// @match        *://*/*
// @grant        GM_setClipboard
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // 添加样式
    GM_addStyle(`
        #xpathCopyTool {
            position: fixed;
            bottom: 20px;
            right: 20px;
            width: 300px;
            padding: 15px;
            background: rgba(0, 0, 0, 0.8);
            color: #fff;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0,0,0,0.5);
            z-index: 10000;
            font-family: Arial, sans-serif;
        }
        #xpathCopyTool input {
            width: calc(100% - 20px);
            padding: 8px;
            margin-bottom: 10px;
            border: none;
            border-radius: 4px;
        }
        #xpathCopyTool button {
            width: 100%;
            padding: 10px;
            background: #28a745;
            border: none;
            border-radius: 4px;
            color: #fff;
            font-size: 14px;
            cursor: pointer;
        }
        #xpathCopyTool button:hover {
            background: #218838;
        }
        #xpathCopyTool .close-btn {
            position: absolute;
            top: 5px;
            right: 5px;
            width: 20px;
            height: 20px;
            background: none;
            border: none;
            color: #fff;
            font-size: 16px;
            font-weight: bold;
            cursor: pointer;
            line-height: 20px;
            text-align: center;
            padding: 0;
        }
        #xpathCopyTool .close-btn:hover {
            color: #ff4d4f;
        }
        #xpathCopyTool .message {
            margin-top: 10px;
            font-size: 12px;
            color: #28a745;
        }
    `);

    // 创建提示框容器
    const container = document.createElement('div');
    container.id = 'xpathCopyTool';

    // 关闭按钮
    const closeBtn = document.createElement('button');
    closeBtn.innerHTML = '×';
    closeBtn.className = 'close-btn';
    closeBtn.title = '关闭';
    closeBtn.onclick = () => container.style.display = 'none';
    container.appendChild(closeBtn);

    // 输入框
    const input = document.createElement('input');
    input.type = 'text';
    input.placeholder = '请输入XPath路径';
    container.appendChild(input);

    // 复制按钮
    const button = document.createElement('button');
    button.textContent = '复制';
    container.appendChild(button);

    // 消息显示
    const message = document.createElement('div');
    message.className = 'message';
    container.appendChild(message);

    // 添加到页面
    document.body.appendChild(container);

    // 复制功能
    button.addEventListener('click', () => {
        const xpath = input.value.trim();
        if (!xpath) {
            message.textContent = '请输入有效的XPath路径。';
            return;
        }
        try {
            const result = [];
            const nodesSnapshot = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
            for (let i = 0; i < nodesSnapshot.snapshotLength; i++) {
                const node = nodesSnapshot.snapshotItem(i);
                if (node && node.textContent) {
                    result.push(node.textContent.trim());
                }
            }
            if (result.length === 0) {
                message.textContent = '没有找到匹配的内容。';
                return;
            }
            const textToCopy = result.join('\n');
            GM_setClipboard(textToCopy, 'text');
            message.textContent = '已复制 ' + result.length + ' 条内容到剪贴板。';
        } catch (error) {
            console.error('XPath 错误:', error);
            message.textContent = 'XPath 路径有误,请检查。';
        }
    });

})();