微信小助手 -- 娜美

823 阅读5分钟

需求

看到别人有微信机器人, 自己也想拥有一个,那就开发一个。

主要功能

  • 自动通过好友验证
    • 当有人添加机器人时,判断验证消息关键字后通过或直接通过
    • 通过验证后自动回复并介绍机器人功能
  • 私聊关键字回复
    • 例如回复 加群 推送群列表
    • 回复 群名 推送群聊邀请,
  • 自动聊天
    • 群聊中通过 @[机器人]xxx 或以娜美 开头 就可以和机器人聊天
    • 私聊发送消息即可聊天
  • 加入群聊自动欢迎
    • 当新的小伙伴加入群聊后自动 @[新的小伙伴] 发一个文字欢迎
  • 定时任务
    • 群聊中,每日定时推送新闻或其他信息。

开源项目 wechaty-puppet-wechat 和 wechaty

之前由于微信 web 端的限制,通过 基于iPad 协议的 wechaty-puppet-padplus 做过一个机器人,但是这个包是需要 token 的,200元/月。

对于不能使用网页版微信的用户非常友好。

  1. 使用这个包需要 Token
  2. 可以将JuziBOT Inc的工作人员(微信编号:botorange_yeah)添加为微信好友。添加后,您将收到一份审查表。如果您通过审查并愿意在Wechaty中写博客,则可以免费使用iPad协议(为期15天的免费Token)!
  3. 想要获取长期有效的免费token,那就参加所谓的开源激励计划,就是在15天后,需要提交一个MVP(最小可行化产品)的Github仓库,Wechaty会将其fork到社区中的同时,会提供一个一年免费的Token。

由于wechaty的升级,现已支持所有微信登录,就算你的微信之前不能登录web版,现在也可以用了。

开始打造自己的机器人

  • 可以直接按照官网的快速开始,对照着api 自己开发。
  • 直接拉取我现成的例子,简单改改,变成自己的机器人。

说干就干

先上 源码

建项目装依赖

mkdir nami  // 创建 nami 文件夹

cd nami

npm init -y

核心包

npm i wechaty wechaty-puppet-padplus

windows 下安装 wechaty-puppet-padplus 出错,如让配置 python 环境变量 或 找不到 Visual Studio 时。

可通过 admin 权限 打开 powershell 执行

 npm i --global --production windows-build-tools

然后切换 node 版本 10.x 再次 执行

npm i wechaty-puppet-padplus

还需要用到qrcode-terminal这个包,作用就是将二维码输出在终端来供我们扫码登录

npm install qrcode-terminal

官方文档上手

配置文件

所谓的配置文件就是一些常量。后期可以通过添加后台管理系统, 动态修改。

config.js

/*
 * @Author: Ace
 * @Date: 2020-03-08 16:31:25
 * @Description: 配置项
 */

module.exports = {
  // puppet_padplus Token
  token: "puppet_padplus_your_token",  // 换上你自己的 token
  // 机器人名字
  name: "Nami",
  // 房间/群聊
  room: {
    // 管理群组列表
    roomList: {
      // 群名(用于展示,最好是群名,可随意) : 群id(这个可不能随意)
      前端真好玩儿: "前端真好玩儿"
    },
    // 加入房间回复
    roomJoinReply: `\n 你好,欢迎你的加入,请自觉遵守群规则,文明交流,最后,请向大家介绍你自己! \n\n Hello, welcome to join, please consciously abide by the group rules, civilized communication, finally, please introduce yourself to everyone!😊`
  },
  // 私人
  personal: {
    // 好友验证自动通过关键字
    addFriendKeywords: ["加群", "前端"],
    // 是否开启加群
    addRoom: true
  },
  task: {
    taskName: '发送新闻',
    roomId: '',
    url: 'http://api.tianapi.com/internet/index?key=apikey&num=10',
    time: '8:0:0', // /h/m/s
    date: ''
  }
}

加入后台管理后希望是这样的。加上数据库动态更改常用配置(网上图片,如有侵权,可联系删除)。

入口

index.js

/*
 * @Author: Ace
 * @Date: 2020-03-08 16:31:25
 * @Description: wechaty-puppet-padplus入口程序
 */

const { Wechaty } = require("wechaty") // Wechaty核心包
const { PuppetPadplus } = require("wechaty-puppet-padplus") // padplus协议包
const config = require("./config") // 配置文件

const onScan = require("./onScan") // 机器人需要扫描二维码时监听回调
const onRoomJoin = require("./onRoomJoin") // 加入房间监听回调
const onMessage = require("./message/index") // 消息监听回调
const onFriendShip = require("./onFriendShip") // 好友添加监听回调

// 初始化
const bot = new Wechaty({
  puppet: new PuppetPadplus({
    token: config.token
  }),
  name: config.name
})
// 接下来一段链式调用,监听,启动
bot
  .on("scan", onScan) // 机器人需要扫描二维码时监听
  .on("room-join", onRoomJoin) // 加入房间监听
  .on("message", onMessage(bot)) // 消息监听 // 有些消息需要用到 wechaty 实例所以传入 bot
  .on("friendship", onFriendShip) // 好友添加监听
  .start()

message

逻辑比较多的就是 message 部分了, 所以 message 单独建了一个文件夹。

首先对接聊天接口

很简单,就是一个 API, 参数就是聊天的文本。

安装依赖

npm i axios urlencode

msg_reply.js

/*
 * @Author: Ace
 * @Date: 2020-03-08 16:31:25
 */
/**
 * @description 机器人请求接口 处理函数
 * @param {String} info 发送文字
 * @return {Promise} 相应内容
 */

const request = require("axios")
// 请求参数解码
const urlencode = require("urlencode")
const { task, name } = require('../config')
const { getNow } = require('../utils')

function msgReply(info) {
  let url = `https://open.drea.cc/bbsapi/chat/get?keyWord=${urlencode(info)}`
  return request.get(url).then(res => {
    if (res.status == 200) {
      if (res.data.isSuccess) {
        let reply = res.data.data.reply
        // 免费的接口,所以需要把机器人名字替换成为自己设置的机器人名字
        reply = reply.replace(/Smile/g, name)
        return reply
      } else {
        if (res.code == 1010) {
          return "没事别老艾特我,我还以为爱情来了"
        } else {
          return "你在说什么,我听不懂"
        }
      }
    } else {
      return "你在说什么,我脑子有点短路诶!"
    }
  })
}
// 定时任务, 早上8点在群里发送科技新闻(接口用的是天行api)
async function taskApiSync() {
  const { time, fullDate } = getNow()
  if (task.time === time) {
    const news = await request.get(task.url).then(res => {
      if (res.status === 200) {
        return `${fullDate}\r\n\r\n${res.data.newslist.map((news, i) => `${i + 1}. ${news.title}`).join('\r\n')}\r\n新闻详情查看:`
      }
    })
    return news
  }
  return ''
}

module.exports = {
  msgReply,
  taskApiSync
}

分支处理接收到的信息

  • 消息来自自己, 直接返回

  • 消息来自 群聊

    • 以 娜美 开头的消息直接对接机器人自动回复。
    • @ 机器人的消息 直接对接机器人 自动回复。(每次和机器人聊天还要@机器人还是挺麻烦的, 以娜美开头来聊天吧)
    • 其他群聊消息直接无视
  • 消息 来自私聊

    • 指定关键字回复(引导加群,加群欢迎等)
    • 其他聊天内容对接机器人自动回复

其他

像加群回调,添加好友回调都比较简单。可以把代码拉下来简单看看。

另外可以加 nami 为好友进行体验。回复'加群',拉你进前端群

参考

官方文档

Wechaty|NodeJS基于iPad协议手撸一个简单的微信机器人助手