celsius的个人博客

星星之火可以燎原

0%

基于node.js实现分销类微信聊天机器人

基于node.js实现分销类微信聊天机器人


前言

最近遇到了一个微信聊天机器人的需求,主要功能是自动同意好友申请,定时向微信群发送商品优惠信息,收到微信私聊信息后搜索优惠卷信息发送回去。那我作为一个前端开发,第一时间就是去找node.js的相关库了呀,经历了各种坑,总算是给他拿下


一、涉及技术栈

  1. 首先需要一个node.js的运行环境,可以是服务器也可以在你本地上挂机跑
  2. 优惠卷分销是接入的大淘客,绑定淘宝,京东等账号后可以对应的获取相关商品的优惠卷,并且成功购买后有返利
  3. 微信机器人库的话去网上一搜,很多都会让你使用微信网页端抓包搞出来的一个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, // 发送人id
roomId, // 发送群群id
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地址

项目代码