微信小助手 – 娜美

需求

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

主要功能

  • 自动通过好友验证
    • 当有人添加机器人时,判断验证消息关键字后通过或直接通过
    • 通过验证后自动回复并介绍机器人功能
  • 私聊关键字回复
    • 例如回复 加群 推送群列表
    • 回复 群名 推送群聊邀请,
  • 自动聊天
    • 群聊中通过 @[机器人]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 自己开发。
  • 直接拉取我现成的例子,简单改改,变成自己的机器人。

以我的机器人为例:

  • fork 一份代码
  • clone 到本地
  • node -v // 最好 v14 以上
  • npm i
  • node index

image.png

  • 扫码登录就可以了, 默认只接入了天行api。这样你的微信就有自动回复功能了。

配置文件

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

config.js

/*
 * @Author: Ace
 * @Date: 2020-03-08 16:31:25
 * @Description: 配置项
 */
module.exports = {
  NAME: " ",
  NICKNAME: " ", 
  MEMORIAL_DAY: " ", 
  CITY: "", 
  SENDDATE: "", //定时发送时间 每天17点19分0秒发送,规则见 /schedule/index.js
  TXAPIKEY: "你自己的天行apikey", // http://api.tianapi.com/txapi/one/index?key= 此处须填写个人申请的天行apikey,请替换成自己的 申请地址https://www.tianapi.com/signup.html?source=474284281

  // 高级功能配置项(非必填项)
  AUTOREPLY: true, //自动聊天功能 默认开启, 关闭设置为: false
  DEFAULTBOT: "0", //设置默认聊天机器人 0 天行机器人 1 图灵机器人 2 天行对接的图灵机器人,需要到天行机器人官网充值(50元/年,每天1000次)
  AUTOREPLYPERSON: [""], //指定多个好友开启机器人聊天功能   指定好友的备注,最好不要带有特殊字符
  TULINGKEY: "图灵机器人apikey", //图灵机器人apikey,需要自己到图灵机器人官网申请,并且需要认证
}
复制代码

入口

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

async function onMessage(msg, bot) {
  const contact = msg.talker(); // 发消息人
  const content = msg.text().trim(); // 消息内容
  const room = msg.room(); // 是否是群消息
  const alias = (await contact.alias()) || (await contact.name()); // 发消息人备注
  const isText = msg.type() === bot.Message.Type.Text;
  if (msg.self()) {
    return;
  }

  if (room && isText) {
    // 如果是群消息 目前只处理文字消息
    const topic = await room.topic();
    console.log(
      `群名: ${topic} 发消息人: ${await contact.name()} 内容: ${content}`
    );
  } else if (isText) {
    if (content) {
      let reply;
      if (config.DEFAULTBOT == "0") {
        // 天行聊天机器人逻辑
        reply = await superagent.getReply(content);
        console.log("天行机器人回复:", reply);
      } else if (config.DEFAULTBOT == "1") {
        // 图灵聊天机器人
        reply = await superagent.getTuLingReply(content);
        console.log("图灵机器人回复:", reply);
      } else if (config.DEFAULTBOT == "2") {
        // 天行对接的图灵聊
        reply = await superagent.getTXTLReply(content);
        console.log("天行对接的图灵机器人回复:", reply);
      }
      try {
        await delay(2000);
        await contact.say(reply);
      } catch (e) {
        console.error(e);
      }
    }
    // }
  }
}
复制代码

getReply 方法

// 天行聊天机器人
async function getReply(word) {
  let url = TXHOST + "robot/";
  let content = await superagent.req({
    url,
    method: "GET",
    params: {
      key: config.TXAPIKEY, // 配置文件中的 apikey, 需要自己申请的
      question: word,
      mode: 1,
      datatype: 0,
      userid: uniqueId,
    },
  });

  if (content.code === 200) {
    let res = content.newslist[0];
    let response = "";
    if (res.datatype === "text") {
      response = res.reply;
    } else if (res.datatype === "view") {
      response = `虽然我不太懂你说的是什么,但是感觉很高级的样子,因此我也查找了类似的文章去学习,你觉得有用吗<br>《${content.newslist[0].title}${content.newslist[0].url}`;
    } else {
      response =
        "你太厉害了,说的话把我难倒了,我要去学习了,不然没法回答你的问题";
    }
    return response;
  } else {
    return "我好像迷失在无边的网络中了,你能找回我么";
  }
}
复制代码

分支处理接收到的信息

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

  • 消息来自 群聊

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

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

image.png

独乐乐不如众乐乐

由于各种原因还是有一部分人不能愉快的拥有自己的机器人

  • 不会 node 开发
  • 没有自己的服务器(只能本地玩玩)
  • 不是开发人员

所以我做了一下升级 只需扫一扫就能拥有自己的微信机器人

参考

官方文档

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享