需求
看到别人有微信机器人, 自己也想拥有一个,那就开发一个。
主要功能
- 自动通过好友验证
- 当有人添加机器人时,判断验证消息关键字后通过或直接通过
- 通过验证后自动回复并介绍机器人功能
- 私聊关键字回复
- 例如回复 加群 推送群列表
- 回复 群名 推送群聊邀请,
- 自动聊天
- 群聊中通过 @[机器人]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版,现在也可以用了。
开始打造自己的机器人
以我的机器人为例:
- fork 一份代码
- clone 到本地
- node -v // 最好 v14 以上
- npm i
- node index
- 扫码登录就可以了, 默认只接入了天行api。这样你的微信就有自动回复功能了。
配置文件
所谓的配置文件就是一些常量。后期可以通过添加后台管理系统, 动态修改。
config.js
/*
* @Author: Ace
* @Date: 2020-03-08 16:31:25
* @Description: 配置项
*/
module.exports = {
NAME: " ",
NICKNAME: " ",
MEMORIAL_DAY: " ",
CITY: "",
SENDDATE: "", //定时发送时间 每天17点19分0秒发送,规则见 /schedule/index.js
TXAPIKEY: "你自己的天行apikey", // http://api.tianapi.com/txapi/one/index?key= 此处须填写个人申请的天行apikey,请替换成自己的 申请地址https://www.tianapi.com/signup.html?source=474284281
// 高级功能配置项(非必填项)
AUTOREPLY: true, //自动聊天功能 默认开启, 关闭设置为: false
DEFAULTBOT: "0", //设置默认聊天机器人 0 天行机器人 1 图灵机器人 2 天行对接的图灵机器人,需要到天行机器人官网充值(50元/年,每天1000次)
AUTOREPLYPERSON: [""], //指定多个好友开启机器人聊天功能 指定好友的备注,最好不要带有特殊字符
TULINGKEY: "图灵机器人apikey", //图灵机器人apikey,需要自己到图灵机器人官网申请,并且需要认证
}
复制代码
入口
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
async function onMessage(msg, bot) {
const contact = msg.talker(); // 发消息人
const content = msg.text().trim(); // 消息内容
const room = msg.room(); // 是否是群消息
const alias = (await contact.alias()) || (await contact.name()); // 发消息人备注
const isText = msg.type() === bot.Message.Type.Text;
if (msg.self()) {
return;
}
if (room && isText) {
// 如果是群消息 目前只处理文字消息
const topic = await room.topic();
console.log(
`群名: ${topic} 发消息人: ${await contact.name()} 内容: ${content}`
);
} else if (isText) {
if (content) {
let reply;
if (config.DEFAULTBOT == "0") {
// 天行聊天机器人逻辑
reply = await superagent.getReply(content);
console.log("天行机器人回复:", reply);
} else if (config.DEFAULTBOT == "1") {
// 图灵聊天机器人
reply = await superagent.getTuLingReply(content);
console.log("图灵机器人回复:", reply);
} else if (config.DEFAULTBOT == "2") {
// 天行对接的图灵聊
reply = await superagent.getTXTLReply(content);
console.log("天行对接的图灵机器人回复:", reply);
}
try {
await delay(2000);
await contact.say(reply);
} catch (e) {
console.error(e);
}
}
// }
}
}
复制代码
getReply 方法
// 天行聊天机器人
async function getReply(word) {
let url = TXHOST + "robot/";
let content = await superagent.req({
url,
method: "GET",
params: {
key: config.TXAPIKEY, // 配置文件中的 apikey, 需要自己申请的
question: word,
mode: 1,
datatype: 0,
userid: uniqueId,
},
});
if (content.code === 200) {
let res = content.newslist[0];
let response = "";
if (res.datatype === "text") {
response = res.reply;
} else if (res.datatype === "view") {
response = `虽然我不太懂你说的是什么,但是感觉很高级的样子,因此我也查找了类似的文章去学习,你觉得有用吗<br>《${content.newslist[0].title}》${content.newslist[0].url}`;
} else {
response =
"你太厉害了,说的话把我难倒了,我要去学习了,不然没法回答你的问题";
}
return response;
} else {
return "我好像迷失在无边的网络中了,你能找回我么";
}
}
复制代码
分支处理接收到的信息
-
消息来自自己, 直接返回
-
消息来自 群聊
- 以 娜美 开头的消息直接对接机器人自动回复。
- @ 机器人的消息 直接对接机器人 自动回复。(每次和机器人聊天还要@机器人还是挺麻烦的, 以娜美开头来聊天吧)
- 其他群聊消息直接无视
-
消息 来自私聊
- 指定关键字回复(引导加群,加群欢迎等)
- 其他聊天内容对接机器人自动回复
独乐乐不如众乐乐
由于各种原因还是有一部分人不能愉快的拥有自己的机器人
- 不会 node 开发
- 没有自己的服务器(只能本地玩玩)
- 不是开发人员
所以我做了一下升级 只需扫一扫就能拥有自己的微信机器人
参考
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END