Spaces:
Sleeping
Sleeping
import { cookieManager } from './CookieManager.js'; | |
import dotenv from 'dotenv'; | |
import { fileURLToPath } from 'url'; | |
import { dirname, join } from 'path'; | |
import fs from 'fs'; | |
import readline from 'readline'; | |
import chalk from 'chalk'; | |
// 获取当前文件的目录路径 | |
const __filename = fileURLToPath(import.meta.url); | |
const __dirname = dirname(__filename); | |
// 加载环境变量 | |
dotenv.config({ path: join(dirname(__dirname), '.env') }); | |
// 日志配置 | |
const logger = { | |
info: (message) => console.log(chalk.blue(`[信息] ${message}`)), | |
error: (message) => console.error(chalk.red(`[错误] ${message}`)), | |
warning: (message) => console.warn(chalk.yellow(`[警告] ${message}`)), | |
success: (message) => console.log(chalk.green(`[成功] ${message}`)), | |
}; | |
// 创建readline接口 | |
const rl = readline.createInterface({ | |
input: process.stdin, | |
output: process.stdout | |
}); | |
// 默认cookie文件路径 | |
const DEFAULT_COOKIE_FILE = 'cookies.txt'; | |
let isSaveCookie = false; | |
let isAddCookie = false; | |
// 显示帮助信息 | |
function showHelp() { | |
console.log(chalk.cyan('Notion Cookie 管理工具')); | |
console.log(chalk.cyan('====================')); | |
console.log(''); | |
console.log('可用命令:'); | |
console.log(' help - 显示此帮助信息'); | |
console.log(' list - 列出所有cookie'); | |
console.log(' add - 添加新的cookie'); | |
console.log(' validate - 验证所有cookie'); | |
console.log(' remove - 删除指定cookie'); | |
console.log(' save - 保存cookie到文件'); | |
console.log(' load - 从文件加载cookie'); | |
console.log(' exit - 退出程序'); | |
console.log(''); | |
} | |
// 列出所有cookie | |
async function listCookies() { | |
if (!cookieManager.initialized || cookieManager.getValidCount() === 0) { | |
logger.warning('没有可用的cookie,请先加载或添加cookie'); | |
return; | |
} | |
const status = cookieManager.getStatus(); | |
console.log(chalk.cyan('\nCookie 列表:')); | |
console.log(chalk.cyan('===========')); | |
status.forEach((entry, idx) => { | |
const validMark = entry.valid ? chalk.green('✓') : chalk.red('✗'); | |
console.log(`${idx + 1}. ${validMark} 用户ID: ${entry.userId}, 空间ID: ${entry.spaceId}, 上次使用: ${entry.lastUsed}`); | |
}); | |
console.log(`\n共有 ${status.length} 个cookie,${cookieManager.getValidCount()} 个有效\n`); | |
} | |
// 添加新cookie | |
async function addCookie() { | |
return new Promise((resolve) => { | |
rl.question(chalk.yellow('请输入Notion cookie: '), async (cookie) => { | |
if (!cookie || cookie.trim() === '') { | |
logger.error('Cookie不能为空'); | |
resolve(); | |
return; | |
} | |
logger.info('正在验证cookie...'); | |
const result = await cookieManager.fetchNotionIds(cookie.trim()); | |
if (result.success) { | |
// 如果cookie管理器尚未初始化,先初始化 | |
if (!cookieManager.initialized) { | |
await cookieManager.initialize(cookie.trim()); | |
} else { | |
// 已初始化,直接添加到现有条目 | |
cookieManager.cookieEntries.push({ | |
cookie: cookie.trim(), | |
spaceId: result.spaceId, | |
userId: result.userId, | |
valid: true, | |
lastUsed: 0 | |
}); | |
} | |
isAddCookie = true; | |
logger.success(`Cookie添加成功! 用户ID: ${result.userId}, 空间ID: ${result.spaceId}`); | |
} else { | |
logger.error(`Cookie验证失败: ${result.error}`); | |
} | |
resolve(); | |
}); | |
}); | |
} | |
// 验证所有cookie | |
async function validateCookies() { | |
if (!cookieManager.initialized || cookieManager.cookieEntries.length === 0) { | |
logger.warning('没有可用的cookie,请先加载或添加cookie'); | |
return; | |
} | |
logger.info('开始验证所有cookie...'); | |
const originalEntries = [...cookieManager.cookieEntries]; | |
cookieManager.cookieEntries = []; | |
for (let i = 0; i < originalEntries.length; i++) { | |
const entry = originalEntries[i]; | |
logger.info(`正在验证第 ${i+1}/${originalEntries.length} 个cookie...`); | |
const result = await cookieManager.fetchNotionIds(entry.cookie); | |
if (result.success) { | |
cookieManager.cookieEntries.push({ | |
cookie: entry.cookie, | |
spaceId: result.spaceId, | |
userId: result.userId, | |
valid: true, | |
lastUsed: entry.lastUsed || 0 | |
}); | |
logger.success(`第 ${i+1} 个cookie验证成功`); | |
} else { | |
logger.error(`第 ${i+1} 个cookie验证失败: ${result.error}`); | |
} | |
} | |
logger.info(`验证完成,共 ${originalEntries.length} 个cookie,${cookieManager.cookieEntries.length} 个有效`); | |
} | |
// 删除指定cookie | |
async function removeCookie() { | |
if (!cookieManager.initialized || cookieManager.cookieEntries.length === 0) { | |
logger.warning('没有可用的cookie,请先加载或添加cookie'); | |
return; | |
} | |
// 先列出所有cookie | |
await listCookies(); | |
return new Promise((resolve) => { | |
rl.question(chalk.yellow('请输入要删除的cookie编号: '), (input) => { | |
const index = parseInt(input) - 1; | |
if (isNaN(index) || index < 0 || index >= cookieManager.cookieEntries.length) { | |
logger.error('无效的编号'); | |
resolve(); | |
return; | |
} | |
const removed = cookieManager.cookieEntries.splice(index, 1)[0]; | |
logger.success(`已删除编号 ${index + 1} 的cookie (用户ID: ${removed.userId.substring(0, 8)}...)`); | |
// 重置当前索引 | |
if (cookieManager.cookieEntries.length > 0) { | |
cookieManager.currentIndex = 0; | |
} | |
resolve(); | |
}); | |
}); | |
} | |
// 保存cookie到文件 | |
async function saveCookies() { | |
if (!cookieManager.initialized || cookieManager.cookieEntries.length === 0) { | |
logger.warning('没有可用的cookie,请先加载或添加cookie'); | |
return; | |
} | |
return new Promise((resolve) => { | |
rl.question(chalk.yellow(`请输入保存文件路径 (默认: ${DEFAULT_COOKIE_FILE}): `), (filePath) => { | |
const path = filePath.trim() || DEFAULT_COOKIE_FILE; | |
rl.question(chalk.yellow('是否只保存有效的cookie? (y/n, 默认: y): '), (onlyValidInput) => { | |
const onlyValid = onlyValidInput.toLowerCase() !== 'n'; | |
const success = cookieManager.saveToFile(path, onlyValid); | |
if (success) { | |
logger.success(`Cookie已保存到文件: ${path}`); | |
isSaveCookie = true; | |
} | |
resolve(); | |
}); | |
}); | |
}); | |
} | |
// 从文件加载cookie | |
async function loadCookies() { | |
return new Promise((resolve) => { | |
rl.question(chalk.yellow(`请输入cookie文件路径 (默认: ${DEFAULT_COOKIE_FILE}): `), async (filePath) => { | |
const path = filePath.trim() || DEFAULT_COOKIE_FILE; | |
logger.info(`正在从文件加载cookie: ${path}`); | |
const success = await cookieManager.loadFromFile(path); | |
if (success) { | |
logger.success(`成功从文件加载cookie,共 ${cookieManager.getValidCount()} 个有效cookie`); | |
} else { | |
logger.error(`从文件加载cookie失败`); | |
} | |
resolve(); | |
}); | |
}); | |
} | |
// 主函数 | |
async function main() { | |
// 显示欢迎信息 | |
console.log(chalk.cyan('\nNotion Cookie 管理工具')); | |
console.log(chalk.cyan('====================\n')); | |
// 检查是否有环境变量中的cookie | |
const envCookie = process.env.NOTION_COOKIE; | |
if (envCookie) { | |
logger.info('检测到环境变量中的NOTION_COOKIE,正在初始化...'); | |
await cookieManager.initialize(envCookie); | |
} | |
// 检查是否有环境变量中的cookie文件 | |
const envCookieFile = process.env.COOKIE_FILE; | |
if (envCookieFile && !cookieManager.initialized) { | |
logger.info(`检测到环境变量中的COOKIE_FILE: ${envCookieFile},正在加载...`); | |
await cookieManager.loadFromFile(envCookieFile); | |
} | |
// 如果没有cookie,检查默认文件 | |
if (!cookieManager.initialized && fs.existsSync(DEFAULT_COOKIE_FILE)) { | |
logger.info(`检测到默认cookie文件: ${DEFAULT_COOKIE_FILE},正在加载...`); | |
await cookieManager.loadFromFile(DEFAULT_COOKIE_FILE); | |
} | |
showHelp(); | |
// 命令循环 | |
while (true) { | |
const command = await new Promise((resolve) => { | |
rl.question(chalk.green('> '), (cmd) => { | |
resolve(cmd.trim().toLowerCase()); | |
}); | |
}); | |
switch (command) { | |
case 'help': | |
showHelp(); | |
break; | |
case 'list': | |
await listCookies(); | |
break; | |
case 'add': | |
await addCookie(); | |
break; | |
case 'validate': | |
await validateCookies(); | |
break; | |
case 'remove': | |
await removeCookie(); | |
break; | |
case 'save': | |
await saveCookies(); | |
break; | |
case 'load': | |
await loadCookies(); | |
break; | |
case 'exit': | |
case 'quit': | |
case 'q': | |
logger.info('感谢使用,再见!'); | |
rl.close(); | |
process.exit(0); | |
default: | |
logger.error(`未知命令: ${command}`); | |
logger.info('输入 "help" 查看可用命令'); | |
} | |
} | |
} | |
// 启动程序 | |
main().catch((error) => { | |
logger.error(`程序出错: ${error.message}`); | |
process.exit(1); | |
}); |