手把手教你用 Wechaty 搭建聊天机器人:从安装到实战
从零开始搭建一个具备消息监听、自动回复、群欢迎和关键词触发能力的聊天机器人。学完可独立完成可部署的 Bot,应用于智能客服、群管通知等真实场景,支持 Node.js 与 Docker 双环境运行。

作为后端开发,你大概率遇到过这种需求:业务群里每天有成百上千条重复问题,回复到手软;又或是想做一个定时推送通知的助手,但微信没有官方 Bot API,自己抓协议又怕封号。用 up Wechaty,才发现原来「写个微信机器人」这件事,可以简单到只写 6 行代码。
Wechaty 是一个开源的 Conversational RPA SDK,把微信、WhatsApp 等聊天平台的底层协议细节封装好了,你不需要关心协议逆向,只需要专注业务逻辑。它支持 TypeScript/JavaScript,用同一套代码可以跑在 Node.js 或 Docker 里。这篇带你从零开始,一步步搞出一个能自动回复、管理群的消息机器人。
前置条件
开工之前,确认环境满足这些要求:
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| Node.js | 16+ | Wechaty 底层依赖较新的 ES 模块特性 |
| npm | 7+ | 依赖管理和包解析 |
推荐用 nvm 管理 Node 版本:
bash
nvm install 16
nvm use 16
node -v
Wechaty 重度使用现代 ES Module 特性,Node 14 及以下会遇到 import/export 解析报错。
快速上手:6 行代码跑通第一个 Bot
初始化项目
bash
mkdir my-wechaty-bot && cd my-wechaty-bot
npm init -y
npm install wechaty
在独立目录操作,避免与已有项目产生版本冲突。
创建入口文件
新建 bot.js:
javascript
import { WechatyBuilder } from 'wechaty'
const wechaty = WechatyBuilder.build()
wechaty
.on('scan', (qrcode, status) => {
const url = `https://wechaty.js.org/qrcode/${encodeURIComponent(qrcode)}`
console.log(`请扫码登录!状态:${status}\n二维码链接:${url}`)
})
.on('login', (user) => console.log(`✅ 登录成功,欢迎回来:${user}`))
.on('message', (msg) => console.log(`📨 收到消息:${msg}`))
wechaty.start()
核心事件拆解:
- scan:弹出二维码,扫码登录。
qrcode拼上官网 URL 可浏览器查看 - login:扫码确认后触发,拿到登录账号信息
- message:收到消息(私聊、群消息均触发)时调用
- start():启动 Bot,初始化 Puppet 并开始监听
运行
bash
node bot.js
终端打印二维码链接,浏览器打开用扫码。登录后,任何消息都会打印在终端。
默认使用 Puppeteer(Web 微信协议),部分账号有限制。登录失败时后续会教切换协议。
实战:智能客服 + 群管机器人
光打印消息不够实用,下面写一个能真正干活的机器人:
- 私聊自动回复常见问题
- 新人入群自动欢迎
- 群内关键词触发功能列表
完整代码
新建 smart-bot.js:
javascript
import { WechatyBuilder } from 'wechaty'
const FAQ = {
'价格': '服务分基础版(免费)和专业版(99元/月)。',
'退款': '支持7天无理由退款,请在订单页面提交申请。',
'帮助': '回复关键词:价格、退款、联系方式。'
}
const wechaty = WechatyBuilder.build({
name: 'smart-customer-bot'
})
wechaty.on('scan', (qrcode, status) => {
const url = `https://wechaty.js.org/qrcode/${encodeURIComponent(qrcode)}`
console.log(`📱 请扫码登录!\n状态:${status}\n链接:${url}`)
})
wechaty.on('login', async (user) => {
console.log(`🎉 登录成功!账号:${user.name()}`)
await user.say('🤖 智能客服已上线!')
})
wechaty.on('message', async (msg) => {
if (msg.self()) return
const text = msg.text()
const from = msg.from()
// 私聊自动回复
if (!msg.room() && from) {
for (const [keyword, reply] of Object.entries(FAQ)) {
if (text.includes(keyword)) {
await msg.say(reply)
return
}
}
await msg.say('🤖 暂无法识别,回复「帮助」查看问题列表。')
}
// 群内互动
if (msg.room()) {
const room = msg.room()
const roomName = await room.topic()
if (text.includes('帮助') || text === 'help') {
const helpMsg = `📋 功能列表:
1. 回复「价格」查看报价
2. 回复「退款」了解流程
3. 回复「联系人工」转客服`
await room.say(helpMsg)
}
}
})
wechaty.on('room-join', async (room, inviteeList, inviter) => {
const roomName = await room.topic()
const inviteeNames = inviteeList.map(c => c.name()).join('、')
const inviterName = inviter?.name() || '未知用户'
const welcomeMsg = `👋 欢迎 @${inviteeNames} 加入【${roomName}】!\n回复「帮助」查看功能列表。`
await room.say(welcomeMsg)
})
wechaty.start()
设计要点
| 模块 | 作用 |
|---|---|
FAQ 字典 |
关键词→回复映射,生产环境可替换为数据库或大模型调用 |
msg.self() |
过滤 Bot 自己发出的消息,防止循环触发 |
msg.room() |
区分私聊(空)和群聊(有值),群对象可调用 room.say() |
room-join |
新人入群自动欢迎,适合大群管理 |
room.say() |
支持 @昵称 自动处理提及逻辑 |
常见问题与踩坑
1. Web 协议登录失败
Error: login failed 是常见报错,微信对 Web 端登录做了限制。切换到其他 Puppet:
bash
## Linux/macOS
export WECHATY_PUPPET=wechaty-puppet-service
## Windows (PowerShell)
$env:WECHATY_PUPPET="wechaty-puppet-service"
wechaty-puppet-service 基于 iPad/Windows 协议,稳定性好,需申请 Token。
2. import 语句报错
报错 SyntaxError: Cannot use import statement outside a module,在 package.json 加:
json
{
"type": "module"
}
3. 封号风险防控
频繁自动回复可能被判定为异常:
- 加随机延时:
await new Promise(r => setTimeout(r, Math.random() * 2000 + 1000)) - 设置上限:记录当日回复次数,到阈值停止
- 优先 @ 回复:用
msg.mentionSelf()判断,只回复被 @ 的消息
4. Docker 部署
bash
docker run -ti --rm --volume="$(pwd)":/bot wechaty/wechaty smart-bot.js
自动挂载执行,扫码链接端打印。
总结
回顾完整路径:
npm init+npm install wechaty搭环境- 6 行代码跑通扫码登录+消息监听
- 智能客服 Bot 覆盖私聊回复、群欢迎、关键词识别
- 解决 Web 限制、ES Module 报错、封号风险
下一步可深入:
- 接入大模型:FAQ 替换为 OpenAI/Claude API
- 插件化:用
WechatyPlugin拆分欢迎语、定时任务 - 数据持久化:MongoDB/PostgreSQL 存聊天记录做分析
- CI/CD:GitHub Actions + Docker 自动部署
23000+ Stars 的开源项目、覆盖多平台、6 行代码就能跑,值得花一个下午试一下。动手写,永远比看十篇文章有用。