UNPKG

winner12-copywriter-mcp

Version:

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

266 lines 9.35 kB
/** * 内容合规验证器 * 自动检查社交媒体内容是否符合平台政策和法规要求 */ export class ContentComplianceValidator { static GAMBLING_WORDS = [ '预测', '胜率', '投注', '下注', '押注', '博彩', '赌球', '盈利', '赚钱', '稳赚', '必胜', '包赢', '保本' ]; static DIRECT_PREDICTION_PATTERNS = [ /预测[::]\s*\w+/, /置信度[::]\s*\d+%/, /胜率[::]\s*\d+%/, /必胜/, /稳赢/, /包赢/ ]; static ENGAGEMENT_BAIT_PATTERNS = [ /在评论区.*预测/, /分享.*你的预测/, /猜猜.*结果/, /评论.*答案/, /点赞.*支持/ ]; static AI_LABEL_PATTERNS = [ /\[🤖\s*(AI生成|AI分析)\]/, /🤖.*AI.*生成/, /此内容由.*AI.*生成/, /AI算法.*生成/ ]; static DISCLAIMER_PATTERNS = [ /仅供.*参考/, /不构成.*建议/, /理性.*观赛/, /远离赌博/, /娱乐.*参考/ ]; /** * 验证内容合规性 */ static validateContent(content, platform, config) { const violations = []; const startTime = Date.now(); // 1. 检查赌博相关语言 violations.push(...this.checkGamblingLanguage(content)); // 2. 检查AI内容标识 violations.push(...this.checkAILabeling(content)); // 3. 检查免责声明 violations.push(...this.checkDisclaimer(content)); // 4. 检查直接预测内容 violations.push(...this.checkDirectPredictions(content)); // 5. 检查互动诱导 violations.push(...this.checkEngagementBait(content)); // 6. 平台特定检查 violations.push(...this.checkPlatformSpecific(content, platform)); // 计算合规评分 const score = this.calculateComplianceScore(violations); const riskLevel = this.determineRiskLevel(violations); const recommendations = this.generateRecommendations(violations); const processingTime = Date.now() - startTime; return { isCompliant: violations.length === 0, violations, recommendations, score, riskLevel }; } /** * 检查赌博相关语言 */ static checkGamblingLanguage(content) { const violations = []; for (const word of this.GAMBLING_WORDS) { if (content.includes(word)) { violations.push({ type: 'gambling_language', severity: this.getGamblingWordSeverity(word), description: `包含赌博相关词汇: "${word}"`, suggestion: `建议替换为中性表述,如"分析"、"数据洞察"等` }); } } return violations; } /** * 检查AI内容标识 */ static checkAILabeling(content) { const hasAILabel = this.AI_LABEL_PATTERNS.some(pattern => pattern.test(content)); if (!hasAILabel) { return [{ type: 'missing_ai_label', severity: 'critical', description: '缺少AI生成内容标识', suggestion: '在内容开头添加明确的AI标识,如"[🤖 AI生成内容]"' }]; } return []; } /** * 检查免责声明 */ static checkDisclaimer(content) { const hasDisclaimer = this.DISCLAIMER_PATTERNS.some(pattern => pattern.test(content)); if (!hasDisclaimer) { return [{ type: 'missing_disclaimer', severity: 'high', description: '缺少免责声明', suggestion: '添加免责声明,如"⚠️ 仅供娱乐参考,不构成投注建议"' }]; } return []; } /** * 检查直接预测内容 */ static checkDirectPredictions(content) { const violations = []; for (const pattern of this.DIRECT_PREDICTION_PATTERNS) { if (pattern.test(content)) { violations.push({ type: 'direct_prediction', severity: 'high', description: `包含直接预测表述: ${pattern.source}`, suggestion: '改为分析倾向表述,如"数据显示可能..."' }); } } return violations; } /** * 检查互动诱导 */ static checkEngagementBait(content) { const violations = []; for (const pattern of this.ENGAGEMENT_BAIT_PATTERNS) { if (pattern.test(content)) { violations.push({ type: 'engagement_bait', severity: 'medium', description: `包含互动诱导内容: ${pattern.source}`, suggestion: '改为自然的讨论邀请,避免预测导向的互动' }); } } return violations; } /** * 平台特定检查 */ static checkPlatformSpecific(content, platform) { const violations = []; switch (platform) { case 'tiktok': // TikTok对直接预测内容最为严格 if (content.includes('预测:') || content.includes('置信度:')) { violations.push({ type: 'direct_prediction', severity: 'critical', description: 'TikTok平台禁止直接预测内容', suggestion: '改为数据分析和教育内容' }); } break; case 'twitter': // Twitter对长推文串中的重复预测敏感 const predictionCount = (content.match(/预测|置信度/g) || []).length; if (predictionCount > 2) { violations.push({ type: 'excessive_marketing', severity: 'medium', description: '推文串中预测内容过多', suggestion: '减少预测词汇频次,增加分析讨论' }); } break; case 'instagram': // Instagram对engagement bait检查更严格 if (content.includes('评论区') && content.includes('预测')) { violations.push({ type: 'engagement_bait', severity: 'high', description: 'Instagram禁止预测导向的评论诱导', suggestion: '改为分享观赛体验的邀请' }); } break; } return violations; } /** * 获取赌博词汇的严重程度 */ static getGamblingWordSeverity(word) { const criticalWords = ['投注', '下注', '押注', '博彩', '赌球', '必胜', '包赢']; const highWords = ['预测', '胜率', '盈利', '稳赚']; if (criticalWords.includes(word)) return 'critical'; if (highWords.includes(word)) return 'high'; return 'medium'; } /** * 计算合规评分 (0-100) */ static calculateComplianceScore(violations) { if (violations.length === 0) return 100; const severityWeights = { critical: 30, high: 20, medium: 10, low: 5 }; const totalPenalty = violations.reduce((sum, violation) => { return sum + severityWeights[violation.severity]; }, 0); return Math.max(0, 100 - totalPenalty); } /** * 确定风险等级 */ static determineRiskLevel(violations) { if (violations.some(v => v.severity === 'critical')) return 'critical'; if (violations.some(v => v.severity === 'high')) return 'high'; if (violations.some(v => v.severity === 'medium')) return 'medium'; if (violations.length > 0) return 'low'; return 'low'; } /** * 生成改进建议 */ static generateRecommendations(violations) { const recommendations = new Set(); for (const violation of violations) { if (violation.suggestion) { recommendations.add(violation.suggestion); } } // 通用建议 if (violations.length > 3) { recommendations.add('建议全面审查内容,确保符合平台政策要求'); } return Array.from(recommendations); } /** * 快速合规检查(用于生产环境) */ static quickCheck(content, platform) { const result = this.validateContent(content, platform); const criticalIssues = result.violations .filter(v => v.severity === 'critical') .map(v => v.description); return { isCompliant: criticalIssues.length === 0, criticalIssues }; } } //# sourceMappingURL=ContentComplianceValidator.js.map