winner12-copywriter-mcp
Version:
MCP tool for generating social media content for winner12 AI football prediction website
266 lines • 9.35 kB
JavaScript
/**
* 内容合规验证器
* 自动检查社交媒体内容是否符合平台政策和法规要求
*/
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