大家好,我是来富。
前几天刚听说小舅子谈恋爱了,这不才一个月就听说两人因为小舅子没在10秒内回复女朋友微信信息导致吵架,正在闹分手,我当时听到信息都惊呆了! 什么 ,10秒?怕不是在逗我,作为程序员的我们怎么能接受这种无理要求?怎么样也得在1秒内回复女朋友信息吧,哈哈。
下面开始本文正题
本文主要讲解如何利用e小天工具来实现微信群信息接管,如何利用工具解放双手,以及如何使用nodejs与微信建立连接,让我们熟悉的nodejs发挥它本身的工具效果。
先看效果再讲内容
什么是e小天?
pc微信小助手,软件本地运行,不联网,安全可靠
本机进程管理工具,方便管理本机微信
旨在提高生产生活效率,禁止骚扰营销
这是e小天官网的介绍,针对电脑端微信辅助工具,可以通过任意程序与e小天建立websocket连接,发送相应指令即可操作微信。
访问网址https://github.com/wxext/wxext下方即可看到下载地址。点击下载安装之后运行(如下图)
有两种方式选择,一种是不以服务形式运行,一种是以服务形式运行,以服务形式运行可以做到软件退出系统照常运行,强烈建议配置方式二(启动服务 + 开机自启)
当运行状态显示:程序运行中 时,说明e小天已经启动成功。
点击下面“管理面板”按钮,进入管理面板首页。首次运行需要一点时间,请耐心等待。
进入后会显示“个人中心”界面,点击“页面展示”按钮,进行微信授权连接
请确保你的电脑上已经登录了微信,点击“连接”按钮,将微信与e小天进行连接,提示连接成功后,页面不会显示微信号、昵称、授权到期等信息(目测是系统的bug),此时刷新页面就可以看到页面上有显示您的微信号、昵称及相应的授权信息。首次连接用户需要点击去授权按钮,获得免费的开发者体验授权,目前来说e小天作者做了限制,普通用户一次只能获得一天的授权,贡献插件可以获得500积分换取一个永久额度,或者有钱的话直接500购买一个永久额度(别走,别走,兄弟,看到只能体验一天就要划走了?肯定是白嫖香啊,关注我,下期带你用白嫖)
针对首次连接的用户授权路径:
个人中心 -> 授权中心 -> 临时授权 -> 授权
当在个人中心看到有到期时间时说明已成功授权。
接下来还有最后一步,添加应用,
1、在应用中心搜索www
2、输入密钥:123按回车添加应用
3、到个人中心启动应用
如下图所示
添加成功之后就可以在个人中心首页看到有个应用的图标,如下图所示:
我这里是已经启动过了,默认是未启用的,需要点击启动。
自此,e小天的配置全部完成。
大家可以点击“个人中心->开发文档”连接更多关于e小天的内容,包括指令及配置,文档中有对e小天的所有功能进行讲解,如何连接。大家可以自行去查找api。
说明:如果有遇到需要登录的提示,大家就正常输入账号密码注册登录即可!
利用nodejs连接e小天
e小天是通过websocket进行连接通信的,所以需要依赖websocket包,这里采用的是ws npm包,具体项目目录如下截图
nodejs项目下载链接(我用阿里云盘分享了「robotWx」,你可以不限速下载复制这段内容打开「阿里云盘」App 即可获取链接:https://www.aliyundrive.com/s/CUNGKP6vV1b)
首先下载项目之后需要在config.js中配置相关信息,(前提:e小天配置成功,功能测试可以正常运行!)
配置文件config.js
//config.js
const WxHandler = require('./wx/dao/wxHandler');
//默认提示信息
const groupSuggestMsg1=`
干啥嘞,大帅哥!
`;
module.exports = {
wxRobot:{
/**
*
* 如果需要使用他人微信,需要先获取wxid,修改robotWxId,
* 机器人的微信id,在微信中可以直接看到
*/
robotWxId:" TODO 您的微信id",
/**
* 自定义群聊配置信息
* groupId 群id,通过e小天(管理面板->功能测试)可以获取群列表,找到指定群的编号即可
* id 自定义自增编号,方便其他系统发送信息至指定群聊(这里主要是为了后面与puppeteer结合使用!)
* groupNickName 机器人在当前群的昵称,用于 用户直接@
* autoAnswer 是否自动回复@本人的,默认为true即可,针对某些场景仅仅只是发送通知信息,不对用户信息进行回复的,可以设置成false
* groupSuggestMsg autoAnswer为true时并且有其他群成员@了你 默认返回的提示信息
* getResultFun @并回复了指定内容,执行操作函数
*/
groupList:[
{
groupId:" TODO 微信群的id",
id:0,
groupNickName:" TODO 本人微信群昵称",
groupName:" TODO 微信群名称(方便记忆)",
autoAnswer:true,
groupSuggestMsg:groupSuggestMsg1,
/**
*
* @param WebSocketClient ws客户端信息
* @param logger
* @param acceptMsg 接受到的微信信息
* @returns {Promise<*>}
*/
getResultFun:async function(WebSocketClient,logger,acceptMsg){
return new WxHandler(WebSocketClient,logger,acceptMsg,this).init();
}
}
]
}
}
config.js主要是针对全局的一些配置,及多个微信群的逻辑区分。
入口文件index.js
入口文件index.js是项目的启动文件,包含了websocket连接及对接收到的群信息进行逻辑处理。
重点:打开浏览器访问 http://127.0.0.1:8203/ext/www/key.ini,看是否能正常获取到key值,如果有数据返回,则表示e小天配置正确,否则,请按照上面教程,正确配置e小天!
const WebSocket = require("ws");
const axios = require("axios");
const {wxRobot:{robotWxId,groupList}} = require("../config");
const {log4js} = require("../log4");
(async () => {
const log4 = await log4js.getLogger("wxLog");
//配置好e小天之后测试一下 http://127.0.0.1:8203/ext/www/key.ini 能不能拿到name 与key值
const {data} = await axios.get("http://127.0.0.1:8203/ext/www/key.ini");
const {name, key} = data;
const WebSocketClient = new WebSocket(`ws://127.0.0.1:8202/wx?name=${name}&key=${key}`);
WebSocketClient.on("open", function () {
log4.info("与e小天服务端连接成功");
//保持websocket连接,不写应该也不会自动断开
setInterval(()=>{
WebSocketClient.send("")
},1000)
})
WebSocketClient.on("error", function (err) {
log4.error("与e小天服务端连接错误: ", err);
});
WebSocketClient.on("close", function () {
log4.warn("与e小天服务端连接断开");
});
WebSocketClient.on("message", async function (data) {
// log4.info("接收到的信息:" + data)
data = JSON.parse(data);
if (["newmsg", "xmlinfo"].indexOf(data.method) > -1) {
let sendMsg = "";
console.log(data);
/**
* fromid 来自于谁发送的信息,微信群里 自己发送的信息fromid就是自己的微信id,如果是其他群成员fromid则是群的id
* memreMark 成员配置信息
* memid 发送信息用户微信id
* msg 微信内容
* id
* toid 接受信息用户的微信id
* pid 与e小天连接的ID,单个微信可不指定,多个微信登录需要指定pid
* source 带xml格式的信息格式
* memname 发送信息的用户微信名称
*/
const {fromid, memreMark, memid, msg, id, toid, pid,source,memname} = data.data;
//只监听指定群聊信息 判断是否是指定群聊的信息
const targetGroup = groupList.filter(item=>item.groupId === fromid);
if (targetGroup.length > 0) {//是否为指定群聊
if (data.method === "newmsg") {
const {groupNickName,groupName,groupId,autoAnswer} = targetGroup[0];
const reg = /(?<=atuserlist).*?(?=atuserlist)/; //正则匹配是否有@机器人的信息
const _data = source.match(reg);
/**
* 1、微信信息中是否有@我的
* 2、对于用户仅仅只复制之前@过的微信信息,无法通过正则匹配,需要根据用户昵称来判断是@本人的内容。
* 3、针对配置了autoAnswer字段的群聊才做回复。
*/
if(((Array.isArray(_data) && _data[0] && _data[0].indexOf(robotWxId) > -1) || msg.indexOf(`@${groupNickName}`) > -1) && autoAnswer) {
//将@本人的 几个文字替换掉,找到真正发送内容
const realMsg = msg.replace(`@${groupNickName}`, "").trim(); //发送的实际内容
sendMsg = await targetGroup[0].getResultFun(WebSocketClient,log4,realMsg); //接受发送的真实内容
log4.warn(`(${groupName})回复内容:(${sendMsg.replace(/\n/g,"| ")}),回复人(${memname}),群备注昵称(${memreMark})`);
WebSocketClient.send(JSON.stringify({
"method": "sendText",
"wxid": fromid,
"msg": sendMsg,
"atid": memid,
"pid": pid
}))
}
}
} else { //不可在pc端发送,只能在移动端才会触发
log4.info("非监听群信息,不处理") //自己发送的信息method 为sendText_recv
}
}
});
})()
逻辑处理文件wxHandler.js
此份文件非必须,多个微信群建议创建多个逻辑文件。
class WxHandler {
constructor(WebSocketClient,logger, acceptMsg, groupObj) {
this.WebSocketClient = WebSocketClient;
this.logger = logger;
this.acceptMsg = acceptMsg;
this.groupObj = groupObj;//当前群组的配置信息
}
async init() {
//初始化执行方法
let sendMsg = this.groupObj.groupSuggestMsg; //默认发送信息提示信息
/**
* try catch(示例代码,可不添加try/catch)
* 为了捕获整体的错误,下面只是一个简单的例子,具体的话需要根据自己的业务场景来制定指定描述,进而实现不同的业务
*/
try {
switch (this.acceptMsg) {
case "亲一个":
sendMsg = "(*  ̄3)(ε ̄ *)"
break;
case "亲两个":
sendMsg = "(*  ̄3)(ε ̄ *)(*  ̄3)(ε ̄ *)"
break;
default:
sendMsg = "what a fuck!"
break;
}
} catch (err) {
this.logger.error(err);
sendMsg = "服务开小差了,请重试!"
}
return sendMsg;
}
}
module.exports = WxHandler;
核心文件就只有上面三个,其他都是log4js的配置及相关e小天口令的封装配置。
有了这个工具,小舅子再也不会跟女朋友吵架了!!!
nodejs只是工具,这里只是做一个简单的例子,大家可以根据自己的能力做出更加符合自己或公司业务的功能,减轻劳动力。
下一期,带你们利用puppeteer白嫖e小天临时授权,用魔法战胜魔法。