| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | (function() { |
| | 'use strict'; |
| |
|
| | GM_addStyle(` |
| | #gb-btn { |
| | position: fixed; |
| | bottom: 32px; |
| | right: 32px; |
| | width: 60px; |
| | height: 60px; |
| | background: #1a73e8; |
| | border-radius: 50%; |
| | box-shadow: 0 4px 16px rgba(0,0,0,0.2); |
| | cursor: pointer; |
| | z-index: 9999; |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | color: white; |
| | font-size: 24px; |
| | transition: all 0.2s; |
| | } |
| | #gb-btn:hover { |
| | transform: scale(1.1); |
| | background: #1557b0; |
| | } |
| | `); |
| |
|
| | const btn = document.createElement('div'); |
| | btn.id = 'gb-btn'; |
| | btn.textContent = '⬇'; |
| | btn.title = '下载配置'; |
| | document.body.appendChild(btn); |
| |
|
| | const formatTime = (ts) => { |
| | if (!ts) return null; |
| | const d = new Date((ts - 43200) * 1000); |
| | return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')} ${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}:${String(d.getSeconds()).padStart(2,'0')}`; |
| | }; |
| |
|
| | const download = (data, filename) => { |
| | const blob = new Blob([data], { 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); |
| | URL.revokeObjectURL(url); |
| | }; |
| |
|
| | btn.onclick = () => { |
| | const pathParts = window.location.pathname.split('/'); |
| | const cidIndex = pathParts.indexOf('cid'); |
| | const config_id = (cidIndex !== -1 && pathParts[cidIndex + 1]) || null; |
| | const csesidx = new URLSearchParams(window.location.search).get('csesidx'); |
| |
|
| | let email = localStorage.getItem('gemini_user_email'); |
| | if (!email) { |
| | email = prompt('请输入您的邮箱地址:'); |
| | if (email) { |
| | localStorage.setItem('gemini_user_email', email); |
| | } |
| | } |
| |
|
| | GM_cookie('list', {}, (cookies, error) => { |
| | if (error || !config_id || !csesidx || !email) { |
| | alert('❌ 数据不完整'); |
| | return; |
| | } |
| |
|
| | const host_c_oses = (cookies.find(c => c.name === '__Host-C_OSES') || {}).value || null; |
| | const sesCookie = cookies.find(c => c.name === '__Secure-C_SES') || {}; |
| | const secure_c_ses = sesCookie.value || null; |
| |
|
| | if (!secure_c_ses) { |
| | alert('❌ Cookie 读取失败'); |
| | return; |
| | } |
| |
|
| | const data = { |
| | id: email, |
| | csesidx, |
| | config_id, |
| | secure_c_ses, |
| | host_c_oses, |
| | expires_at: formatTime(sesCookie.expirationDate) |
| | }; |
| |
|
| | download(JSON.stringify(data, null, 2), `${email}.json`); |
| |
|
| | btn.textContent = '✓'; |
| | btn.style.background = '#1e8e3e'; |
| | setTimeout(() => { |
| | btn.textContent = '⬇'; |
| | btn.style.background = '#1a73e8'; |
| | }, 1500); |
| | }); |
| | }; |
| | })(); |
| |
|