# Sentiment Monitor

> 舆情监控与深度分析。使用 opencli 从微博/知乎/B站/小红书/抖音采集真实用户反馈，深度分析评论内容（识别反串、抽象玩梗等），生成带ECharts可视化和可点击原文链接的HTML舆情报告。

- Skill: `pbnicad/sentiment-monitor` (Agent Skill)
- Install (CLI): `npx skillmds@latest add pbnicad/sentiment-monitor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/pbnicad/sentiment-monitor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: pbnicad (https://skillmd.com/u/pbnicad)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/pbnicad/sentiment-monitor

---


# sentiment-monitor

从主流中文平台大规模采集真实舆情数据，逐条分析评论的表达方式和情感倾向，最终生成HTML报告。

## 前置：确认环境

```bash
opencli list -f json | grep -E "weibo|zhihu|bilibili|xiaohongshu|douyin"
```

以上5个平台必须可用。缺失则告知用户跳过该平台。全部为 `cookie` 策略，需要Chrome登录 + OpenCLI扩展。

## 工作流

### 步骤一：事件建模

与用户确认（缺失则主动询问）：

1. **事件关键词**：1-3个核心搜索词及2-3个变体/别称
2. **事件类型**（决定使用哪个模板的CSS主题色和专用组件）：
   - `product` → 蓝色 · 功能维度组件
   - `crisis` → 红色 · 时间线/信源追溯组件
   - `campaign` → 橙色 · KOL表格组件
   - `person` → 紫色 · 形象雷达/粉黑分列组件
   - `competitive` → 绿色 · 双栏对比/VS/偏好矩阵组件
3. **时间范围**：默认近7天
4. **监控实体**：涉及的产品/品牌/人名

### 步骤二：大规模并行采集

**目标**：总量3000条以上，单平台至少500条。扩展方法：

- **多关键词并行搜索**：主词 + 变体同时发出
- **翻页/扩大limit**：每个搜索 `--limit 50`（或该平台允许的最大值）
- **高热内容深入**：对搜索结果中互动量高的帖子采集评论：
  ```bash
  opencli weibo comments "<url>" --limit 100 -f json
  opencli bilibili comments "<url>" --limit 100 -f json
  opencli xiaohongshu comments "<url>" --limit 100 -f json
  ```
- **知乎问题深入**：
  ```bash
  opencli zhihu question <id> --limit 20 -f json
  ```

**并行采集**：5个平台的搜索命令互不依赖，全部同一批次发出。

**详细命令参考**：`references/platform-guide.md`

**重要**：每条数据保留 `url` 字段，用于报告中生成超链接。

### 步骤三：数据清洗与分析

#### 3.1 去重与过滤
- 按 `url`/`id` 去重
- 过滤空内容、字数<3的无意义内容、纯表情符号
- 标记同一账号刷屏

#### 3.2 LLM逐条分析

对每条评论标注三维标签。详细方法论见 `references/analysis-guide.md`。

**三维标签**：

| 维度 | 取值 | 含义 |
|------|------|------|
| `sentiment` | `positive` / `negative` / `neutral` | 情感极性 |
| `expression` | `literal` / `ironic` / `abstract` / `trolling` | 表达方式 |
| `topics` | 字符串数组，如 `["价格","续航"]` | 话题归因 |

**expression判断标准**：
- `literal` — 字面意思即真实态度
- `ironic` — 阴阳怪气/反讽，正面措辞+否定语境
- `abstract` — 抽象玩梗/网络黑话（如"典""绷""乐""难蚌""yyds"）
- `trolling` — 反串钓鱼，伪装立场引战

**分析Prompt模板**：见 `references/analysis-guide.md`。每批次20-30条，附带上下文。

#### 3.3 聚合统计

- 各情感/表达方式/话题的比例分布
- 按平台拆分的上述指标
- 时间分布（如有时间戳）
- Top N高频关键词

### 步骤四：构建报告

**核心原则：模板只提供CSS样式和ECharts辅助函数，不预设任何内容结构。你根据实际数据和分析结果自行决定报告包含哪些Section、什么顺序、用什么图表。**

#### 4.1 选择模板

根据事件类型读取对应HTML模板文件：
- `product` → `templates/product.html`
- `crisis` → `templates/crisis.html`
- `campaign` → `templates/campaign.html`
- `person` → `templates/person.html`
- `competitive` → `templates/competitive.html`

#### 4.2 模板中的CSS组件类名参考

以下类名在所有5个模板中均可使用。模板之间的差异仅在于 `:root{}` 中的CSS变量（`--accent`、`--accent-light`、`--accent-dark` 三色不同），以及各模板有少量的专用组件。

**布局容器**：
- `.container` — 内容区容器（max-width 1200px 居中）
- `.section` — 白色卡片容器（圆角+阴影）
- `.section-title` — section标题（底部带主题色下划线）
- `.section-desc` — section的描述文字（灰色小字）
- `.col-2` — 等宽双栏grid布局
- `.divider` — 分割线

**概览卡片**：
- `.summary-row` — 响应式卡片grid（自动换行）
- `.summary-card` — 单个概览卡片
- `.summary-card .s-label` — 卡片标签
- `.summary-card .s-value` — 卡片数值（32px粗体）
- `.summary-card .s-sub` — 卡片补充说明

**图表**：
- `.chart-row` — 响应式图表grid（双列自动换行）
- `.chart-box` — 图表容器（380px高）
- `.chart-full` — 通栏图表容器（420px高，跨所有列）
- 每个图表需要一个唯一 `id`，用 `initChart('id', option)` 初始化

**评论展示**：
- `.comment-list` — 评论列表容器（flex column，16px间距）
- `.comment-item` — 单条评论卡片
- `.comment-header` — 评论头部（作者+平台+互动数据）
- `.comment-author` — 作者名
- `.comment-stats` — 互动数据（点赞/回复数）
- `.comment-text` — 评论正文
- `.comment-tags` — 标签行（flex wrap）
- `.comment-link` — 查看原文链接（`<a>` 标签，`target="_blank"`）

**平台徽标**：
- `.platform-badge` + `.weibo` / `.zhihu` / `.bilibili` / `.xiaohongshu` / `.douyin`

**标签**：
- `.tag` + `.positive` / `.negative` / `.neutral` （情感）
- `.tag` + `.literal` / `.ironic` / `.abstract` / `.trolling` （表达方式）
- `.tag` + `.topic` （话题归因）

**策略建议**：
- `.strategy-box` — 带左边框的强调框
- `.strategy-box ul` / `.strategy-box ol` / `.strategy-box li`

**通用**：
- `.data-table` — 通用数据表格（带hover高亮）
- `.callout` + `.info` / `.warn` / `.success` — 提示框
- `.text-accent` / `.text-positive` / `.text-negative` / `.text-secondary` — 文字颜色
- `.text-sm` / `.text-lg` / `.text-xl` / `.text-bold` — 文字大小/粗细
- `.muted` — 灰色文字

**模板专用组件**：

| 模板 | 专用CSS类 |
|------|----------|
| product | `.feature-grid` `.feature-card` `.feature-bar` `.f-pos` `.f-neg` `.f-stats` |
| crisis | `.alert-bar` `.crisis-level` `.timeline` `.timeline-item` `.timeline-item.key` `.timeline-time` `.timeline-title` `.timeline-desc` `.source-tree` `.source-node` `.phase-row` `.phase-dot.active\|past\|future` `.comment-item.urgent` |
| campaign | `.kol-table` |
| person | `.person-profile` `.p-meta` `.p-name` `.p-desc` `.fb-split` `.fb-card.fans\|black\|mid` `.fb-label` `.fb-value` `.fb-sub` `.timeline` `.timeline-item` `.timeline-item.key` `.timeline-time` `.timeline-title` `.timeline-desc` |
| competitive | `.vs-header` `.vs-entity.a\|b` `.vs-divider` `.e-name` `.e-vol` `.compare-grid` `.compare-card.a\|b` `.matrix-table` `.matrix-win-a\|b\|tie` `.comment-item.entity-a\|b` `.tag.entity-a\|b` `.text-entity-a\|b` |

#### 4.3 构建流程

1. 读取选定的模板HTML文件
2. 修改 `<title>` 标签
3. 修改 `<header>` 中的标题、日期、事件徽标
4. 在 `<div class="container">` 的注释标记区域内，从零构建报告内容HTML
5. 在 `<script>` 标签底部，用 `initChart()` 初始化每个图表
6. 写入文件：`report-{事件简称}-{日期}.html`

**报告结构和内容完全由你根据数据决定**。你可以自由组合CSS类名构建任何布局，填充任何你从数据中分析得出的内容。

#### 4.4 评论展示规范

每条展示的评论必须包含：
- 平台徽标（如 `<span class="platform-badge weibo">微博</span>`）
- 脱敏作者名（首字+***+尾字，如"张***三"）
- 评论文本（保留原文包括emoji）
- 分析标签：情感标签 + 表达方式标签 + 话题标签
- 可点击超链接跳转原文：`<a class="comment-link" href="原始url" target="_blank">查看原文 →</a>`
- 互动数据（如有）：点赞数、回复数

#### 4.5 ECharts使用

```javascript
// initChart 已在模板中全局注册，接收 (domId, echartsOption)
initChart('chart-my-pie', {
  tooltip: { trigger: 'item' },
  series: [{ type: 'pie', data: [...] }]
});

// 图表会自动响应窗口resize
```

**图表类型建议**（根据数据自行选择）：
- 情感分布 → 饼图/环形图
- 时间趋势 → 折线图（smooth: true）
- 平台/话题对比 → 柱状图（bar）
- 多维对比 → 雷达图（radar）
- 关系/矩阵 → 热力图（heatmap）
- KOL效果 → 散点图（scatter）

### 步骤五：输出

1. HTML写入 `report-{事件简称}-{日期}.html`
2. 告知用户文件路径
3. 口述关键发现（3-5句话摘要）

## 参考文件

| 文件 | 何时阅读 |
|------|---------|
| `references/platform-guide.md` | 步骤二开始采集前 |
| `references/analysis-guide.md` | 步骤三开始分析评论前 |
| `templates/product.html` | 事件类型为product时 |
| `templates/crisis.html` | 事件类型为crisis时 |
| `templates/campaign.html` | 事件类型为campaign时 |
| `templates/person.html` | 事件类型为person时 |
| `templates/competitive.html` | 事件类型为competitive时 |

## 注意事项

- 不要硬编码平台命令列表，用 `opencli list -f json` 确认
- 并行采集优先，不同平台的搜索互不依赖
- 评论分析是核心价值，不要只做统计
- 超链接必须有效，可点击跳转原文
- 作者名做脱敏处理
- 不确定某评论是否反串时，标注为 `ironic`（保守标注）
- 采集量不足时不编造数据，诚实告知用户并给出原因

