开始第一个微信机器人
你想每天定时向你的女朋友发一句早安吗?
wechaty
是一个使用 typescript
开发的机器人,我已经使用 wechaty (opens in a new tab) 做了很多关于有趣的自动化的工作。
你可以通过 wechaty
把你的微信变成一个机器人,如果你有两个微信号的话,那就收获了一枚机器人小助手。
通过编程的手段与它接入 ChatGPT
等 AI 智能聊天助手,再将机器人拉进家族群中,那么你们家族群中就拥有一个无所不知的智能管家。
你还可以把你的常用微信号挂一个机器人,每天早上七点左右让 ChatGPT 生成不同风格的早安问候,并由机器人发送给你的女朋友,这样她就会在每天醒来时对你的问候充满期待。
哦对,忘了,程序员是没有女朋友的。
好了,来实现一个机器人吧。接下来本篇文章开始介绍微信机器人的常见使用场景,及如何用代码来把你的微信变成小助手。
加我微信前端交流群的小伙伴们知道我有一个 ChatGPT 机器人在管理着群,每天定时推送面试题,可艾特它咨询任何问题。而这个微信机器人就是我自己敲代码实现的,今天讲一讲如何实现一个简单机器人。
我将开发一个最简单的微信机器人脚手架,可使用它快速开发机器人,代码开源在 wechat-bot (opens in a new tab),欢迎试玩。
- wechat-bot (opens in a new tab):微信机器人快速开发脚手架
- wechat-chatgpt (opens in a new tab):基于 ChatGPT 的微信机器人
微信机器人应用场景及私域流量
先来瞅一眼,常见的微信操作,而这些都可以通过机器人来完成
- 消息
- 收发个人名片、文本、图片、小程序、图文消息 (更好地管理微信好友,自动添加标签)
- 转发文本、图片、小程序、图文消息 (每天定时在群中发送相关消息)
- 群组
- 建群、设置群公告、获取群二维码 (自动建群)
- 拉人、踢人,并监听相关事件 (自动拉人)
- 群列表、群详情、群成员 (自动管理群)
- 联系人
- 添加好友、自动通过好友 (根据关键词,自动同意好友,并自动拉群)
- 好友备注、详情及列表信息 (自动管理好友标签及分组)
关于机器人的应用,我总结为三个大方面
- 社群管理,根据关键字自动通过好友,对好友自动分组,添加备注并拉入相对应的群。
- 智能对话,稍微笨一点如回复资料,智能一些可以与 ChatGPT 等结合,来处理各种咨询问题
- 定时任务,每天定时定点在微信群发送行业信息促进活跃度。如果是中学高校或教育集团,可以发送昨日学员学习信息统计等
如果中小企业内部有私域流量需求并把微信群作为私域流量池,通过微信机器人的社群管理、智能对话及定时任务可加强管理效率。对于个人开发者来说,你可以通过智能对话及定时任务把它作为一个开发版的日历及通知服务。
关于这三个应用场景的技术实现,将在以下代码中涉及到
开始写第一个微信机器人
使用 wechaty (opens in a new tab) 通过几行就可以写一个具有核心功能的微信机器人
import { WechatyBuilder } from 'wechaty'
const bot = WechatyBuilder.build({
// name: 'wechat-shanyue',
puppetOptions: {
uos: true, // 开启uos协议
},
puppet: 'wechaty-puppet-wechat',
})
bot
.on('scan', (qrcode, status) => console.log(`Scan QR Code to login: ${status}\nhttps://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(qrcode)}`))
.on('message', message => console.log(`Message: ${message}`))
.start()
把以上文件存为 index.ts
,并直接 tsx index.ts
进行执行。
$ npx tsx index.ts
你可以在这里获得更全面的开发文档: <https://wechaty.js.org/>
社群管理
- 自动通过好友
- 自动拉人入群
可全局配置关键词,来决定是否自动同意添加好友。
import { Friendship } from 'wechaty'
import { Friendship as FriendshipType } from 'wechaty-puppet/types'
import config from '../config'
// 添加好友
export const handleFriendShip = async (friendship: Friendship) => {
if (friendship.type() === FriendshipType.Receive) {
if (config.acceptText.test(friendship.hello())) {
await friendship.accept()
}
}
}
智能对话
智能对话,简单来说就是你一嘴,我一嘴。与微信公众号开发自动回复差不多,你可以通过自定义关键词来回复。
在 wechat-bot (opens in a new tab) 中可通过关键词来定义不同的处理函数,并通过 filter
参数决定是否处理该关键词。
import { Message, Sayable } from 'wechaty'
import * as echo from './echo'
import * as fund from './fund'
type Route = {
handle: ((text: string, msg: Message) => Sayable) | ((text: string, msg: Message) => Promise<Sayable>)
keyword: string | RegExp
filter?: (msg: Message) => boolean | Promise<boolean>
}
export const routes: Route[] = [
{
keyword: '/ping',
handle() {
return 'pong'
},
},
{ keyword: '基金', handle: fund.handle },
{
keyword: '',
handle: echo.handle,
// 仅仅是一个示例
// 仅仅对名称为 山月 的人,进行原样输出对话
filter(msg) {
return msg.talker().name() === '山月'
},
},
]
定时任务
定时任务应该是社群运营中最常使用的功能之一了,如下
- 每日九点统计群活跃度信息
- 每日十点群发每日资讯。结合公众号可以群发公众号内图文信息,为企业内公众号甚至C端产品进行促活
- 每日十点向微信群管理人员发送网站运营数据,如 UV/IP,活跃用户数,新增用户数,新增付费 (此类功能可用邮件及钉钉机器人替代,各有优劣)
- 备忘录提醒功能,如每日十点半运营复盘大会
当然,对于个人来说,也可以做一做每日两点半股票基金推荐的消息推送等等有趣的功能。
关于定时任务代码如下,使用了一个简单的非分布式的定时任务库 node-cron (opens in a new tab)。
在 wechat-bot (opens in a new tab) 中 schedule/*
中的程序,可自动注册并根据配置的 Cron 表达式自动执行。
// schedule/interview.ts
import { Wechaty } from 'wechaty'
import { CronJob } from 'cron'
export default async (bot: Wechaty) => {
return new CronJob('0 9 * * *', async () => {
const rooms = await bot.Room.findAll({ topic: /学习/ })
for (const room of rooms) {
if (room.owner().name().includes('山月')) {
await room.say('早安')
}
}
}, null, true, 'Asia/Shanghai')
}
异常处理
异常处理在某种程度上比应用系统更加重要,不然有可能应用挂掉了 N 天都不知道。
sentry
是一个关于异常上报的系统,并且提供完善的 SDK
及文档,通过 sentry
可以对机器人添加警报着重监听以下事件。
- 自动捕捉
unhandledPromiseRejection
异常 - 监控
bot.on('error')
事件并报告异常
Sentry.init({
dsn
})
bot.on('error', (error) => {
Sentry.captureException(error)
})
最后记着开通了 Sentry
的 Alerts,不然异常爆满了都收不到邮件。
总结
通过 wechaty
开发机器人可以很轻松实现以下功能并作为私域流量管理,并扩展来更多的好玩的有趣的事儿
- 社群管理
- 智能对话
- 定时任务