女朋友竟然让我10秒内必须回复她的微信消息,看我如何用nodejs实现微信信息1s内自动回复

大家好,我是来富。
前几天刚听说小舅子谈恋爱了,这不才一个月就听说两人因为小舅子没在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小天临时授权,用魔法战胜魔法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值