【油猴脚本】Cookie和Local列表展示导出

今天上班在摸鱼,我就好奇屎黄的shared到底是怎么跳转的

为什么会和linux登录有关联,所以就觉得是不是存了什么东西

觉得Cookie和Local看起来一点都不方便

所以他就诞生了,可以查看网页的Cookie和LocalStorage

// ==UserScript==
// @name         导出Cookie和LocalStorage
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description  展示和导出Cookie和LocalStorage
// @author       xlike
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 样式表
    const styles = `
        #exportBox {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            width: 400px;
            background-color: white;
            box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.2);
            border-radius: 10px;
            padding: 20px;
            z-index: 10000;
            display: none;
            font-family: Arial, sans-serif;
        }
        #exportBox h2 {
            margin-top: 0;
            text-align: center;
        }
        #exportBox .options, .exportAll {
            display: flex;
            justify-content: space-between;
            margin-bottom: 20px;
        }
        #exportBox button {
            background-color: #4CAF50;
            color: white;
            border: none;
            padding: 10px;
            border-radius: 5px;
            cursor: pointer;
            width: 48%;
            transition: background-color 0.3s ease;
        }
        #exportBox button:hover {
            background-color: #45a049;
        }
        #exportBox .list {
            max-height: 300px;
            overflow-y: auto;
            margin-bottom: 20px;
            border: 1px solid #ddd;
            border-radius: 5px;
            padding: 10px;
            display: none; /* 默认隐藏 */
        }
        #exportBox .list div {
            display: flex;
            justify-content: space-between;
            background-color: #f9f9f9;
            padding: 10px;
            margin: 5px 0;
            border-radius: 5px;
            border: 1px solid #e0e0e0;
            max-width: 100%;
        }
        #exportBox .list div:hover {
            background-color: #f1f1f1;
        }
        #exportBox .list div span {
            cursor: pointer;
            font-size: 14px;
            white-space: nowrap; /* 不换行 */
            overflow: hidden; /* 超出隐藏 */
            text-overflow: ellipsis; /* 显示省略号 */
        }
        #exportBox .list div span.copy {
            color: blue;
        }
        #exportBox .list div span.key {
            flex-grow: 1;
            margin-right: 10px;
            font-weight: bold;
            max-width: 70%;
        }
        #openExportBox {
            position: fixed;
            top: 10px;
            right: 10px;
            background-color: #4CAF50;
            color: white;
            border: none;
            padding: 10px 20px;
            border-radius: 8px;
            cursor: pointer;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
            z-index: 1000;
        }
        #openExportBox:hover {
            background-color: #45a049;
        }
    `;

    // 插入样式表
    const styleSheet = document.createElement("style");
    styleSheet.type = "text/css";
    styleSheet.innerText = styles;
    document.head.appendChild(styleSheet);

    // 创建主按钮
    const openButton = document.createElement('button');
    openButton.id = 'openExportBox';
    openButton.textContent = 'Export Data';
    document.body.appendChild(openButton);

    // 创建弹出框
    const exportBox = document.createElement('div');
    exportBox.id = 'exportBox';
    exportBox.innerHTML = `
        <h2>展示和导出Cookie和Local</h2>
        <button id="closeExportBox" style="
        position: absolute;
        top: 10px;
        width: 35px;
        right: 10px;
        background-color: red;
        color: white;
        border: none;
        padding: 5px 10px;
        border-radius: 50%;
        cursor: pointer;
        font-weight: bold;
    ">X</button>
        <div class="options">
            <button id="showCookies">Cookies列表</button>
            <button id="showLocalStorage">Local列表</button>
        </div>
        <div class="list" id="dataList"></div>
        <div class="exportAll">
            <button id="exportCookiesAll">导出所有Cookies</button>
            <button id="exportLocalStorageAll">导出所有Local</button>
        </div>
    `;
    document.body.appendChild(exportBox);

    // 打开弹出框
    openButton.addEventListener('click', () => {
        exportBox.style.display = 'block';
    });

    // 关闭弹出框
    document.getElementById('closeExportBox').addEventListener('click', () => {
        exportBox.style.display = 'none';
    });

    // 点击页面外关闭弹出框
    window.addEventListener('click', (e) => {
        if (e.target === exportBox) {
            exportBox.style.display = 'none';
        }
    });

    // 显示 Cookies 列表
    document.getElementById('showCookies').addEventListener('click', () => {
        const cookies = document.cookie.split('; ').reduce((acc, cookie) => {
            const [name, value] = cookie.split('=');
            acc[name] = decodeURIComponent(value); // 去掉转义字符
            return acc;
        }, {});
        displayDataList(cookies, 'cookie');
    });

    // 显示 localStorage 列表
    document.getElementById('showLocalStorage').addEventListener('click', () => {
        const localStorageData = {};
        for (let i = 0; i < localStorage.length; i++) {
            const key = localStorage.key(i);
            const value = localStorage.getItem(key);

            // 尝试解析 JSON,如果失败则保留原始字符串
            try {
                localStorageData[key] = JSON.parse(value);
            } catch (e) {
                localStorageData[key] = value; // 不是 JSON 的字符串
            }
        }
        displayDataList(localStorageData, 'localStorage');
    });

    // 显示数据列表并绑定复制功能
    function displayDataList(data, type) {
        const dataList = document.getElementById('dataList');
        dataList.innerHTML = '';

        if (Object.keys(data).length === 0) {
            dataList.innerHTML = `<div>No ${type === 'cookie' ? 'Cookies' : 'localStorage'} found.</div>`;
        } else {
            for (const [key, value] of Object.entries(data)) {
                const itemDiv = document.createElement('div');
                const keySpan = document.createElement('span');
                const copySpan = document.createElement('span');

                keySpan.textContent = `${key}: ${typeof value === 'object' ? JSON.stringify(value) : value}`;
                keySpan.classList.add('key');

                copySpan.textContent = 'Copy';
                copySpan.classList.add('copy');
                copySpan.addEventListener('click', () => {
                    const cleanValue = typeof value === 'object'
                        ? JSON.stringify({ [key]: value }, null, 2).replace(/\\n/g, '').replace(/\\/g, '')
                        : { [key]: value };
                    navigator.clipboard.writeText(JSON.stringify(cleanValue));
                    alert(`${type} key-value copied as JSON: ${JSON.stringify(cleanValue)}`);
                });

                itemDiv.appendChild(keySpan);
                itemDiv.appendChild(copySpan);
                dataList.appendChild(itemDiv);
            }
        }

        // 显示数据列表
        dataList.style.display = 'block';
    }

    // 导出所有 Cookies
    document.getElementById('exportCookiesAll').addEventListener('click', () => {
        const cookies = document.cookie.split('; ').reduce((acc, cookie) => {
            const [name, value] = cookie.split('=');
            acc[name] = decodeURIComponent(value); // 去掉转义字符
            return acc;
        }, {});
        exportDataAsJson(cookies, 'cookies.json');
    });

    // 导出所有 localStorage
    document.getElementById('exportLocalStorageAll').addEventListener('click', () => {
        const localStorageData = {};
        for (let i = 0; i < localStorage.length; i++) {
            const key = localStorage.key(i);
            const value = localStorage.getItem(key);

            // 尝试解析 JSON,如果失败则保留原始字符串
            try {
                localStorageData[key] = JSON.parse(value);
            } catch (e) {
                localStorageData[key] = value; // 不是 JSON 的字符串
            }
        }
        exportDataAsJson(localStorageData, 'localStorage.json');
    });

    // 导出为 JSON 文件
    function exportDataAsJson(data, filename) {
        const cleanData = JSON.stringify(data, null, 2).replace(/\\n/g, '').replace(/\\/g, ''); // 去掉所有转义字符
        const blob = new Blob([cleanData], { type: 'application/json' });
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    }

})();



复制和导出,会下载相对应的.json文件,key-value 格式

我只是学习技术,没有打那种坏心思 :no_mouth:

4 个赞

感谢大佬分享

感谢大佬分享。