article-writer-cn
Version:
AI 驱动的智能写作系统 - 专注公众号/自媒体文章创作
102 lines • 3.5 kB
JavaScript
/**
* 文档爬取命令 - CLI 接口
*/
import { CrawlerManager } from '../crawler/crawler-manager.js';
import { getPresetConfig } from '../crawler/config.js';
import path from 'path';
import fs from 'fs-extra';
export class ResearchDocsCommand {
/**
* 执行文档爬取
*/
async execute(options) {
try {
// 验证参数
this.validateOptions(options);
// 确定输出目录
const outputDir = options.output || path.join(process.cwd(), '_knowledge_base');
await fs.ensureDir(outputDir);
// 构建爬取选项
const crawlOptions = {
name: options.name,
url: options.url,
pdfPath: options.pdf,
outputDir,
useDynamic: options.dynamic,
maxPages: options.maxPages,
concurrency: options.concurrency
};
// 如果使用预设配置
if (options.preset) {
const preset = getPresetConfig(options.preset);
if (preset) {
console.log(`📦 使用预设配置: ${options.preset}`);
if (preset.maxPages)
crawlOptions.maxPages = preset.maxPages;
if (preset.baseUrl && !crawlOptions.url)
crawlOptions.url = preset.baseUrl;
}
else {
console.warn(`⚠️ 未找到预设配置: ${options.preset}`);
}
}
// 自动检测是否需要动态爬取
if (options.url && !options.dynamic) {
if (CrawlerManager.isDynamicSite(options.url)) {
console.log(`💡 检测到可能是动态网站,建议使用 --dynamic 参数`);
}
}
// 执行爬取
const manager = new CrawlerManager();
const result = await manager.executeCrawl(crawlOptions);
if (result) {
console.log(`\n🎉 文档爬取成功!`);
process.exit(0);
}
else {
console.error(`\n❌ 文档爬取失败`);
process.exit(1);
}
}
catch (error) {
console.error(`\n❌ 错误: ${error.message}`);
if (error.stack) {
console.error(error.stack);
}
process.exit(1);
}
}
/**
* 验证选项
*/
validateOptions(options) {
if (!options.name) {
throw new Error('必须提供项目名称 (--name)');
}
if (!options.url && !options.pdf) {
throw new Error('必须提供 URL (--url) 或 PDF 文件路径 (--pdf)');
}
if (options.url && options.pdf) {
throw new Error('不能同时提供 URL 和 PDF 文件路径');
}
if (options.pdf && !fs.existsSync(options.pdf)) {
throw new Error(`PDF 文件不存在: ${options.pdf}`);
}
if (options.url) {
try {
new URL(options.url);
}
catch {
throw new Error(`无效的 URL: ${options.url}`);
}
}
}
}
/**
* 导出便捷函数
*/
export async function researchDocs(options) {
const command = new ResearchDocsCommand();
await command.execute(options);
}
//# sourceMappingURL=research-docs.js.map