cc / scripts /test-gemini-refresh.js
hequ's picture
Upload 221 files
69b897d verified
#!/usr/bin/env node
/**
* 测试 Gemini token 刷新功能
*/
const path = require('path')
const dotenv = require('dotenv')
// 加载环境变量
dotenv.config({ path: path.join(__dirname, '..', '.env') })
const redis = require('../src/models/redis')
const geminiAccountService = require('../src/services/geminiAccountService')
const crypto = require('crypto')
const config = require('../config/config')
// 加密相关常量(与 geminiAccountService 保持一致)
const ALGORITHM = 'aes-256-cbc'
const ENCRYPTION_SALT = 'gemini-account-salt' // 注意:是 'gemini-account-salt' 不是其他值!
// 生成加密密钥
function generateEncryptionKey() {
return crypto.scryptSync(config.security.encryptionKey, ENCRYPTION_SALT, 32)
}
// 解密函数(用于调试)
function debugDecrypt(text) {
if (!text) {
return { success: false, error: 'Empty text' }
}
try {
const key = generateEncryptionKey()
const ivHex = text.substring(0, 32)
const encryptedHex = text.substring(33)
const iv = Buffer.from(ivHex, 'hex')
const encryptedText = Buffer.from(encryptedHex, 'hex')
const decipher = crypto.createDecipheriv(ALGORITHM, key, iv)
let decrypted = decipher.update(encryptedText)
decrypted = Buffer.concat([decrypted, decipher.final()])
return { success: true, value: decrypted.toString() }
} catch (error) {
return { success: false, error: error.message }
}
}
async function testGeminiTokenRefresh() {
try {
console.log('🚀 开始测试 Gemini token 刷新功能...\n')
// 显示配置信息
console.log('📋 配置信息:')
console.log(` 加密密钥: ${config.security.encryptionKey}`)
console.log(` 加密盐值: ${ENCRYPTION_SALT}`)
console.log()
// 1. 连接 Redis
console.log('📡 连接 Redis...')
await redis.connect()
console.log('✅ Redis 连接成功\n')
// 2. 获取所有 Gemini 账户
console.log('🔍 获取 Gemini 账户列表...')
const accounts = await geminiAccountService.getAllAccounts()
const geminiAccounts = accounts.filter((acc) => acc.platform === 'gemini')
if (geminiAccounts.length === 0) {
console.log('❌ 没有找到 Gemini 账户')
process.exit(1)
}
console.log(`✅ 找到 ${geminiAccounts.length} 个 Gemini 账户\n`)
// 3. 测试每个账户的 token 刷新
for (const account of geminiAccounts) {
console.log(`\n📋 测试账户: ${account.name} (${account.id})`)
console.log(` 状态: ${account.status}`)
try {
// 获取原始账户数据(用于调试)
const client = redis.getClient()
const rawData = await client.hgetall(`gemini_account:${account.id}`)
console.log(' 📊 原始数据检查:')
console.log(` refreshToken 存在: ${rawData.refreshToken ? '是' : '否'}`)
if (rawData.refreshToken) {
console.log(` refreshToken 长度: ${rawData.refreshToken.length}`)
console.log(` refreshToken 前50字符: ${rawData.refreshToken.substring(0, 50)}...`)
// 尝试手动解密
const decryptResult = debugDecrypt(rawData.refreshToken)
if (decryptResult.success) {
console.log(' ✅ 手动解密成功')
console.log(` 解密后前20字符: ${decryptResult.value.substring(0, 20)}...`)
} else {
console.log(` ❌ 手动解密失败: ${decryptResult.error}`)
}
}
// 获取完整账户信息(包括解密的 token)
const fullAccount = await geminiAccountService.getAccount(account.id)
if (!fullAccount.refreshToken) {
console.log(' ⚠️ 跳过:该账户无 refresh token\n')
continue
}
console.log(' ✅ 找到 refresh token')
console.log(
` 📝 解密后的 refresh token 前20字符: ${fullAccount.refreshToken.substring(0, 20)}...`
)
console.log(' 🔄 开始刷新 token...')
const startTime = Date.now()
// 执行 token 刷新
const newTokens = await geminiAccountService.refreshAccountToken(account.id)
const duration = Date.now() - startTime
console.log(` ✅ Token 刷新成功!耗时: ${duration}ms`)
console.log(` 📅 新的过期时间: ${new Date(newTokens.expiry_date).toLocaleString()}`)
console.log(` 🔑 Access Token: ${newTokens.access_token.substring(0, 20)}...`)
// 验证账户状态已更新
const updatedAccount = await geminiAccountService.getAccount(account.id)
console.log(` 📊 账户状态: ${updatedAccount.status}`)
} catch (error) {
console.log(` ❌ Token 刷新失败: ${error.message}`)
console.log(' 🔍 错误详情:', error)
}
}
console.log('\n✅ 测试完成!')
} catch (error) {
console.error('❌ 测试失败:', error)
} finally {
// 断开 Redis 连接
await redis.disconnect()
process.exit(0)
}
}
// 运行测试
testGeminiTokenRefresh()