惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
D
Docker
D
DataBreaches.Net
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
L
LINUX DO - 热门话题
T
The Blog of Author Tim Ferriss
雷峰网
雷峰网
Project Zero
Project Zero
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
宝玉的分享
宝玉的分享
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
Cisco Talos Blog
Cisco Talos Blog
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
The Cloudflare Blog
Know Your Adversary
Know Your Adversary
T
Tor Project blog
博客园_首页
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
Security Latest
Security Latest
Cyberwarzone
Cyberwarzone
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
H
Help Net Security
Simon Willison's Weblog
Simon Willison's Weblog
阮一峰的网络日志
阮一峰的网络日志
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
AWS News Blog
AWS News Blog
The GitHub Blog
The GitHub Blog
P
Proofpoint News Feed
T
Troy Hunt's Blog
量子位
G
GRAHAM CLULEY
O
OpenAI News
Engineering at Meta
Engineering at Meta
博客园 - Franky
SecWiki News
SecWiki News
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

0x01 byte

我在 2025 年看完的书 西班牙之行 2025 年初展望 2024 年底曼谷之行 荐书:The Blind Watchmaker 王垠传播的「自然视力恢复法」真的有用吗? 从高考志愿到职业选择 浅谈 Apple Intelligence 2024 年,我为什么开始为搜索付费 运气与努力 刷新了一下对内容审查粒度的认知 离开心动和 TapTap 如何反转一个链表? 如何高效地协作开发:一些 Google 的实践 关于 LeanCloud 被心动/TapTap 收购 small talk #3:从 IPFS 聊到 Web 的开放性 small talk #2:聊聊用 M1 芯片的新 Mac 怀念两位老师:Stan Eisenstat 和 Paul Hudak small talk #1: 聊聊你的私有云 如何在 Emacs 里做所有事 Remark Ninja: 一个简单的评论系统 Woman、man、camera、TV:如何做一个完整的深度学习应用 荐书:走出戈壁:我的中美故事 LeanCloud 开始周期性远程工作了 树莓派:用 Pi-hole 来保护隐私和过滤广告 爱国指南 我在 2019 年觉得不错的几个习惯 WeWork 的兴衰和创投的游戏 计算机专业学生该如何提高自己 怎样利用好路上的时间 荐书:Educated - 一部震撼人心的回忆录 入门 React hooks + 后端集成 荐书:Bad Blood,创业公司的谎言与欺诈 LeanCloud 的故事 — AVOS 时期 一点人生经验 👓 — 如何学英语 一点人生经验 👓 — 学好英语的重要性 Docker 和 Kubernetes 从听过到略懂:给程序员的旋风教程 加密货币与区块链(三):什么是信任 离开微信公众平台 加密货币和区块链(二):分布式共识与去中心化 加密货币和区块链(一):历史的重演 第一个程序员 Ada 的故事 写在 9/11 十五周年 说说离职员工的期权 你所不知道的 Dijkstra 你所不知道的冯·诺伊曼 在 LeanCloud 看 Parse 的关闭 对透明薪酬的回顾 比 XCodeGhost 更邪恶的手段 30 年前就出现了 写给创业的技术人 如何有效地做 Code Review 为什么每个团队都需要 Code Review? 怀念我的外公 面向对象与函数式 「零和博弈」- 是语言在演变还是媒体在倒退 编程语言之争 传统媒体和互联网 Clojure: 现实世界的 LISP 求职时的常见错误 Emacs Smart Split (旧文)也说王垠退学
快速开发聊天机器人
blog.incoming@1byte.io (江宏) · 2016-06-19 · via 0x01 byte

聊天工具除了用来传递消息之外,还可以帮我们完成一些重复琐碎的工作,比如让它去追踪一些数据变化,象下图中的 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.expressApp 是一个 Express 应用的实例,可以用它来定义新的 route 和 middleware,比如用来作为第三方服务的回调 hook。
  • app.leanEngine 是一个已经初始化过的 LeanEngine SDK 的实例,在普通 LeanEngine Node 应用中可以通过 require('leanengine') 得到并自己初始化。在这里提供出来以方便调用 LeanCloud 的各种服务,比如存储、IM 等。
  • app.robot 这是用来定义机器人行为的对象。

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

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.expressApp.listen()

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

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

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

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

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

长者 - 测试美国节点

长者 - 测试美国节点

看看今天有谁请假:

长者 - 请假

长者 - 请假

请教一下人生的经验:

长者 - 支持不支持

长者 - 支持不支持

长者 - 清河的雷布斯

长者 - 清河的雷布斯

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