Slack/Hubot

想拥有一个自己的hubot也有一段时间了。

虽然很早就开始用slack,都是用来配合ifttt耍的,还不知道这么一个大杀器。Slack 是聊天群组 + 大规模工具集成 + 文件整合 + 统一搜索。截至2014年底,Slack 已经整合了电子邮件、短信、Google Drives、Twitter、Trello、Asana、GitHub 等 65 种工具和服务,把可以把各种碎片化的企业沟通和协作集中到一起。

后来订阅了湾区日报。看了一些文章后才发现的,确实是个好东西。工作忙里偷闲,按照slack API里 Slack Developer Kit for Hubot 的内容一步一步走来。目前对里面的一些产品插件都还不了解,先记录下来,以后再慢慢补充了。

Hubot是由Github开发的开源聊天机器人,基于Node.js采用CoffeeScript编写。

可以借助Hubot开发Chatbot来自动化的完成想要一切自动化任务,比如:

  • 运维自动化(编译部署代码、重启机器,监控服务器运行情况,自动修复Bug等)
  • 外部服务交互(管理Redmine、集成Jenkins、监视Zabbix等)
  • 定时获取天气预报
  • 随机订餐
  • 聊天机器人等等。

1.安装node和npm环境

可以访问我的gist下载。

chmod a+x NodejsInstall.sh

然后就要经过漫长的等待(我的机器性能一般,大概是1个小时)。 安装完成后,node就安装好了。在安装node的同时,npm也安装到了你的服务器上。通过下面的命令查看node和npm的版本号信息。

node -v
npm -v

由于npm更新的速度会比node更快一些,所以运行下面的命令可以保证你的npm保持最新。

npm install npm@latest -g

2.安装slack/Hubot kit

使用下面的命令快速安装Yeomanhubot 。Yeoman可以辅助我们快速安装hubot。

npm install -g yo generator-hubot

安装好环境后,在我们感兴趣的目录下,可以开始新建我们的hubot项目了。

如果你是以root用户安装的话,记得要给相关的文件夹赋权限。 要不然就会像下面这样。

EACCES: permission denied, open '/root/.config/configstore/insight-yo.json'
You don't have access to this file.

赋予配置文件权限,新建项目:

chmod g+rwx /root /root/.config /root/.config/configstore /root/.npm

mkdir my-awesome-hubot
chmod 777 my-awesome-hubot 
cd my-awesome-hubot
yo hubot --adapter=slack

同时你还需要去hubot页面生成你的机器人API Token。在获得api token之后,你可以运行以下命令跑起来了。

HUBOT_SLACK_TOKEN=xoxb-YOUR-TOKEN-HERE ./bin/hubot --adapter slack

3. 让 hubot 执行 shell 脚本

npm install hubot-script-shellcmd
cp -R node_modules/hubot-script-shellcmd/bash ./

修改一下external-scripts.json,添加上以下模块:hubot-script-shellcmd。如果到此为止,你操作的步骤和我基本一样的话,你的external-scripts.json应该长的像这个样子:

[
  "hubot-diagnostics",
  "hubot-help",
  "hubot-google-images",
  "hubot-google-translate",
  "hubot-pugme",
  "hubot-maps",
  "hubot-rules",
  "hubot-shipit",
  "hubot-script-shellcmd"
]

接下来:

cd bash/handlers

这里面的 helloworld 就是个例子,可以改成自己的脚本。运行的话,如果在群组内,需要@xxx(xxx为机器人的名字,例如hubot)

hubot shellcmd helloworld

如果是私人会话,可以直接回复

shellcmd helloworld

我们可以完成任意想要的脚本,例如下面的脚本将计算CPU的使用率。

#!/bin/bash
top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'

exit 0

将文件命名成cpu,只要运行shellcmd cpu,就可以了。

4. 高级配置

5. 其他开发

参考 hubot 的两个文档 scripting 和 patterns,写的非常详细。下面是个简单的例子,将收到的信息转发到网站。

module.exports = (robot) ->
    robot.listen(
        (message) ->
            message.user.name is "你的Slack用户名" #这里限制只对我的回复做响应
            robot.brain.set 'message', message.rawText
        (response) ->
            req = "data=" + JSON.stringify({
                message: robot.brain.get('message'),
            })  
            robot.http("http://test.com/api") # 改为你自己的接口地址
                .header('Content-Type: application/x-www-form-urlencoded;charset=utf-8')
                .post(req) (err, res, body) ->
                    if err 
                        response.reply "请求接口失败" 
                        robot.emit 'error', err, res 
                        return
                    if res.statusCode isnt 200 
                        response.reply "接口返回非200"
                        return
                    response.send body
    )    

参考资料

参考资料


贞观政要·卷五·论公平 Laravel 的一些小坑总结