如何简单实现一个智能的hipchat机器人


上个月公司举行了 HackWeek, 由于没有想到什么叼咋天的想法,想到公司还没有一只 chatbot,所以动手生产了一只 hipchat 的智能 bot

现在的 DevOps 中,有一种东西,它占据着一个非常重要的地位,那就是 chatbot, 而基于 chatbot 的这种自动化方式,我们经常叫它 chatops, 也许 GitHub 的 HUBOT是最早而且使用较为广泛的 bot, HUBOT 的能力很强大,它号称是 GitHub 最勤奋的员工,它几乎可以做所有的事情: 编译和部署服务,发布图片,地图,当然也可以和你聊聊天。当然你也可以写你自己的 Scripts,去定义一个你想让它帮你做的事情。作为一个独立的 bot, HUBOT 现在几乎可以和所有主流的团队协作工具集成,比如 Slack, Telegram, Flowdock 等等,所以你很容易可以基于 HUBOT 来打造一个属于你自己的 bot.

当然作为一个爱折腾的工程师,你一定想知道怎么从零打造一个属于自己的 chatbot 吧,那就跟我一起来试试吧。

bot 解剖

bot,机器人,既然称人,那么一定需要有一些必备的属性了

上面的几个组件基本上就可以构成一个基本的机器人了,翻译成我们程序员的语言就是: (以 hipchat 为例)

所以最终你的 bot 的基本架构图会成为下面这样子:

    message                            task
  You [hipchat] ----> Bot [ IO -> Brain ] ----> Queue
                <----           ^                 |
                 result         |                 |
                                |                 |
                                |                 |
                    task        |         task    v
           Workers <-------  Consumer <----------------
                   ------->
                    done

bot 组装

完了剖析之后,让我们真刀真枪的干起来吧. 我们选择 JavaScript 来构建这个 bot,为什么用 JavaScript 啊,因为用其他语言,我怕有一天它还是得被 JavaScript 重写 ):

首先是消息的接收功能,由于 hipchat 是基于 XMPP 协议的,为了及时获取消息,我们需要我们的 bot 具备一个 XMPP 客户端的能力,我们选择了 GitHub - simple-xmpp/node-simple-xmpp: Simple High Level NodeJS XMPP Client 这个库。

然后是消息分析的功能,为了更有效的让我们的 bot 可以快速执行我们指令,我们可以定义两种消息类型:命令型 和 自然语言型。我们可以简单的设定一个规范,比如任何以 ‘#’ 开头的消息都首先当作命令型来处理,而剩下的则认为是自然语言型。他们的消息处理方式的区别是:当我们的 bot 接收到一个消息,首先判断它的类型,如果是命令型,则直接配置相应的 handler, 然后放到任务队列中。如果它是一个自然语言型,则通过自然语言处理技术先解析出其对应的命令,然后配置相应的 handler,再放倒任务队列中。

上面提到了自然语言处理,难道我们要自己从头去实现一个自然语言处理库,当然不用了, 我们可以直接使用 GitHub - NaturalNode/natural: general natural language facilities for node 这个非常棒的基础库。

demo 看看

GitHub - metrue/hipbot: a simple hipchat bot with a little AI thing