需求
看到别人有微信机器人, 自己也想拥有一个,那就开发一个。
主要功能
- 自动通过好友验证
- 当有人添加机器人时,判断验证消息关键字后通过或直接通过
- 通过验证后自动回复并介绍机器人功能
- 私聊关键字回复
- 例如回复 加群 推送群列表
- 回复 群名 推送群聊邀请,
- 自动聊天
- 群聊中通过 @[机器人]xxx 或以娜美 开头 就可以和机器人聊天
- 私聊发送消息即可聊天
- 加入群聊自动欢迎
- 当新的小伙伴加入群聊后自动 @[新的小伙伴] 发一个文字欢迎
- 定时任务
- 群聊中,每日定时推送新闻或其他信息。
开源项目 wechaty-puppet-wechat 和 wechaty
之前由于微信 web 端的限制,通过 基于iPad 协议的 wechaty-puppet-padplus 做过一个机器人,但是这个包是需要 token 的,200元/月。
对于不能使用网页版微信的用户非常友好。
- 使用这个包需要
Token。 - 可以将JuziBOT Inc的工作人员(微信编号:botorange_yeah)添加为微信好友。添加后,您将收到一份审查表。如果您通过审查并愿意在Wechaty中写博客,则可以免费使用iPad协议(为期15天的免费Token)!
- 想要获取长期有效的免费token,那就参加所谓的开源激励计划,就是在15天后,需要提交一个MVP(最小可行化产品)的Github仓库,Wechaty会将其fork到社区中的同时,会提供一个一年免费的Token。
由于wechaty的升级,现已支持所有微信登录,就算你的微信之前不能登录web版,现在也可以用了。
开始打造自己的机器人
说干就干
先上 源码
建项目装依赖
mkdir nami // 创建 nami 文件夹
cd nami
npm init -y
核心包
npm i wechaty wechaty-puppet-padplus
windows 下安装 wechaty-puppet-padplus 出错,如让配置 python 环境变量 或 找不到 Visual Studio 时。
可通过 admin 权限 打开 powershell 执行
npm i --global --production windows-build-tools
然后切换 node 版本 10.x 再次 执行
npm i wechaty-puppet-padplus
还需要用到qrcode-terminal这个包,作用就是将二维码输出在终端来供我们扫码登录
npm install qrcode-terminal
配置文件
所谓的配置文件就是一些常量。后期可以通过添加后台管理系统, 动态修改。
config.js
/*
* @Author: Ace
* @Date: 2020-03-08 16:31:25
* @Description: 配置项
*/
module.exports = {
// puppet_padplus Token
token: "puppet_padplus_your_token", // 换上你自己的 token
// 机器人名字
name: "Nami",
// 房间/群聊
room: {
// 管理群组列表
roomList: {
// 群名(用于展示,最好是群名,可随意) : 群id(这个可不能随意)
前端真好玩儿: "前端真好玩儿"
},
// 加入房间回复
roomJoinReply: `\n 你好,欢迎你的加入,请自觉遵守群规则,文明交流,最后,请向大家介绍你自己! \n\n Hello, welcome to join, please consciously abide by the group rules, civilized communication, finally, please introduce yourself to everyone!😊`
},
// 私人
personal: {
// 好友验证自动通过关键字
addFriendKeywords: ["加群", "前端"],
// 是否开启加群
addRoom: true
},
task: {
taskName: '发送新闻',
roomId: '',
url: 'http://api.tianapi.com/internet/index?key=apikey&num=10',
time: '8:0:0', // /h/m/s
date: ''
}
}
加入后台管理后希望是这样的。加上数据库动态更改常用配置(网上图片,如有侵权,可联系删除)。
入口
index.js
/*
* @Author: Ace
* @Date: 2020-03-08 16:31:25
* @Description: wechaty-puppet-padplus入口程序
*/
const { Wechaty } = require("wechaty") // Wechaty核心包
const { PuppetPadplus } = require("wechaty-puppet-padplus") // padplus协议包
const config = require("./config") // 配置文件
const onScan = require("./onScan") // 机器人需要扫描二维码时监听回调
const onRoomJoin = require("./onRoomJoin") // 加入房间监听回调
const onMessage = require("./message/index") // 消息监听回调
const onFriendShip = require("./onFriendShip") // 好友添加监听回调
// 初始化
const bot = new Wechaty({
puppet: new PuppetPadplus({
token: config.token
}),
name: config.name
})
// 接下来一段链式调用,监听,启动
bot
.on("scan", onScan) // 机器人需要扫描二维码时监听
.on("room-join", onRoomJoin) // 加入房间监听
.on("message", onMessage(bot)) // 消息监听 // 有些消息需要用到 wechaty 实例所以传入 bot
.on("friendship", onFriendShip) // 好友添加监听
.start()
message
逻辑比较多的就是 message 部分了, 所以 message 单独建了一个文件夹。
首先对接聊天接口
很简单,就是一个 API, 参数就是聊天的文本。
安装依赖
npm i axios urlencode
msg_reply.js
/*
* @Author: Ace
* @Date: 2020-03-08 16:31:25
*/
/**
* @description 机器人请求接口 处理函数
* @param {String} info 发送文字
* @return {Promise} 相应内容
*/
const request = require("axios")
// 请求参数解码
const urlencode = require("urlencode")
const { task, name } = require('../config')
const { getNow } = require('../utils')
function msgReply(info) {
let url = `https://open.drea.cc/bbsapi/chat/get?keyWord=${urlencode(info)}`
return request.get(url).then(res => {
if (res.status == 200) {
if (res.data.isSuccess) {
let reply = res.data.data.reply
// 免费的接口,所以需要把机器人名字替换成为自己设置的机器人名字
reply = reply.replace(/Smile/g, name)
return reply
} else {
if (res.code == 1010) {
return "没事别老艾特我,我还以为爱情来了"
} else {
return "你在说什么,我听不懂"
}
}
} else {
return "你在说什么,我脑子有点短路诶!"
}
})
}
// 定时任务, 早上8点在群里发送科技新闻(接口用的是天行api)
async function taskApiSync() {
const { time, fullDate } = getNow()
if (task.time === time) {
const news = await request.get(task.url).then(res => {
if (res.status === 200) {
return `${fullDate}\r\n\r\n${res.data.newslist.map((news, i) => `${i + 1}. ${news.title}`).join('\r\n')}\r\n新闻详情查看:`
}
})
return news
}
return ''
}
module.exports = {
msgReply,
taskApiSync
}
分支处理接收到的信息
-
消息来自自己, 直接返回
-
消息来自 群聊
- 以 娜美 开头的消息直接对接机器人自动回复。
- @ 机器人的消息 直接对接机器人 自动回复。(每次和机器人聊天还要@机器人还是挺麻烦的, 以娜美开头来聊天吧)
- 其他群聊消息直接无视
-
消息 来自私聊
- 指定关键字回复(引导加群,加群欢迎等)
- 其他聊天内容对接机器人自动回复
其他
像加群回调,添加好友回调都比较简单。可以把代码拉下来简单看看。
另外可以加 nami 为好友进行体验。回复'加群',拉你进前端群