Spaces:
Sleeping
Sleeping
| import fs from 'fs'; | |
| import path from 'path'; | |
| import { fileURLToPath } from 'url'; | |
| import log from '../src/utils/logger.js'; | |
| const __filename = fileURLToPath(import.meta.url); | |
| const __dirname = path.dirname(__filename); | |
| const ACCOUNTS_FILE = path.join(__dirname, '..', 'data', 'accounts.json'); | |
| const CLIENT_ID = '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com'; | |
| const CLIENT_SECRET = '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'; | |
| async function refreshToken(refreshToken) { | |
| const body = new URLSearchParams({ | |
| client_id: CLIENT_ID, | |
| client_secret: CLIENT_SECRET, | |
| grant_type: 'refresh_token', | |
| refresh_token: refreshToken | |
| }); | |
| const response = await fetch('https://oauth2.googleapis.com/token', { | |
| method: 'POST', | |
| headers: { | |
| 'Host': 'oauth2.googleapis.com', | |
| 'User-Agent': 'Go-http-client/1.1', | |
| 'Content-Length': body.toString().length.toString(), | |
| 'Content-Type': 'application/x-www-form-urlencoded', | |
| 'Accept-Encoding': 'gzip' | |
| }, | |
| body: body.toString() | |
| }); | |
| if (!response.ok) { | |
| throw new Error(`HTTP ${response.status}: ${await response.text()}`); | |
| } | |
| return await response.json(); | |
| } | |
| async function refreshAllTokens() { | |
| if (!fs.existsSync(ACCOUNTS_FILE)) { | |
| log.error(`文件不存在: ${ACCOUNTS_FILE}`); | |
| process.exit(1); | |
| } | |
| const accounts = JSON.parse(fs.readFileSync(ACCOUNTS_FILE, 'utf-8')); | |
| log.info(`找到 ${accounts.length} 个账号`); | |
| let successCount = 0; | |
| let failCount = 0; | |
| for (let i = 0; i < accounts.length; i++) { | |
| const account = accounts[i]; | |
| if (account.enable === false) { | |
| log.warn(`账号 ${i + 1}: 已禁用,跳过`); | |
| continue; | |
| } | |
| try { | |
| log.info(`刷新账号 ${i + 1}...`); | |
| const tokenData = await refreshToken(account.refresh_token); | |
| account.access_token = tokenData.access_token; | |
| account.expires_in = tokenData.expires_in; | |
| account.timestamp = Date.now(); | |
| successCount++; | |
| log.info(`账号 ${i + 1}: 刷新成功`); | |
| } catch (error) { | |
| failCount++; | |
| log.error(`账号 ${i + 1}: 刷新失败 - ${error.message}`); | |
| if (error.message.includes('invalid_grant') || error.message.includes('400')) { | |
| account.enable = false; | |
| log.warn(`账号 ${i + 1}: Token 已失效或错误,已自动禁用该账号`); | |
| } | |
| } | |
| } | |
| fs.writeFileSync(ACCOUNTS_FILE, JSON.stringify(accounts, null, 2)); | |
| log.info(`刷新完成: 成功 ${successCount} 个, 失败 ${failCount} 个`); | |
| } | |
| refreshAllTokens().catch(err => { | |
| log.error('刷新失败:', err.message); | |
| process.exit(1); | |
| }); | |