winner12-copywriter-mcp
Version:
MCP tool for generating social media content for winner12 AI football prediction website
245 lines • 9.49 kB
JavaScript
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