Capture Discord User IDs (with Floating Window)

Capture all user IDs from Discord avatar URLs, allow selecting and copying them, and provide a close button.

目前為 2025-03-22 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Capture Discord User IDs (with Floating Window)
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Capture all user IDs from Discord avatar URLs, allow selecting and copying them, and provide a close button.
// @author       You
// @match        https://discord.com/channels/*
// @grant        GM_notification
// @run-at       document-start
// @license All Rights Reserved
// ==/UserScript==

(function() {
    'use strict';

    // Empurrar o site para o lado
    document.documentElement.style.transform = 'translateX(300px)';
    document.documentElement.style.transition = 'transform 0.3s ease-in-out';

    // Array para armazenar os IDs dos usuários
    let userIds = [];

    // Criar a janela flutuante para exibir os IDs
    const floatingWindow = document.createElement('div');
    floatingWindow.style.position = 'fixed';
    floatingWindow.style.top = '20px';
    floatingWindow.style.right = '20px';
    floatingWindow.style.width = '350px';
    floatingWindow.style.height = '400px';
    floatingWindow.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
    floatingWindow.style.color = 'white';
    floatingWindow.style.overflowY = 'auto';
    floatingWindow.style.padding = '10px';
    floatingWindow.style.borderRadius = '8px';
    floatingWindow.style.boxShadow = '0px 0px 15px rgba(0, 0, 0, 0.5)';
    floatingWindow.style.zIndex = '9999';
    floatingWindow.style.fontFamily = 'Arial, sans-serif';
    floatingWindow.innerHTML = `<h3>Captured User IDs</h3>
                                <button id="select-all-btn" style="margin-bottom: 10px;">Select All</button>
                                <table id="user-id-table" style="width: 100%; border-collapse: collapse;">
                                    <thead>
                                        <tr>
                                            <th>Select</th>
                                            <th>Avatar</th>
                                            <th>ID</th>
                                        </tr>
                                    </thead>
                                    <tbody></tbody>
                                </table>
                                <button id="copy-btn" style="margin-top: 10px;">Copy Selected</button>
                                <button id="close-btn" style="margin-top: 10px;">Close</button>`;
    document.body.appendChild(floatingWindow);

    // Função para capturar e extrair o ID dos avatares
    function captureUserId(url) {
        // Expressão regular para extrair o ID do usuário da URL
        const match = url.match(/avatars\/(\d+)\//);
        if (match && match[1]) {
            const userId = match[1];
            if (!userIds.includes(userId)) {
                userIds.push(userId);

                // Criar uma nova linha na tabela
                const tableRow = document.createElement('tr');
                tableRow.innerHTML = `
                    <td><input type="checkbox" class="user-checkbox" value="${userId}"></td>
                    <td><img src="${url}?size=25" alt="Avatar" style="width: 25px; height: 25px;"></td>
                    <td>${userId}</td>
                `;
                document.querySelector('#user-id-table tbody').appendChild(tableRow);
                console.log("User ID captured: ", userId);
            }
        }
    }

    // Função para monitorar a adição de novas imagens de avatares no DOM
    function monitorAvatarTags() {
        const images = document.querySelectorAll('img');
        images.forEach(img => {
            if (img.src && img.src.includes('https://cdn.discordapp.com/avatars/')) {
                captureUserId(img.src);
            }
        });
    }

    // Monitorar avatares a cada 2 segundos
    setInterval(monitorAvatarTags, 2000);

    // Função para exibir uma mensagem se nenhum avatar for encontrado
    function displayUserIds() {
        if (userIds.length === 0) {
            const noIdsMessage = document.createElement('p');
            noIdsMessage.innerText = 'No user IDs found.';
            floatingWindow.appendChild(noIdsMessage);
        }
    }

    // Função para copiar os IDs selecionados para a área de transferência
    document.getElementById('copy-btn').addEventListener('click', () => {
        const selectedIds = [];
        document.querySelectorAll('.user-checkbox:checked').forEach(checkbox => {
            selectedIds.push(checkbox.value);
        });

        if (selectedIds.length > 0) {
            const textToCopy = selectedIds.join('\n');
            const textarea = document.createElement('textarea');
            textarea.value = textToCopy;
            document.body.appendChild(textarea);
            textarea.select();
            document.execCommand('copy');
            document.body.removeChild(textarea);
            alert('Selected IDs copied to clipboard!');
        } else {
            alert('No IDs selected!');
        }
    });

    // Função para fechar a janela flutuante
    document.getElementById('close-btn').addEventListener('click', () => {
        floatingWindow.style.display = 'none';
    });

    // Função para selecionar/desmarcar todos os checkboxes
    document.getElementById('select-all-btn').addEventListener('click', () => {
        const checkboxes = document.querySelectorAll('.user-checkbox');
        const allChecked = Array.from(checkboxes).every(checkbox => checkbox.checked);

        checkboxes.forEach(checkbox => {
            checkbox.checked = !allChecked;
        });
    });

    // Exibir os IDs após o carregamento inicial
    setTimeout(displayUserIds, 5000);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址