// ==UserScript== // @name 跨窗口存储数据拷贝工具 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 一键导出/导入Cookie、localStorage、sessionStorage,完美支持JSON对象,不丢失数据 // @author 米奇不妙屋 // @match *://*/* // @grant GM_setClipboard // @grant unsafeWindow // @run-at document-end // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/571801/%E8%B7%A8%E7%AA%97%E5%8F%A3%E5%AD%98%E5%82%A8%E6%95%B0%E6%8D%AE%E6%8B%B7%E8%B4%9D%E5%B7%A5%E5%85%B7.user.js // @updateURL https://update.greasyfork.icu/scripts/571801/%E8%B7%A8%E7%AA%97%E5%8F%A3%E5%AD%98%E5%82%A8%E6%95%B0%E6%8D%AE%E6%8B%B7%E8%B4%9D%E5%B7%A5%E5%85%B7.meta.js // ==/UserScript== (function() { 'use strict'; // 创建悬浮面板 function createPanel() { const oldPanel = document.getElementById('storage-copy-panel'); if (oldPanel) oldPanel.remove(); const panel = document.createElement('div'); panel.id = 'storage-copy-panel'; panel.style.cssText = ` position: fixed; top: 20px; right: 20px; z-index: 999999; background: #2d3748; color: white; padding: 12px 15px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.3); font-size: 14px; width: 180px; cursor: move; user-select: none; `; const btnStyle = ` display: block; width: 100%; margin: 6px 0; padding: 8px; border: none; border-radius: 4px; background: #4299e1; color: white; cursor: pointer; font-size: 13px; transition: background 0.2s; `; const exportBtn = document.createElement('button'); exportBtn.textContent = '📤 导出全部数据'; exportBtn.style.cssText = btnStyle; exportBtn.addEventListener('click', exportAllData); const importBtn = document.createElement('button'); importBtn.textContent = '📥 导入粘贴数据'; importBtn.style.cssText = btnStyle; importBtn.addEventListener('click', importAllData); const closeBtn = document.createElement('button'); closeBtn.textContent = '× 关闭面板'; closeBtn.style.cssText = btnStyle + 'background: #e53e3e;'; closeBtn.addEventListener('click', () => panel.remove()); panel.append(exportBtn, importBtn, closeBtn); document.body.appendChild(panel); dragElement(panel); } // 拖拽功能 function dragElement(elem) { let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; elem.onmousedown = dragStart; function dragStart(e) { e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = dragEnd; document.onmousemove = dragMove; } function dragMove(e) { e.preventDefault(); pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; elem.style.top = (elem.offsetTop - pos2) + "px"; elem.style.right = 'auto'; elem.style.left = (elem.offsetLeft - pos1) + "px"; } function dragEnd() { document.onmouseup = null; document.onmousemove = null; } } // ============================================== // 【修复】导出:完整保留 JSON 对象结构 // ============================================== function exportAllData() { try { // Cookie const cookies = document.cookie; // localStorage:安全获取所有数据 const localStorageData = {}; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); localStorageData[key] = localStorage.getItem(key); } // sessionStorage:安全获取所有数据 const sessionStorageData = {}; for (let i = 0; i < sessionStorage.length; i++) { const key = sessionStorage.key(i); sessionStorageData[key] = sessionStorage.getItem(key); } const allData = { url: window.location.origin, cookies, localStorage: localStorageData, sessionStorage: sessionStorageData, version: "2.0", timestamp: new Date().toISOString() }; GM_setClipboard(JSON.stringify(allData, null, 2)); alert("✅ 导出成功!数据已复制(JSON 对象不会丢失)"); } catch (e) { alert("❌ 导出失败:" + e.message); console.error(e); } } // ============================================== // 【修复】导入:原样写入,不破坏 JSON 字符串 // ============================================== function importAllData() { try { navigator.clipboard.readText().then(text => { if (!text) return alert("❌ 剪贴板为空"); const data = JSON.parse(text); if (!data) return alert("❌ 数据格式错误"); // 导入 Cookie if (data.cookies) { data.cookies.split('; ').forEach(cookie => { if (!cookie.includes('=')) return; const [name, ...vs] = cookie.split('='); const value = vs.join('='); document.cookie = `${name}=${value}; path=/; max-age=31536000; SameSite=Lax`; }); } // 导入 localStorage【原样写入,不解析、不破坏】 if (data.localStorage) { Object.entries(data.localStorage).forEach(([k, v]) => { try { localStorage.setItem(k, v); } catch {} }); } // 导入 sessionStorage【原样写入,不解析、不破坏】 if (data.sessionStorage) { Object.entries(data.sessionStorage).forEach(([k, v]) => { try { sessionStorage.setItem(k, v); } catch {} }); } alert("✅ 导入成功!刷新页面即可生效 ✅"); }).catch(err => { alert("❌ 剪贴板权限被拒绝,请手动允许后再试"); }); } catch (e) { alert("❌ 导入失败:" + e.message); console.error(e); } } // 快捷键 Alt + S document.addEventListener('keydown', e => { if (e.altKey && e.key === 's') createPanel(); }); window.addEventListener('load', () => setTimeout(createPanel, 1000)); })();