建立屬於自己的 Hubot (3) - 新增 Scripts

Jun 15, 2017 Hubot English

上一篇教學中,我已經示範如何安裝並建立一個 Hubot。為了讓 Hubot 能真正發揮其強大之處,我們還需要替 Hubot 加入客製化的 Scirpt (.coffee 或者是 .js 檔案)。所以,我將在這篇文章中介紹如何新增 Script 並進一步將 Hubot 與 Slack 整合。



前置準備

確認一下你的機器已經安裝 Node.jsnpm

# 查看 Node.js 版本
nodejs -v

# 查看 npm 版本
npm -v


建立 Scripts

為什麼我們會需要另外新增 Scripts 呢?你可以將它視為 Hubot 的外掛。少了客製化的外掛,Hubot 只提供非常基本的功能 (指令)。 所以我們接下來將建立自己的外掛來強化、靈活運用 Hubot。但是,我們該怎麼安裝外掛呢?很簡單,Yo 已經幫我們建立好一個名為 scripts 資料夾,我們只需要把檔案放在該處即可。暸解後,讓我們先建立一個簡單的 Script:

# 此範例使用 Coffescript

module.exports = (robot) ->

  # 用法: show_info
  robot.respond /show_info/i, (msg) ->

    # 在此加入你所需的動作 ...

    # 例如: 發送一個多行的訊息
    msg.reply """Put your information here
    and here ....
    and here ....
    """

在上面的範例中,我使用了 robot.respond 來定義一個指令 (或者你也可以視為觸發器)。所以試著想像你在 Slack 上輸入並執行 show_info 後,該指令會觸發 Hubot 產生反應並在同一個頻道回傳文字訊息。除了 respond,你還可以使用 hear。請參考說明文件來了解它們使用上的差異與時機。接下來,再來一個有趣一點的範例:

# 透過 Hubot 呼叫 HTTP API

  ...

  # 用法: call-http [param1] [param2]
  robot.respond /call-http (.*) (.*)/i, (msg) ->

    # 取得 parameters
    data = JSON.stringify({
      param1: msg.match[1]
      param2: msg.match[2]
    })

    # 發送 POST Request 並回傳 response
    msg.http('/url/to/your/service')
      .header('Content-Type', 'application/json')
      .post(data) (err, res, body) ->
        if res
          if res.statusCode isnt 200
            msg.reply "Something goes wrong ..."
            return
          msg.reply "Return your data or messages"
        else
          msg.reply "Something goes wrong ..."


整合 Hubot 與 Slack

要成功地讓 Hubot 與 Slack 結合我們還需要一個關鍵的步驟,因為 Slack 目前還不知道我們的 Hubot 存在。所以,我們需要替 Hubot 註冊並取得一個 API token。首先,進入 Slack 並點選 Apps & Integrations,然後選擇 Bot。註冊完成後,你就可以取得 API token。

啟動 Hubot

一切就緒後,啟動 Hubot (別忘了加入 API token):

# Don't forget to add the token
HUBOT_SLACK_TOKEN=your-api-token ./bin/hubot --adapter slack

當然,更好的方式就是把 API token 設成環境變數來使用。成功啟動 Hubot 後,你就可以到 Slack 上開始給你的機器人指令了。


你也可能會喜歡:




若對於文章內容有任何建議與指正,非常歡迎你告訴我或者與我一起討論 ! :)

zeckli.devforgalaxy@gmail.com   © 2015-2019 zeckli, thanks to Jekyll and GitHub.