UNPKG

winner12-copywriter-mcp

Version:

MCP tool for generating social media content for winner12 AI football prediction website

245 lines 9.49 kB
import { ContentTemplateGenerator } from '../templates/content-templates.js'; import { ContentComplianceValidator } from './ContentComplianceValidator.js'; /** * 统一内容处理管道 * 负责内容的AI标识添加、免责声明插入、合规验证和审计日志 */ export class ContentProcessor { static auditLogs = []; static maxLogSize = 1000; // 最大日志数量 /** * 处理内容的主要方法 */ static async processContent(rawContent, platform, options = {}) { const startTime = Date.now(); const appliedTransformations = []; try { // 1. 添加AI标识 const aiLabel = ContentTemplateGenerator.generateAILabel(platform); appliedTransformations.push('ai_label'); // 2. 插入免责声明 const disclaimer = ContentTemplateGenerator.generateDisclaimer(platform); appliedTransformations.push('disclaimer'); // 3. 构建处理后的内容 let processedContent = this.combineContent(rawContent, aiLabel, disclaimer, platform); appliedTransformations.push('content_combination'); // 4. 自动修复(如果启用) if (options.autoFix) { processedContent = this.autoFixContent(processedContent, platform); appliedTransformations.push('auto_fix'); } // 5. 合规验证 const compliance = options.enableValidation !== false ? ContentComplianceValidator.validateContent(processedContent, platform) : { isCompliant: true, violations: [], recommendations: [], score: 100, riskLevel: 'low' }; // 6. 严格模式检查 if (options.strictMode && !compliance.isCompliant) { throw new Error(`内容合规验证失败: ${compliance.violations[0]?.description || '未知错误'}`); } const processingTime = Date.now() - startTime; const result = { original: rawContent, processed: processedContent, aiLabel, disclaimer, compliance, metadata: { processingTime, appliedTransformations, finalScore: compliance.score } }; // 7. 记录审计日志 this.logContentProcessing(rawContent, platform, compliance, true); return result; } catch (error) { // 错误处理和日志记录 const errorCompliance = { isCompliant: false, violations: [{ type: 'processing_error', severity: 'critical', description: `处理失败: ${error instanceof Error ? error.message : '未知错误'}` }], recommendations: ['请检查输入内容并重试'], score: 0, riskLevel: 'critical' }; this.logContentProcessing(rawContent, platform, errorCompliance, false); throw error; } } /** * 组合内容的核心方法 */ static combineContent(content, aiLabel, disclaimer, platform) { // 根据平台特性调整组合方式 switch (platform) { case 'tiktok': return `${aiLabel}\n\n${content}\n\n${disclaimer}`; case 'twitter': // Twitter需要考虑字符限制 return `${aiLabel} ${content}\n\n${disclaimer}`; case 'youtube': return `${aiLabel}\n\n${content}\n\n${disclaimer}`; case 'instagram': case 'facebook': return `${aiLabel}\n\n${content}\n\n${disclaimer}`; default: return `${aiLabel}\n\n${content}\n\n${disclaimer}`; } } /** * 自动修复内容 */ static autoFixContent(content, platform) { let fixedContent = content; // 通用修复规则 const fixes = [ // 替换赌博用词 { pattern: /预测:/g, replacement: '分析显示:' }, { pattern: /置信度:(\d+)%/g, replacement: '数据支持度:$1%' }, { pattern: /胜率:/g, replacement: '趋势指向:' }, { pattern: /必胜/g, replacement: '数据倾向' }, { pattern: /稳赢/g, replacement: '趋势明显' }, // 移除过度营销语言 { pattern: /一定要关注/g, replacement: '欢迎关注' }, { pattern: /必须点赞/g, replacement: '点赞支持' }, // 平台特定修复 ...(platform === 'instagram' ? [ { pattern: /在评论区分享你的预测/g, replacement: '在评论区分享你的观点' } ] : []) ]; for (const fix of fixes) { fixedContent = fixedContent.replace(fix.pattern, fix.replacement); } return fixedContent; } /** * 批量处理内容 */ static async batchProcess(contents, options = {}) { const { concurrency = 5 } = options; const results = []; // 分批处理以避免过载 for (let i = 0; i < contents.length; i += concurrency) { const batch = contents.slice(i, i + concurrency); const batchPromises = batch.map(({ content, platform }) => this.processContent(content, platform, options)); const batchResults = await Promise.allSettled(batchPromises); for (const result of batchResults) { if (result.status === 'fulfilled') { results.push(result.value); } else { console.error('批量处理失败:', result.reason); } } } return results; } /** * 记录内容处理审计日志 */ static logContentProcessing(content, platform, complianceResult, approved) { const log = { timestamp: new Date().toISOString(), platform, content: content.substring(0, 200) + (content.length > 200 ? '...' : ''), complianceResult, approved }; this.auditLogs.push(log); // 限制日志大小 if (this.auditLogs.length > this.maxLogSize) { this.auditLogs.shift(); } } /** * 获取审计日志 */ static getAuditLogs(filter) { let logs = [...this.auditLogs]; if (filter) { if (filter.platform) { logs = logs.filter(log => log.platform === filter.platform); } if (filter.approved !== undefined) { logs = logs.filter(log => log.approved === filter.approved); } if (filter.startDate) { logs = logs.filter(log => log.timestamp >= filter.startDate); } if (filter.endDate) { logs = logs.filter(log => log.timestamp <= filter.endDate); } } return logs; } /** * 获取合规统计信息 */ static getComplianceStats() { const logs = this.auditLogs; const totalProcessed = logs.length; const approved = logs.filter(log => log.approved).length; const approvedRate = totalProcessed > 0 ? (approved / totalProcessed) * 100 : 0; // 计算平均评分 const totalScore = logs.reduce((sum, log) => sum + (log.complianceResult.score || 0), 0); const averageScore = totalProcessed > 0 ? totalScore / totalProcessed : 0; // 统计违规类型 const violationCounts = {}; logs.forEach(log => { if (log.complianceResult.violations) { log.complianceResult.violations.forEach((violation) => { violationCounts[violation.type] = (violationCounts[violation.type] || 0) + 1; }); } }); const topViolations = Object.entries(violationCounts) .sort(([, a], [, b]) => b - a) .slice(0, 10) .map(([type, count]) => ({ type, count })); // 平台统计 const platformStats = {}; logs.forEach(log => { if (!platformStats[log.platform]) { platformStats[log.platform] = { total: 0, approved: 0 }; } platformStats[log.platform].total++; if (log.approved) { platformStats[log.platform].approved++; } }); return { totalProcessed, approvedRate, averageScore, topViolations, platformStats: platformStats }; } /** * 清空审计日志(谨慎使用) */ static clearAuditLogs() { this.auditLogs = []; } /** * 导出审计日志为JSON */ static exportAuditLogs() { return JSON.stringify({ exportDate: new Date().toISOString(), totalLogs: this.auditLogs.length, logs: this.auditLogs }, null, 2); } /** * 验证内容而不进行处理(只读模式) */ static validateOnly(content, platform) { return ContentComplianceValidator.validateContent(content, platform); } } //# sourceMappingURL=ContentProcessor.js.map