用 OpenClaw + 微信机器人,自动拉群、回复、统计——一个私域运营小助手的实现
最近帮几个朋友做私域自动化,发现很多团队还在手动拉人进群、手动回复重复问题、手动统计活动数据。其实这套流程完全可以自动化,而且不需要花钱买 SaaS。
今天分享一个用 OpenClaw 加微信机器人搭建私域运营小助手的完整教程。跟着做,你也能实现三个核心功能:
◦ 用户加好友后自动拉入对应群
◦ 群里常见问题自动回复,复杂问题转人工
◦ 关键行为自动记录,数据可导出
一、理解整体工作流程
在动手之前,先搞清楚系统是怎么跑的:
微信机器人监听事件 → 传给编排层 → 匹配规则 → 执行动作 → 返回微信执行
微信机器人负责耳朵和嘴巴(监听和发送),编排层负责大脑(判断该做什么),数据库负责记性(存用户和记录)。
需要准备的东西:
◦ 一台服务器(2C4G 起步,Linux 或 macOS 都行)
◦ 一个企业微信(推荐)或个人微信号
◦ Node.js 环境(v18 以上)
◦ 一个数据库(SQLite 就够)
二、搭建环境
2.1 安装 Node.js
如果没有 Node.js,先安装:
Ubuntu: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs macOS: brew install node
验证是否装好:
node -v # 应该看到 v18.x.x 或更高
2.2 初始化项目
mkdir wechat-operator cd wechat-operator npm init -y npm install wechaty@latest npm install better-sqlite3 npm install node-cron
2.3 项目结构
wechat-operator/ ├── index.js # 入口文件 ├── db.js # 数据库 ├── config.js # 配置 ├── skills/ │ ├── auto-invite.js # 自动拉群 │ ├── auto-reply.js # 自动回复 │ └── stats.js # 自动统计 └── rules/ └── reply-rules.json
三、配置数据库
用 SQLite,零配置。创建 db.js:
const Database = require('better-sqlite3'); const path = require('path'); const db = new Database(path.join(__dirname, 'data.db')); db.exec(` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, wxid TEXT UNIQUE NOT NULL, name TEXT NOT NULL, group_id TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS invite_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, wxid TEXT NOT NULL, name TEXT NOT NULL, group_id TEXT NOT NULL, invited_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS activity_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, wxid TEXT NOT NULL, name TEXT NOT NULL, group_id TEXT, activity TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); `); module.exports = db;
跑一下 node db.js 就会自动创建 data.db 文件,三张表就有了。
四、实现自动拉群
这是使用频率最高的功能。流程:用户加好友 → 自动通过 → 发送引导 → 用户回复关键词 → 拉入指定群。
在 skills/auto-invite.js 中写入:
const db = require('../db'); async function onFriend(contact) { await contact.say( `欢迎 ${contact.name}!\n` + `回复关键词加入对应的群:\n` + `1、回复“技术” → 技术交流群\n` + `2、回复“项目” → 项目合作群\n` + `3、回复“资源” → 资源分享群` ); db.prepare('INSERT OR REPLACE INTO users (wxid, name) VALUES (?, ?)') .run(contact.id, contact.name()); } async function onMessage(msg) { const keywordMap = { '技术': { id: 'xxx', name: '技术交流群' }, '项目': { id: 'xxx', name: '项目合作群' }, '资源': { id: 'xxx', name: '资源分享群' } }; const room = keywordMap[msg.text().trim()]; if (!room) return null; const target = await msg.room(room.id); if (target) { await target.add(msg.from()); await msg.say('✔️ 已拉你进入「' + room.name + '」'); } return true; } module.exports = { onFriend, onMessage };
注意:个人号拉群有限频,一天超过 30 个就有风控风险。建议直接用企业微信。
五、实现自动回复
这是见效最快的功能。核心是一个关键词匹配引擎,不需要上大模型。
先建 rules/reply-rules.json,运营同学可以直接编辑:
[ { "keywords": ["怎么报名", "如何报名", "报名方式"], "reply": "报名链接:xxx.com/signup" }, { "keywords": ["价格", "多少钱", "费用"], "reply": "基础版 199 元/月,专业版 499 元/月" }, { "keywords": ["你好", "在吗", "hello"], "reply": "你好!请问有什么可以帮你的?" }, { "keywords": ["人工", "客服"], "reply": "已通知客服人员,请稍等..." } ]
匹配引擎 skills/auto-reply.js:
const fs = require('fs'); const path = require('path'); function loadRules() { return JSON.parse( fs.readFileSync(path.join(__dirname, '../rules/reply-rules.json'), 'utf-8') ); } function match(text) { const rules = loadRules(); let best = null, bestLen = 0; for (const rule of rules) { for (const kw of rule.keywords) { if (text.includes(kw) && kw.length > bestLen) { best = rule; bestLen = kw.length; } } } return best; } async function onMessage(msg) { const rule = match(msg.text()); if (!rule) return null; await msg.say(rule.reply); return true; } module.exports = { onMessage };
20 条规则就能覆盖 70% 的重复问题。规则引擎简单可靠,改个 JSON 就能更新。
小建议:留一条“人工”关键词,命中后转接到真人客服。用户找不到真人时体验会很差。
六、实现自动统计
这是最容易被忽略但最有价值的功能。skills/stats.js:
const db = require('../db'); const cron = require('node-cron'); async function recordActivity(msg) { const keywords = ['已报名', '已完成', '参与成功']; for (const kw of keywords) { if (msg.text().includes(kw)) { db.prepare('INSERT INTO activity_log (wxid, name, group_id, activity) VALUES (?, ?, ?, ?)') .run(msg.from().id, msg.from().name(), msg.room() ? msg.room().id : null, kw); break; } } } function setupDailyReport(adminRoom) { cron.schedule('0 9 * * *', () => { const rows = db.prepare(` SELECT group_id, COUNT(DISTINCT wxid) as users, COUNT(*) as actions FROM activity_log WHERE timestamp >= datetime('now', '-1 day') GROUP BY group_id `).all(); let report = '昨日活动报告\n'; for (const row of rows) { report += row.group_id + ':' + row.users + ' 人,' + row.actions + ' 次\n'; } adminRoom.say(report); }); } module.exports = { recordActivity, setupDailyReport };
用法:在管理群发送 #导出数据 之类的指令,调用导出函数生成 CSV 文件,机器人直接发到群里。
七、串联起来跑
最后编写 index.js 入口文件:
const { WechatyBuilder } = require('wechaty'); const autoInvite = require('./skills/auto-invite'); const autoReply = require('./skills/auto-reply'); const stats = require('./skills/stats'); const bot = WechatyBuilder.build({ name: 'operator-bot', puppet: 'wechaty-puppet-service', puppetOptions: { token: 'your_token_here' } }); bot.on('friendship', async (friendship) => { if (friendship.type() === bot.Friendship.Type.Receive) { await friendship.accept(); await autoInvite.onFriend(friendship.contact()); } }); bot.on('message', async (msg) => { const handlers = [autoInvite.onMessage, autoReply.onMessage]; for (const handler of handlers) { if (await handler(msg)) break; } await stats.recordActivity(msg); }); bot.start().then(() => console.log('机器人已启动'));
运行:
node index.js
看到“机器人已启动”就说明成功了。
八、部署和运维
如何选账号
◦ 企业微信:最稳定,有官方 API,不易被风控,需要企业认证
◦ 个人号 wechaty:功能灵活但易被风控,需购买 puppet 服务
◦ 个人号 hook:成本最低但稳定性差,不推荐生产环境
自己折腾用个人号 wechaty 就够了。正式服务客户直接上企业微信。
长期运行
◦ 用 pm2 管理进程:npm install -g pm2 && pm2 start index.js
◦ 配置重启自动化:pm2 save && pm2 startup
◦ 建议每天重启一次,避免微信连接超时断开
数据安全
◦ 不要存完整聊天记录,只存关键事件
◦ 用户数据定期清理,保留 90 天就够了
◦ 用独立微信号做机器人,别用自己的主号
九、小结
整套方案搭下来,核心代码不到 200 行。不需要大模型,不需要复杂架构,纯粹的确定性逻辑就能解决 70% 的重复运营工作。
把运营流程拆成“事件 → 规则 → 动作”三段式,每一段都可配置。想加新功能,加新 skill 文件就行,不用改主体逻辑。
试水的话,一个周末就能跑通。
夜雨聆风