#!/usr/bin/env node 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); });