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

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

文章目录

  • 基于node.js实现分销类微信聊天机器人
  • 前言
  • 一、涉及技术栈
  • 二、实现代码
    • 1.登录模块
    • 2.聊天消息接收事件
  • 总结
  • git地址


前言

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


一、涉及技术栈

  1. 首先需要一个node.js的运行环境,可以是服务器也可以在你本地上挂机跑
  2. 优惠卷分销是接入的大淘客,绑定淘宝,京东等账号后可以对应的获取相关商品的优惠卷,并且成功购买后有返利
  3. 微信机器人库的话去网上一搜,很多都会让你使用微信网页端抓包搞出来的一个api库,但是这个微信网页端有使用条件,具体是啥我就不说了,反正我是不符合。最后是找到了基于pad版微信app搞出来的一个库——基于wechaty-puppet的ding-dong-talk,它的原理是模拟在pad中运行微信app,包括请求头,数据加密解密等都是反编译来的,所以微信一改就会用不了,且用且珍惜吧。

二、实现代码

1.登录模块

引入相关库,再注册对应事件
使用qrcode生成二维码,手机微信扫码登录

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事件并携带消息内容发送人等参数
我这里的逻辑是如果是我本人发送消息,则用来控制每日优惠自动发送事件,如果是其他人发送消息,则使用大淘客接口获取商品优惠卷链接并发送回去

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地址

项目代码

你可能感兴趣的:(node.js,微信,机器人)