背景
因为我们的用户都喜欢通过微信群讨论的方式进行产品问题反馈,这无疑给日常的线上问题处理的效率带来极大的影响。曾经尝试对用户习惯进行线上填写方式的引导,但最终以失败告终。无奈下看看弄一个微信群监控机器人是否可行。
在之前公司我曾经用python通过itchat弄过一个群播报BI数据的机器人,但因为itcaht采用的是微信web协议,微信监控特别严,很多号都不能使用,即使登录上去了还会经常莫名掉线,极不稳定。因此这回肯定不能再通过web协议的方式来弄了。于是带着一点点期盼发现了Wechaty这个支持微信ipad协议的SDK。
Wechaty官方定义:
Wechaty是一个开源的的个人号微信机器人接口,使用Typescript构建的Node.js应用。支持多种微信接入方案,包括网页,ipad,ios,windows,android 等。同时支持 Linux, Windows, Darwin(OSX/Mac) 和 Docker 多个平台。
这里必须要重点提一下,Token 是 Wechaty 开放源代码项目中所设计和支持的一种认证技术,是句子互动公司基于 Wechaty 的 Puppet 实现插件对云服务 API 的授权账号。这也就意味着你在使用Wechaty开发基于ipad协议的机器人之前必须要先拿到可用的token。你可以从Wechaty社区申请到一个15天有效的试用Token,过了试用期后可以选择付费购买(200RMB/月)或者按照如下介绍尝试获取长期免费的Token:Wechaty Token 申请及使用文档和常见问题
Wechaty目前已经支持了Java
、Python
、Go
、PHP
等多种语言,但是该SDK原生是用TypeScript
编写的,并且github上大量的demo和开源项目都是用node.js
写的,再加上Wechaty宣称可以通过6行代码就可以实现一个机器人,于是最终决定用之前一点稚嫩的JavaScript
前端开发经验拥抱node.js
吧!
参考资料:
-
官方 API文档
-
官方demo:wechaty-getting-started
-
wechaty-puppet-padplus 示例 。
-
Wechaty社区 开源项目
通过短时间的学习和尝试后,发现基本微信机器人常用的功能实现几乎都能从这些开源的项目中直接拿到,然后再结合自己的需求再进行改装就可以了,确实开发起来挺方便的。
开发之前,首先要明确一下此次的功能需求:
-
自动聊天:群聊中通过
@[机器人]xxx
, 机器人回复问题反馈模版信息 (已完成) -
加入群聊自动欢迎:当新的小伙伴加入群聊后自动
@[新的小伙伴]
发一个文字欢迎 (已完成) -
推送机器人登陆二维码到企业微信:机器人掉线后,自动将二维码信息推送给指定企业微信群(已完成)
-
监控群聊信息:实时将聊天记录入库 (已完成)
-
自动识别问题反馈信息:自动识别判断群聊中问题反馈类信息,并收纳入问题库 (开发中)
-
群播报功:每天下班前播报问题收纳和未关闭问题情况 (未开始)
项目github地址: https://github.com/tomallv/wechat-group-chat-monitoring-robot
一、项目结构
|-- src/
|---- index.js # 入口文件
|---- config.js # 配置文件
|---- onScan.js # 机器人需要扫描二维码时监听回调
|---- onRoomJoin.js # 进入房间监听回调
|---- onMessage.js # 消息监听回调
|---- onFriendShip.js # 好友添加监听回调
|---- onDatabaseOperation.js # MySQL数据库操作回调
|---- onEnterpriseWechatBot.js # 企业微信群消息发送回调
|---- onFileIO.js # 文件读取回调
|-- package.json
二、核心包:
-
Wechaty核心包:
npm install --save wechaty
-
padplus协议包:
npm install --save wechaty-puppet-padplus
-
生成二维码:
npm install --save qrcode-terminal
三、接下来介绍几个核心代码文件
1、配置文件( src/config.js
):
module.exports = {
// puppet_padplus Token
token: "xxxxxxxxxx",
// 机器人名字
name: "xxxxxxxxxx",
// 房间/群聊
room: {
// 加入房间回复
roomJoinReply: `\n您好,欢迎您的加入,请自觉遵守群规则,文明交流! 😊\n\n如您需要反馈问题,请按照如下模版进行拷贝填写,谢谢:\n问题反馈\n[1-问题描述]:\n[2-截图信息]:\n[3-账号信息]: \n[4-操作系统]:\n[5-浏览器]:\n[6-屏幕分辨率]:\n[7-移动设备型号(APP、小程序相关问题)]:\n[8-App、小程序版本信息(APP、小程序相关问题)]:\n[9-模块信息]: A-官网前台、B-小程序、C-APP、D-句芒后台、D-学习中心、F-CRM、G-H5网页、H-老后台、I-其他`
},
// 私人
personal: {
// 好友验证自动通过关键字
addFriendKeywords: ["xxxxxx", "xxxxxxx"],
// 是否开启加群
addRoom: false
},
// mysql数据库配置信息
mysql_db: {
host: 'xxx.xxx.xxx.xxxx',
port: '3306',
user: 'xxxxxxxxxx',
password: 'xxxxxxx',
database: 'xxxxxxx',
charset : 'xxxxxxx'
},
// 要推送机器人二维码登陆信息的切页微信群webhook_key
webhook_key: "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
// 机器人登陆二维码图片文件名称
qrcode_png: "xxxxxxx.png"
}
2、入口文件( src/index.js
):
const {
Wechaty } = require("wechaty") // Wechaty核心包
const {
PuppetPadplus } = require("wechaty-puppet-padplus") // padplus协议包
const config = require("./config") // 配置文件
//初始化bot
const bot = new Wechaty({
puppet: new PuppetPadplus({
token: config.token
}),
name: config.name
})
//调用,监听,启动
const onScan = require("./onScan")
const onRoomJoin = require("./onRoomJoin"