Skill: tujinsama/social-matrix-manager-claw (version 1.0.0)

--- name: social-matrix-manager-claw description: | 自媒体矩阵管家虾 — 多账号自媒体矩阵的统一调度中心。监控数据、分析互动、检测异常、生成日报。 **当以下情况时使用此 Skill**： (1) 需要汇总多个自媒体账号（抖音/小红书/视频号/B站/微博）的运营数据 (2) 需要生成矩阵日报，标出异常账号 (3) 需要检测爆款内容（播放量超均值N倍）并推送预警 (4) 需要监控账号健康状态（限流、封禁、数据下滑） (5) 需要分析评论区舆情（负面词汇、投诉预警） (6) 需要生成内容排期建议或跨账号复用建议 (7) 用户提到"矩阵数据"、"账号汇总"、"多账号"、"自媒体监控"、"粉丝互动"、"爆款预警"、"账号健康"、"内容排期"、"矩阵日报"、"平台数据"、"涨粉分析"、"评论监控"、"限流检测"、"矩阵运营" --- # 自媒体矩阵管家虾 多账号自媒体矩阵的统一调度中心。核心定位：**看数据、报异常、给建议**，不负责内容创作和发布。 ## 输入格式 ### 结构化输入（推荐） 用户提供 CSV/Excel 文件，必填字段： | 字段名 | 说明 | |--------|------| | `account_name` | 账号名称 | | `platform` | 平台（douyin/xiaohongshu/shipinhao/bilibili/weibo） | | `account_id` | 账号 ID | | `plays` | 昨日播放量 | | `likes` | 昨日点赞数 | | `comments` | 昨日评论数 | | `shares` | 昨日分享数 | | `new_fans` | 昨日涨粉数 | | `total_fans` | 当前总粉丝数 | | `avg_plays_30d` | 近30日日均播放量 | 可选字段：`consecutive_decline_days`（连续下滑天数）、`risk_signal`（风险信号描述）、`owner`（负责人） ### 自然语言输入 直接描述需求，引导用户提供数据文件或手动输入关键数据。 ## 核心工作流 ### 1. 数据分析（有数据文件时） 将用户提供的数据文件保存到 workspace，运行分析脚本： ```bash python3 scripts/analyze_matrix.py <数据文件.csv> [--viral-threshold 3.0] [--decline-days 3] [--output report.md] ``` 脚本输出包含：矩阵总览、异常预警、账号明细表格。 ### 2. 异常检测逻辑 - **爆款预警**：`viral_score = 当日播放 / 30日均值 ≥ 3x`（可调） - **数据下滑**：连续 ≥3 天下降 - **账号风险**：`risk_signal` 字段非空（限流/封禁等） - **负面舆情**：评论数据中负面词占比 > 10%（参考 `references/sentiment-keywords.md`） ### 3. 报告生成与推送 分析完成后： 1. 将报告内容整理为飞书友好格式（Markdown） 2. 用 `feishu_create_doc` 创建云文档，或直接在对话中输出 3. 如需推送到群聊，配合 `message` 工具发送 ### 4. 内容排期建议 当用户要求排期时： - 询问各账号历史最佳发布时间（或从数据中推断） - 结合内容类型标签（参考 `references/content-taxonomy.md`） - 生成本周发布计划表格 ## 参考资料 - **指标定义与健康基准值** → `references/platform-metrics.md`（异常阈值配置也在此） - **内容分类与爆款特征** → `references/content-taxonomy.md` - **舆情关键词库** → `references/sentiment-keywords.md` ## 与其他 Skill 的协作 | 场景 | 配合的 Skill | |------|-------------| | 爆款内容二次创作 | `video-script-writer-claw` | | 预警推送到多渠道 | `cross-platform-messenger-claw` | | 深度月度复盘 | `auto-data-analysis-claw` | | 生成正式报告文件 | `financial-report-render-claw` | ## 注意事项 - 平台 API 数据通常 T+1，实时数据需用户手动导出 - 账号数量 > 50 时建议分批处理，避免脚本超时 - 情感分析基于关键词，复杂语境可能误判，仅供参考 - 不支持直接操作账号（发布/删除内容）

path: references/content-taxonomy.md
content: # 内容分类与标签体系

## 内容类型标签

| 类型 | 标签 | 特征描述 |
|------|------|----------|
| 干货教程 | `tutorial` | 步骤清晰、有实操价值 |
| 娱乐搞笑 | `entertainment` | 轻松幽默、情绪价值高 |
| 产品种草 | `product` | 展示产品、引导购买 |
| 活动促销 | `promotion` | 限时优惠、活动信息 |
| UGC互动 | `ugc` | 用户参与、话题挑战 |
| 知识科普 | `knowledge` | 专业内容、权威背书 |
| 生活记录 | `vlog` | 真实日常、情感共鸣 |

## 爆款内容特征提取规则

爆款内容通常具备以下特征（满足3条以上即为潜在爆款）：
1. 前3秒有强钩子（问题/冲突/反常识）
2. 标题含数字或对比词
3. 评论区有大量提问或求链接
4. 收藏率 > 互动率均值的2倍
5. 发布后6小时内播放量超过账号均值

## 跨账号内容复用建议逻辑

当某账号出现爆款内容时，按以下逻辑判断是否推荐复用：
1. 内容类型是否适合其他账号的定位
2. 目标受众是否有重叠（避免同质化竞争）
3. 爆款系数 > 5x 时，优先推荐同类型账号复制
4. 复用建议：改编角度、更换封面、调整文案风格


path: references/platform-metrics.md
content: # 平台数据指标手册

## 核心指标定义

| 指标 | 计算方式 | 说明 |
|------|----------|------|
| 互动率 | (点赞+评论+分享) / 播放量 × 100% | 衡量内容吸引力 |
| 播放完成率 | 完播次数 / 播放次数 × 100% | 衡量内容留存 |
| 涨粉率 | 新增粉丝 / 原有粉丝 × 100% | 衡量账号增长 |
| 爆款系数 | 当日播放量 / 近30日日均播放量 | 识别爆款内容 |

## 各平台健康基准值

### 抖音
- 互动率正常范围：1%–5%（万粉以上账号）
- 播放完成率正常范围：30%–60%
- 日均涨粉率正常范围：0.1%–1%

### 小红书
- 互动率正常范围：3%–10%
- 收藏率正常范围：1%–5%
- 日均涨粉率正常范围：0.05%–0.5%

### 视频号
- 互动率正常范围：1%–4%
- 分享率正常范围：0.5%–2%

### B站
- 互动率正常范围：2%–8%
- 投币率正常范围：0.5%–3%

### 微博
- 互动率正常范围：0.5%–3%
- 转发率正常范围：0.1%–1%

## 异常阈值配置（可自定义）

```yaml
# 爆款预警：播放量超过近30日均值的倍数
viral_threshold: 3x

# 数据下滑预警：连续下降天数
decline_days: 3

# 负面舆情预警：负面评论占比
negative_ratio: 0.1  # 10%

# 账号风险：互动率骤降幅度
engagement_drop: 0.5  # 跌幅超过50%
```


path: references/sentiment-keywords.md
content: # 舆情关键词库

## 负面词汇库（高风险，需立即预警）

### 投诉类
质量差、假货、骗人、退款、维权、投诉、举报、欺骗、虚假宣传、货不对板

### 情绪类
垃圾、恶心、失望、后悔、坑、骗局、黑心、无良、差评、踩雷

### 风险类
封号、限流、违规、下架、删除、举报成功

## 正面词汇库（高价值信号）

### 种草类
好用、推荐、必买、回购、安利、种草、真香、绝了、yyds

### 购买意向类
求链接、在哪买、多少钱、怎么购买、有没有优惠、求同款

### 互动类
学到了、有用、收藏了、转发给朋友、@了某人

## 行业定制词库扩展

在 SKILL.md 中引导用户提供行业特定词汇，例如：
- 美妆行业：成分党、敏感肌、烂脸、过敏
- 食品行业：变质、异味、食品安全、拉肚子
- 教育行业：退课、退费、效果差、没用

## 情感分析规则

- 单条评论含 ≥2 个负面词 → 标记为高风险
- 同一内容负面评论占比 > 10% → 触发舆情预警
- 同一内容正面购买意向词出现 > 20次 → 标记为高转化内容


path: scripts/analyze_matrix.py
content: #!/usr/bin/env python3
"""
social-matrix-manager-claw: 自媒体矩阵数据分析核心脚本
用途：解析账号数据（CSV/Excel），计算指标，检测异常，生成日报
"""

import sys
import json
import csv
import argparse
from datetime import datetime, timedelta
from pathlib import Path


def load_data(file_path: str) -> list[dict]:
    """加载账号数据文件（CSV 格式）"""
    path = Path(file_path)
    if not path.exists():
        print(f"[ERROR] 文件不存在: {file_path}", file=sys.stderr)
        sys.exit(1)

    rows = []
    with open(path, encoding="utf-8-sig") as f:
        reader = csv.DictReader(f)
        for row in reader:
            rows.append(row)
    return rows


def calc_metrics(row: dict) -> dict:
    """计算单账号核心指标"""
    try:
        plays = float(row.get("plays", 0) or 0)
        likes = float(row.get("likes", 0) or 0)
        comments = float(row.get("comments", 0) or 0)
        shares = float(row.get("shares", 0) or 0)
        new_fans = float(row.get("new_fans", 0) or 0)
        total_fans = float(row.get("total_fans", 1) or 1)
        avg_plays_30d = float(row.get("avg_plays_30d", 0) or 0)

        engagement_rate = (likes + comments + shares) / plays * 100 if plays > 0 else 0
        fan_growth_rate = new_fans / total_fans * 100 if total_fans > 0 else 0
        viral_score = plays / avg_plays_30d if avg_plays_30d > 0 else 0

        return {
            "engagement_rate": round(engagement_rate, 2),
            "fan_growth_rate": round(fan_growth_rate, 4),
            "viral_score": round(viral_score, 2),
        }
    except (ValueError, ZeroDivisionError):
        return {"engagement_rate": 0, "fan_growth_rate": 0, "viral_score": 0}


def detect_anomalies(row: dict, metrics: dict, config: dict) -> list[str]:
    """检测异常并返回预警列表"""
    alerts = []
    viral_threshold = config.get("viral_threshold", 3.0)
    decline_days = config.get("decline_days", 3)

    if metrics["viral_score"] >= viral_threshold:
        alerts.append(f"🔥 爆款预警：播放量是30日均值的 {metrics['viral_score']:.1f} 倍")

    consecutive_decline = int(row.get("consecutive_decline_days", 0) or 0)
    if consecutive_decline >= decline_days:
        alerts.append(f"📉 数据下滑：已连续 {consecutive_decline} 天下降")

    if row.get("risk_signal", "").strip():
        alerts.append(f"⚠️ 账号风险：{row['risk_signal']}")

    return alerts


def generate_report(data: list[dict], config: dict) -> str:
    """生成矩阵日报文本"""
    today = datetime.now().strftime("%Y-%m-%d")
    lines = [f"# 自媒体矩阵日报 {today}\n"]

    total_plays = 0
    total_new_fans = 0
    anomaly_accounts = []
    viral_accounts = []

    account_rows = []
    for row in data:
        metrics = calc_metrics(row)
        alerts = detect_anomalies(row, metrics, config)
        plays = float(row.get("plays", 0) or 0)
        new_fans = float(row.get("new_fans", 0) or 0)
        total_plays += plays
        total_new_fans += new_fans

        if alerts:
            anomaly_accounts.append((row.get("account_name", "未知"), alerts))
        if metrics["viral_score"] >= config.get("viral_threshold", 3.0):
            viral_accounts.append(row.get("account_name", "未知"))

        account_rows.append({
            "name": row.get("account_name", "未知"),
            "platform": row.get("platform", "-"),
            "plays": int(plays),
            "new_fans": int(new_fans),
            "engagement_rate": metrics["engagement_rate"],
            "viral_score": metrics["viral_score"],
            "alerts": alerts,
        })

    # 汇总
    lines.append(f"## 📊 矩阵总览")
    lines.append(f"- 账号总数：{len(data)} 个")
    lines.append(f"- 总播放量：{int(total_plays):,}")
    lines.append(f"- 总涨粉数：{int(total_new_fans):,}")
    lines.append(f"- 异常账号：{len(anomaly_accounts)} 个")
    lines.append("")

    # 异常预警
    if anomaly_accounts:
        lines.append("## 🚨 异常预警")
        for name, alerts in anomaly_accounts:
            lines.append(f"\n**{name}**")
            for alert in alerts:
                lines.append(f"  - {alert}")
        lines.append("")

    # 账号明细
    lines.append("## 📋 账号明细")
    lines.append("| 账号 | 平台 | 播放量 | 涨粉 | 互动率 | 爆款系数 | 状态 |")
    lines.append("|------|------|--------|------|--------|----------|------|")
    for r in account_rows:
        status = "🔥 爆款" if r["viral_score"] >= config.get("viral_threshold", 3.0) else \
                 "⚠️ 异常" if r["alerts"] else "✅ 正常"
        lines.append(
            f"| {r['name']} | {r['platform']} | {r['plays']:,} | "
            f"{r['new_fans']:,} | {r['engagement_rate']}% | "
            f"{r['viral_score']:.1f}x | {status} |"
        )

    return "\n".join(lines)


def main():
    parser = argparse.ArgumentParser(description="自媒体矩阵数据分析")
    parser.add_argument("file", help="账号数据 CSV 文件路径")
    parser.add_argument("--viral-threshold", type=float, default=3.0,
                        help="爆款预警阈值（默认3倍均值）")
    parser.add_argument("--decline-days", type=int, default=3,
                        help="连续下滑预警天数（默认3天）")
    parser.add_argument("--output", help="输出报告文件路径（不填则打印到终端）")
    args = parser.parse_args()

    config = {
        "viral_threshold": args.viral_threshold,
        "decline_days": args.decline_days,
    }

    data = load_data(args.file)
    report = generate_report(data, config)

    if args.output:
        Path(args.output).write_text(report, encoding="utf-8")
        print(f"[OK] 报告已保存到: {args.output}")
    else:
        print(report)


if __name__ == "__main__":
    main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)