// ==UserScript== // @name 小琰Cookie管理工具(Facebook 专属简化备份功能。 // @namespace http://tampermonkey.net/ // @version 5.3.0 // @description 支持Cookie注入、备份、导入、删除,适配移动端,含Facebook专属简化备份 // @author 小琰 // @match https://*/* // @run-at document-end // @grant none // ==/UserScript== (function() { 'use strict'; // 控制台加载日志 console.log('%c[Cookie管理工具] 已成功加载', 'color: #2196F3; font-weight: bold'); // 全局配置 const CONFIG = { panelZIndex: 9999, watermarkZIndex: 10000, warningZIndex: 9998, animationDuration: '0.3s', cookieExpiresDays: 365, // Facebook关键Cookie配置 facebookKeys: ['c_user', 'xs'] }; // 检测是否为Facebook域名 const isFacebook = () => { const hostname = location.hostname.toLowerCase(); return hostname.includes('facebook.com') || hostname.includes('fb.com'); }; // 创建按钮通用函数 const createButton = (text, bgColor, onClick) => { const btn = document.createElement('button'); btn.textContent = text; btn.style.cssText = ` padding: 10px 15px; background: ${bgColor}; color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; transition: opacity ${CONFIG.animationDuration}; box-sizing: border-box; `; btn.onmouseover = () => btn.style.opacity = '0.8'; btn.onmouseout = () => btn.style.opacity = '1'; btn.onclick = onClick; return btn; }; // 显示状态信息 const showStatus = (message, type = 'info') => { const statusEl = document.getElementById('cookie-status'); if (!statusEl) return; const colors = { success: '#4CAF50', error: '#F44336', info: '#2196F3', warning: '#FF9800' }; statusEl.textContent = message; statusEl.style.color = colors[type] || colors.info; setTimeout(() => { statusEl.textContent = ''; }, 3000); }; // 解析Cookie字符串 const parseCookieString = (cookieStr) => { const cookies = []; const lines = cookieStr.split(/[\n;]/).map(line => line.trim()).filter(Boolean); lines.forEach(line => { const parts = line.split(/[=:]/); if (parts.length >= 2) { const name = parts[0].trim(); const value = parts.slice(1).join('=').trim(); if (name && value) { cookies.push({ name, value }); } } }); return cookies; }; // 获取指定Cookie值 const getCookieValue = (name) => { const cookies = document.cookie.split(';'); for (let cookie of cookies) { const [cookieName, cookieValue] = cookie.split('=').map(s => s.trim()); if (cookieName === name) { return cookieValue; } } return null; }; // Cookie注入功能 const handleCookieInject = () => { const textarea = document.getElementById('cookie-input'); const cookieStr = textarea.value.trim(); if (!cookieStr) { showStatus('请输入Cookie内容', 'warning'); return; } try { const cookies = parseCookieString(cookieStr); let successCount = 0; cookies.forEach(({ name, value }) => { const expires = new Date(); expires.setDate(expires.getDate() + CONFIG.cookieExpiresDays); document.cookie = `${name}=${value}; path=/; expires=${expires.toUTCString()}`; successCount++; }); showStatus(`成功注入 ${successCount} 个Cookie`, 'success'); textarea.value = ''; console.log(`[Cookie管理工具] 已注入 ${successCount} 个Cookie`); } catch (error) { showStatus('Cookie注入失败', 'error'); console.error('[Cookie管理工具] 注入失败:', error); } }; // Facebook专属备份功能 const handleFacebookBackup = () => { try { const c_user = getCookieValue('c_user'); const xs = getCookieValue('xs'); if (!c_user || !xs) { showStatus('未找到Facebook关键Cookie(c_user或xs)', 'error'); return; } const fbCookies = `c_user=${c_user};xs=${xs}`; const blob = new Blob([fbCookies], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `facebook_cookies_${Date.now()}.txt`; a.click(); URL.revokeObjectURL(url); showStatus('Facebook关键Cookie备份成功', 'success'); console.log('[Cookie管理工具] 已备份Facebook关键Cookie (c_user, xs)'); } catch (error) { showStatus('Facebook Cookie备份失败', 'error'); console.error('[Cookie管理工具] Facebook备份失败:', error); } }; // 通用Cookie备份功能 const handleCookieBackup = () => { try { const cookies = document.cookie; if (!cookies) { showStatus('当前网站没有Cookie可备份', 'warning'); return; } const blob = new Blob([cookies], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `cookies_${location.hostname}_${Date.now()}.txt`; a.click(); URL.revokeObjectURL(url); showStatus('Cookie备份成功', 'success'); console.log('[Cookie管理工具] 已备份Cookie'); } catch (error) { showStatus('Cookie备份失败', 'error'); console.error('[Cookie管理工具] 备份失败:', error); } }; // Cookie导入功能 const handleCookieImport = (file) => { const reader = new FileReader(); reader.onload = (e) => { const content = e.target.result; document.getElementById('cookie-input').value = content; showStatus('Cookie文件已加载到输入框', 'success'); }; reader.onerror = () => { showStatus('文件读取失败', 'error'); }; reader.readAsText(file); }; // 触发文件选择 const triggerFileInput = () => { const fileInput = document.getElementById('cookie-file-input'); if (fileInput) { fileInput.click(); } }; // Cookie删除功能 const handleCookieDelete = () => { if (!confirm('确定要删除当前网站的所有Cookie吗?此操作不可恢复!')) { return; } try { const cookies = document.cookie.split(';'); let deleteCount = 0; cookies.forEach(cookie => { const name = cookie.split('=')[0].trim(); if (name) { document.cookie = `${name}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC`; document.cookie = `${name}=; path=/; domain=${location.hostname}; expires=Thu, 01 Jan 1970 00:00:00 UTC`; deleteCount++; } }); showStatus(`已删除 ${deleteCount} 个Cookie`, 'success'); console.log(`[Cookie管理工具] 已删除 ${deleteCount} 个Cookie`); setTimeout(() => location.reload(), 1500); } catch (error) { showStatus('Cookie删除失败', 'error'); console.error('[Cookie管理工具] 删除失败:', error); } }; // 创建主面板 const createMainPanel = () => { const panel = document.createElement('div'); panel.id = 'cookie-manager-panel'; panel.style.cssText = ` position: fixed; bottom: 20px; right: 20px; width: 90%; max-width: 400px; background: #fff; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.15); padding: 20px; z-index: ${CONFIG.panelZIndex}; transform: translateY(120%); transition: transform ${CONFIG.animationDuration} ease; overflow: hidden; box-sizing: border-box; `; panel.setAttribute('aria-label', 'Cookie管理面板'); // 面板标题 const title = document.createElement('h3'); title.textContent = 'Cookie管理工具'; title.style.cssText = 'margin: 0 0 15px 0; color: #333; font-size: 18px; text-align: center;'; panel.appendChild(title); // Facebook提示(仅在Facebook显示) if (isFacebook()) { const fbTip = document.createElement('div'); fbTip.style.cssText = ` background: #E3F2FD; border-left: 4px solid #2196F3; padding: 10px; margin-bottom: 15px; border-radius: 4px; font-size: 13px; color: #1976D2; `; fbTip.textContent = '🎯 已检测到Facebook,可使用简化备份功能'; panel.appendChild(fbTip); } // Cookie输入区域 const inputContainer = document.createElement('div'); inputContainer.style.cssText = 'margin-bottom: 15px;'; const inputLabel = document.createElement('label'); inputLabel.textContent = '粘贴Cookie内容:'; inputLabel.style.cssText = 'display: block; margin-bottom: 8px; color: #666; font-size: 14px;'; inputLabel.setAttribute('for', 'cookie-input'); inputContainer.appendChild(inputLabel); const textarea = document.createElement('textarea'); textarea.id = 'cookie-input'; textarea.placeholder = '支持格式:一行一个Cookie / 分号分隔字符串 / 带属性完整Cookie'; textarea.style.cssText = ` width: 100%; height: 120px; padding: 10px; border: 1px solid #ddd; border-radius: 8px; font-size: 14px; resize: vertical; box-sizing: border-box; outline: none; `; textarea.setAttribute('aria-describedby', 'cookie-input-desc'); inputContainer.appendChild(textarea); const inputDesc = document.createElement('small'); inputDesc.id = 'cookie-input-desc'; inputDesc.textContent = '支持自动解析name、value和属性(path、domain等)'; inputDesc.style.cssText = 'display: block; margin-top: 5px; color: #999; font-size: 12px;'; inputContainer.appendChild(inputDesc); panel.appendChild(inputContainer); // 按钮区域 const btnContainer = document.createElement('div'); btnContainer.style.cssText = isFacebook() ? 'display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 15px;' : 'display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 15px;'; // 注入按钮 const injectBtn = createButton('注入Cookie', '#4CAF50', () => handleCookieInject()); btnContainer.appendChild(injectBtn); // 备份按钮(Facebook显示两个备份按钮) if (isFacebook()) { const fbBackupBtn = createButton('备份关键Cookie', '#1877F2', () => handleFacebookBackup()); btnContainer.appendChild(fbBackupBtn); const fullBackupBtn = createButton('完整备份', '#2196F3', () => handleCookieBackup()); btnContainer.appendChild(fullBackupBtn); } else { const backupBtn = createButton('备份Cookie', '#2196F3', () => handleCookieBackup()); btnContainer.appendChild(backupBtn); } // 导入按钮 const importBtn = createButton('导入Cookie', '#FF9800', () => triggerFileInput()); btnContainer.appendChild(importBtn); // 删除按钮 const deleteBtn = createButton('删除Cookie', '#F44336', () => handleCookieDelete()); btnContainer.appendChild(deleteBtn); panel.appendChild(btnContainer); // 状态提示 const statusEl = document.createElement('div'); statusEl.id = 'cookie-status'; statusEl.style.cssText = ` height: 20px; text-align: center; font-size: 14px; margin-top: 10px; `; panel.appendChild(statusEl); // 关闭按钮 const closeBtn = document.createElement('button'); closeBtn.textContent = '×'; closeBtn.style.cssText = ` position: absolute; top: 10px; right: 10px; background: transparent; border: none; font-size: 20px; cursor: pointer; color: #999; width: 30px; height: 30px; line-height: 30px; padding: 0; border-radius: 50%; transition: background ${CONFIG.animationDuration}; `; closeBtn.setAttribute('aria-label', '关闭面板'); closeBtn.onmouseover = () => closeBtn.style.background = 'rgba(0,0,0,0.05)'; closeBtn.onmouseout = () => closeBtn.style.background = 'transparent'; closeBtn.onclick = () => togglePanel(false); panel.appendChild(closeBtn); // 文件输入(隐藏) const fileInput = document.createElement('input'); fileInput.type = 'file'; fileInput.id = 'cookie-file-input'; fileInput.accept = '.txt'; fileInput.style.display = 'none'; fileInput.onchange = (e) => { const file = e.target.files[0]; if (file) { handleCookieImport(file); } }; panel.appendChild(fileInput); document.body.appendChild(panel); }; // 创建浮动按钮 const createFloatingButton = () => { const btn = document.createElement('button'); btn.id = 'cookie-manager-btn'; btn.textContent = '🍪'; btn.style.cssText = ` position: fixed; bottom: 20px; right: 20px; width: 60px; height: 60px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 50%; font-size: 28px; cursor: pointer; box-shadow: 0 4px 15px rgba(0,0,0,0.2); z-index: ${CONFIG.panelZIndex + 1}; transition: all ${CONFIG.animationDuration}; `; btn.setAttribute('aria-label', '打开Cookie管理工具'); btn.onmouseover = () => { btn.style.transform = 'scale(1.1)'; btn.style.boxShadow = '0 6px 20px rgba(0,0,0,0.3)'; }; btn.onmouseout = () => { btn.style.transform = 'scale(1)'; btn.style.boxShadow = '0 4px 15px rgba(0,0,0,0.2)'; }; btn.onclick = () => togglePanel(true); document.body.appendChild(btn); }; // 切换面板显示 const togglePanel = (show) => { const panel = document.getElementById('cookie-manager-panel'); const btn = document.getElementById('cookie-manager-btn'); if (show) { panel.style.transform = 'translateY(0)'; btn.style.display = 'none'; } else { panel.style.transform = 'translateY(120%)'; btn.style.display = 'block'; } }; // 初始化 const init = () => { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { createMainPanel(); createFloatingButton(); }); } else { createMainPanel(); createFloatingButton(); } }; init(); })();