聊天工具除了用来传递消息之外,还可以帮我们完成一些重复琐碎的工作,比如让它去追踪一些数据变化,象下图中的 Trump 会告诉我们发表在知乎上的帖子又增加了多少新的读者关注。

Trump - 知乎数据

Trump - 知乎数据

下面我就来介绍一下如何在 LeanEngine 上快速开发和部署一个像 Trump 这样的聊天机器人。因为我们团队使用的聊天工具是 BearyChat,所以就以 BearyChat 为例了。

首先,开始一个新的 Node.js 项目并把 RoLE 增加为依赖。RoLE 是 Robot on LeanEngine 的缩写,这是从我们自己的聊天室机器人抽象出来的一个库。不过因为已经有一个叫 role 的 NPM 包,所以包名就只能叫 role-model 了,也是个有趣的名字。用下面的命令把它加到你的项目里:

npm install --save role-model

这个库只有一个顶层 API createRobotApp()

const role = require('role-model');
const app = role.createRobotApp({
  chatService: 'bearychat',
  chatServiceOptions: {
    team: process.env.BEARYCHAT_TEAM,
    token: process.env.BEARYCHAT_TOKEN
  }
});

目前 chatService 参数暂时只支持 'bearychat',但支持其他聊天工具(包括微信服务号)是非常容易的,欢迎在 GitHub 提交 pull request。chatServiceOptions 是要传递给这个聊天工具的参数,对于 BearyChat 来说就是 team 和 token。为了避免 token 暴露在源代码中,我们从环境变量读取他的值。环境变量可以在云引擎的 web 控制台设置。

上一行代码的 app 有三个属性:

机器人的行为通过建立匹配条件和回调函数的关联来定义。匹配条件可以是一个关键词列表:

app.robot.addHandler(['ping'],
    context => context.respond('pong'));

当发来的消息包含列表中的所有关键词时,对应的函数就会被调用。

匹配条件也可以是正则表达式:

app.robot.addHandler(/ping/,
    context => context.respond('pong'));

如果正则表达式里有捕获组(capture group)的话,context.matches 里会有匹配到的字符串。

最灵活的方式是用一个函数作为匹配条件:

app.robot.addHandler((msg) => msg === "ping",
    context => context.respond('pong'));

在程序的最后运行:

app.run();

这必须是主程序的最后一行,因为它会调用 app.expressApp.listen()

因为 RoLE 使用了 ES6 的一些功能,所以需要在 package.json 告诉 LeanEngine 使用 Node 4.x(未来也可以换成更高的版本)。

  "engines": {
    "node": "4.x"
  }

如果以前没有用过 LeanEngine,请先安装必要的命令行工具。然后按步骤将程序部署到 LeanEngine,在 LeanCloud 后台配置好自己的 *.leanapp.cn 二级域名,再到 BearyChat 的设置里增加一个 Hubot 类型的机器人,就可以和你的新机器人对话了。

最后贴出一些我们自己使用聊天机器人的截图,希望能抛砖引玉,给大家攒些灵感吧:

机器人「长者」的功能很多。比如测试一下从国内调用 LeanCloud 美国节点的 API 是不是畅通:

长者 - 测试美国节点

长者 - 测试美国节点

看看今天有谁请假:

长者 - 请假

长者 - 请假

请教一下人生的经验:

长者 - 支持不支持

长者 - 支持不支持

长者 - 清河的雷布斯

长者 - 清河的雷布斯

是不是觉得 Siri 什么的都弱爆了?