基于node.js实现分销类微信聊天机器人
前言
最近遇到了一个微信聊天机器人的需求,主要功能是自动同意好友申请,定时向微信群发送商品优惠信息,收到微信私聊信息后搜索优惠卷信息发送回去。那我作为一个前端开发,第一时间就是去找node.js的相关库了呀,经历了各种坑,总算是给他拿下
一、涉及技术栈
- 首先需要一个node.js的运行环境,可以是服务器也可以在你本地上挂机跑
- 优惠卷分销是接入的大淘客,绑定淘宝,京东等账号后可以对应的获取相关商品的优惠卷,并且成功购买后有返利
- 微信机器人库的话去网上一搜,很多都会让你使用微信网页端抓包搞出来的一个api库,但是这个微信网页端有使用条件,具体是啥我就不说了,反正我是不符合。最后是找到了基于pad版微信app搞出来的一个库——基于wechaty-puppet的ding-dong-talk,它的原理是模拟在pad中运行微信app,包括请求头,数据加密解密等都是反编译来的,所以微信一改就会用不了,且用且珍惜吧。
二、实现代码
1.登录模块
引入相关库,再注册对应事件
使用qrcode生成二维码,手机微信扫码登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import type * as PUPPET from 'wechaty-puppet' import qrcodeTerminal from 'qrcode-terminal' import { PuppetXp, } from '../src/mod.js' const puppet = new PuppetXp() puppet .on('logout', onLogout) .on('login', onLogin) .on('scan', onScan) .on('error', onError) .on('message', onMessage) function onScan (payload: PUPPET.payloads.EventScan) { if (payload.qrcode) { const qrcodeImageUrl = [ 'https://wechaty.js.org/qrcode/', encodeURIComponent(payload.qrcode), ].join('') console.info('StarterBot', 'onScan: %s(%s) - %s', payload.status, qrcodeImageUrl) qrcodeTerminal.generate(payload.qrcode, { small: true }) console.info(`[${payload.status}] ${payload.qrcode}\nScan QR Code above to log in: `) } else { console.info(`[${payload.status}]`) } }
|
2.聊天消息接收事件
接收到消息会触发onMessage事件并携带消息内容发送人等参数
我这里的逻辑是如果是我本人发送消息,则用来控制每日优惠自动发送事件,如果是其他人发送消息,则使用大淘客接口获取商品优惠卷链接并发送回去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| async function onMessage ({ messageId, }: PUPPET.payloads.EventMessage) { const { fromId, roomId, text, } = await puppet.messagePayload(messageId) if (/ding/i.test(text || '')) { await puppet.messageSendText(roomId! || fromId!, 'dong') } console.log(puppet.messagePayload(messageId)) if(fromId == 'wxid_gkc181kbu5bd22'){ if(text == '1'){ console.log("开始发送") await puppet.messageSendText('wxid_gkc181kbu5bd22', '开始发送') handleStart() } else if (text == '2') { console.log("停止发送") await puppet.messageSendText('wxid_gkc181kbu5bd22', '停止发送') hanldeEnd() } else if (text == '0'){ console.log("索引清零") await puppet.messageSendText('wxid_gkc181kbu5bd22', '索引清零') idx = 0 pageId = 0 itemList = [] } else if (text.includes('time')){ console.log("修改发送间隔",text.replace(/[^0-9]/ig, "") * 60000) await puppet.messageSendText('wxid_gkc181kbu5bd22', '修改发送间隔成功') time = text.replace(/[^0-9]/ig, "") * 60000 } else if (text.includes('idx')){ console.log("修改索引",text.replace(/[^0-9]/ig, "")) await puppet.messageSendText('wxid_gkc181kbu5bd22', '修改索引成功') idx = Number(text.replace(/[^0-9]/ig, "")) pageId = 0 itemList = [] } } else { const res = apiGetGoodsInfo(text) console.log("商品信息",res) } }
|
总结
这部分功能实现没啥问题,唯一的问题是不知道什么时候微信官方修改就会导致无法使用。
除此之外,也可以使用auto.js来对真机进行操作来实现,更稳定。
git地址
项目代码