从0到1:用OpenClaw搭建自动化舆情监控系统
本文详细记录了如何利用OpenClaw AI Agent框架,从零搭建一套完整的舆情监控系统,实现对小红书、抖音等多平台的自动化监控、分析和报告生成。
背景
在数字化时代,舆情监控对于商业街区、品牌企业、政府机构都至关重要。传统的舆情监控需要专人每天浏览各大平台、筛选信息、整理报告,不仅耗时耗力,还容易遗漏重要信息。
OpenClaw作为一款开源的AI Agent框架,为我们提供了一个全新的解决方案:让AI Agent自动完成这些重复性工作。本文将分享我使用OpenClaw搭建舆情监控系统的完整实践过程。
系统架构
整体架构分为三个核心模块:
┌─────────────────────────────────────────────────────────────┐
│ OpenClaw Main Agent │
│ (任务调度中心) │
└─────────────────────┬───────────────────────────────────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 数据采集模块 │ │ 分析处理模块 │ │ 报告发送模块 │
│ (Playwright) │ │ (AI分析) │ │ (飞书/邮件) │
└───────────────┘ └───────────────┘ └───────────────┘
│ │ │
▼ ▼ ▼
小红书/抖音 内容分类 HTML报告
数据抓取 敏感度评估 自动推送
技术选型
- AI Agent框架:OpenClaw(开源、本地优先、支持多渠道)
- 爬虫引擎:Playwright(支持动态页面、反检测能力强)
- 分析模型:GLM-4(中文理解能力强、成本可控)
- 消息推送:飞书群 + SMTP邮件
- 定时调度:OpenClaw Cron
核心实现
1. 数据采集模块
数据采集是整个系统的基础。我们使用Playwright进行浏览器自动化,实现对小红书、抖音等平台的搜索和数据抓取。
关键技术点
浏览器连接模式
由于抖音、小红书等平台风控严格,我们需要复用已登录的浏览器会话,而不是每次都启动新浏览器:
// 使用CDP协议连接已有浏览器
const browser = await chromium.connectOverCDP('http://localhost:9222');
const contexts = browser.contexts();
const page = contexts[0].pages()[0];
这种方式有几个优势:
- 复用已登录状态,无需反复扫码
- 减少被检测为自动化脚本的风险
- 保持用户行为特征,更难被封禁
时间筛选策略
平台的时间筛选功能往往不稳定,我们实现了双重策略:
// 主策略:URL参数直接筛选
await page.goto(`https://www.douyin.com/search/${keyword}?type=video&publish_time=1`);
// 备用策略:选择器点击
if (!url.includes('publish_time=1')) {
await page.click('[data-e2e="search-filter"]');
await page.click('[data-e2e="filter-time-1day"]');
}
窗口前置问题
跨平台操作时,窗口焦点问题经常被忽略但至关重要:
// 切换平台时必须前置窗口
await page.bringToFront();
不执行这行代码,点击操作可能发送到错误的窗口,导致采集失败。
到底检测
判断是否已加载所有数据,避免无限滚动:
// 抖音:检测底部提示文字
const noMoreText = await page.evaluate(() => {
return document.body.innerText.includes('暂时没有更多了');
});
// 小红书:连续无新数据检测
let noNewCount = 0;
while (scrollCount < maxScrolls && noNewCount < 2) {
// 滚动...
if (currentCount === prevCount) {
noNewCount++;
}
}
2. 分析处理模块
采集到的数据需要经过智能分析,提取有价值的信息。
舆情分级体系
我们设计了一套四级舆情分类体系:
| 级别 | 标识 | 说明 | 示例 |
|---|---|---|---|
| HIGH | 🔴 | 敏感舆情 | 投诉、事故、纠纷 |
| MEDIUM | 🟡 | 热点内容 | 热门视频、讨论 |
| LOW | 🟢 | 商业活动 | 优惠、开业、活动 |
| NORMAL | ⚪ | 普通内容 | 日常分享、打卡 |
内容相关性过滤
小红书搜索结果常包含大量推荐内容,需要过滤:
const RELATED_WORDS = [
'熙街', '大学城', '川美', '沙坪坝',
'避雷', '投诉', '纠纷', '事故'
];
function isRelevant(title) {
return RELATED_WORDS.some(word => title.includes(word));
}
数据合并与去重
每日多次运行时,需要合并数据但避免重复:
// 只合并当天数据
if (isToday(existingReport.date)) {
mergedVideos = [...existingVideos, ...newVideos];
// 按videoId去重
mergedVideos = uniqueBy(mergedVideos, 'videoId');
}
3. 报告发送模块
分析结果需要及时推送给相关人员。
飞书群推送
使用飞书开放API实现消息推送:
async function sendToFeishu(report) {
const message = {
msg_type: 'interactive',
card: {
header: {
title: { tag: 'plain_text', content: `熙街舆情日报 ${report.date}` }
},
elements: [
{
tag: 'div',
fields: [
{ is_short: true, text: { tag: 'lark_md', content: `**抖音**\n${report.douyin.total}条` } },
{ is_short: true, text: { tag: 'lark_md', content: `**小红书**\n${report.xiaohongshu.total}条` } }
]
}
]
}
};
await fetch(FEISHU_WEBHOOK, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(message)
});
}
HTML邮件报告
详细报告通过邮件发送,使用HTML模板:
const emailTemplate = `
<!DOCTYPE html>
<html>
<head>
<style>
.card { background: #f5f5f5; padding: 15px; border-radius: 8px; margin: 10px 0; }
.high { border-left: 4px solid #ff4444; }
.medium { border-left: 4px solid #ffaa00; }
</style>
</head>
<body>
<h1>熙街舆情日报</h1>
<div class="card">
<h3>📊 数据统计</h3>
<p>抖音:${report.douyin.total}条 | 小红书:${report.xiaohongshu.total}条</p>
</div>
<!-- 敏感内容列表 -->
</body>
</html>
`;
部署与运维
定时任务配置
使用OpenClaw的Cron功能设置每日定时任务:
openclaw cron create xijie-morning-monitor \
--expr "30 8 * * *" \
--timezone "Asia/Shanghai"
浏览器启动
由于需要复用浏览器会话,Chrome需要以调试模式启动:
google-chrome --remote-debugging-port=9222 \
--user-data-dir=~/.chrome-debug &
监控与告警
系统会自动检测浏览器状态,未启动时发送告警:
async function checkBrowser() {
try {
await fetch('http://localhost:9222/json');
return true;
} catch {
await sendAlert('Chrome未启动,请远程启动浏览器');
return false;
}
}
实战效果
经过两个月的实际运行,系统表现稳定:
| 指标 | 数值 |
|---|---|
| 日均采集 | 100-200条 |
| 敏感舆情识别率 | 95%+ |
| 误报率 | <5% |
| 人工干预次数 | 0次 |
典型案例
-
商户投诉预警:系统及时发现某餐饮店的食品安全投诉,管理方在舆情发酵前介入处理。
-
价格战监测:发现多家商户的价格竞争信息,为运营决策提供数据支持。
-
热点事件追踪:某网红打卡点爆火,系统第一时间捕捉到相关内容。
踩坑经验
1. 搜索框内容污染
问题:连续搜索多关键词时,搜索框内容没有正确更新,导致结果错误。
解决:搜索后验证搜索框内容,不匹配则自动修正:
const searchBoxValue = await page.$eval('input[type="text"]', el => el.value);
if (searchBoxValue !== keyword) {
await page.evaluate((kw) => {
const input = document.querySelector('input[type="text"]');
input.value = '';
input.focus();
input.value = kw;
input.dispatchEvent(new Event('input', { bubbles: true }));
}, keyword);
await page.keyboard.press('Enter');
}
2. 断点续传
问题:长时间任务中断后,需要重新开始,浪费时间。
解决:实现状态保存和恢复:
// 保存进度
function saveProgress(douyinIndex, xhsIndex) {
fs.writeFileSync('state.json', JSON.stringify({
douyinIndex,
xhsIndex,
timestamp: Date.now()
}));
}
// 恢复进度
function loadProgress() {
if (fs.existsSync('state.json')) {
return JSON.parse(fs.readFileSync('state.json'));
}
return { douyinIndex: 0, xhsIndex: 0 };
}
3. AV1编码视频处理
问题:部分视频使用AV1编码,ffmpeg -c:v copy 不支持。
解决:使用GPU编码重新编码:
ffmpeg -i input.webm -c:v h264_nvenc -preset default -c:a copy output.mp4
扩展思考
这套系统的核心思路可以迁移到多个场景:
- 品牌口碑监控:将关键词改为品牌名称,即可监控品牌舆情
- 竞品分析:监控竞争对手的营销活动和用户反馈
- 行业趋势:追踪特定行业的热门话题和创新点
- 政务舆情:政府部门用于民意收集和舆情预警
总结
通过OpenClaw搭建舆情监控系统,我们实现了:
- 自动化:从手动浏览到自动采集,效率提升10倍以上
- 智能化:AI分析替代人工筛选,准确率更高
- 实时性:每日定时运行,信息获取更及时
- 低成本:无需购买昂贵的舆情服务,只需API调用费用
OpenClaw作为AI Agent框架,其价值不仅在于技术能力,更在于让AI能够"真正干活",完成端到端的工作流程。这种"Agentic AI"的范式,正在改变我们与AI交互的方式——从"问答式"到"委托式",从"建议"到"执行"。
作者简介:专注于AI Agent应用开发,正在探索OpenClaw在更多场景的落地实践。
相关链接:
- OpenClaw官网:openclaw.ai
- ClawHub技能市场:clawhub.ai
- 项目源码:请联系作者获取
本文首发于InfoQ,转载请注明出处。