ChatOps 是基於會話導向而進行的開發。其思路是你可以編寫能夠對聊天視窗中的某些輸入進行回覆的可執行程式碼。作為一個開發者,你能夠用 ChatOps 從 Slack 合併拉取請求,自動從收到的 Facebook 訊息中給某人分配支援工單,或者透過 IRC 檢查開髮狀態。
在 Python 世界,最為廣泛使用的 ChatOps 庫是 Opsdroid 和 Errbot。在這個月的 Python 專欄,讓我們一起聊聊使用它們是怎樣的體驗,它們各自適用於什麼方面以及如何著手使用它們。
Opsdroid
Opsdroid[1] 是一個相對年輕的(始於 2016)Python 開源聊天機器人庫。它有著良好的開發檔案,不錯的教程,並且包含能夠幫助你對接流行的聊天服務的外掛。
它內建了什麼
庫本身並沒有自帶所有你需要上手的東西,但這是故意的。輕量級的框架鼓勵你去運用它現有的聯結器(Opsdroid 所謂的幫你接入聊天服務的外掛)或者去編寫你自己的,但是它並不會因自帶你所不需要的聯結器而自貶身價。你可以輕鬆使用現有的 Opsdroid 聯結器來接入:
Opsdroid 會呼叫使聊天機器人能夠展現它們的“技能”的函式。這些技能其實是非同步 Python 函式,並使用 Opsdroid 叫做“匹配器”的匹配裝飾器。你可以設定你的 Opsdroid 專案,來使用同樣從你設定檔案所在的程式碼中的“技能”。你也可以從外面的公共或私人倉庫呼叫這些“技能”。
你同樣可以啟用一些現存的 Opsdroid “技能”,包括 seen[2] —— 它會告訴你聊天機器人上次是什麼時候看到某個使用者的,以及 weather[3] —— 會將天氣報告給使用者。
最後,Opdroid 允許你使用現存的資料庫模組設定資料庫。現在 Opdroid 支援的資料庫包括:
你可以在你的 Opdroid 專案中的 configuration.yaml
檔案設定資料庫、技能和聯結器。
Opsdroid 的優勢
Docker 支援:從一開始 Opsdroid 就打算在 Docker 中良好執行。在 Docker 中的指導是它 安裝檔案[4] 中的一部分。使用 Opsdroid 和 Docker Compose 也很簡單:將 Opsdroid 設定成一種服務,當你執行 docker-compose up
時,你的 Opsdroid 服務將會開啟你的聊天機器人也將就緒。
-
version: "3"
-
-
services:
-
opsdroid:
-
container_name: opsdroid
-
build:
-
context: .
-
dockerfile: Dockerfile
豐富的聯結器: Opsdroid 支援九種像 Slack 和 Github 等從外部接入的服務聯結器。你所要做的一切就是在你的設定檔案中啟用那些聯結器,然後把必須的口令或者 API 密匙傳過去。比如為了啟用 Opsdroid 以在一個叫做 #updates
的 Slack 頻道發帖,你需要將以下程式碼加入你設定檔案的 connectors
部分:
-
- name: slack
-
api-token: "this-is-my-token"
-
default-room: "#updates"
在設定 Opsdroid 以接入 Slack 之前你需要新增一個機器人使用者[5]。
如果你需要接入一個 Opsdroid 不支援的服務,在檔案[6]裡有有新增你自己的聯結器的教程。
相當不錯的檔案: 特別是對於一個在積極開發中的新興庫來說,Opsdroid 的檔案十分有幫助。這些檔案包括一篇帶你建立幾個不同的基本技能的教程[7]。Opsdroid 在技能[8]、聯結器[6]、資料庫[9],以及匹配器[10]方面的檔案也十分清晰。
它所支援的技能和聯結器的倉庫為它的技能提供了富有幫助的示範程式碼。
自然語言處理: Opsdroid 的技能裡面能使用正則運算式,但也同樣提供了幾個包括 Dialogflow[11],luis.ai[12],Recast.AI[13] 以及 wit.ai[14] 的 NLP API。
Opsdroid 可能的不足
Opsdroid 對它的一部分聯結器還沒有啟用全部的特性。比如說,Slack API 允許你向你的訊息新增顏色柱、圖片以及其他的“附件”。Opsdroid Slack 聯結器並沒有啟用“附件”特性,所以如果那些特性對你來說很重要的話,你需要編寫一個自定義的 Slack 聯結器。如果聯結器缺少一個你需要的特性,Opsdroid 將歡迎你的貢獻[15]。檔案中可以使用更多的例子,特別是對於預料到的使用場景。
示例用法
-
from opsdroid.matchers import match_regex
-
import random
-
-
-
@match_regex(r'hi|hello|hey|hallo')
-
async def hello(opsdroid, config, message):
-
text = random.choice(["Hi {}", "Hello {}", "Hey {}"]).format(message.user)
-
await message.respond(text)
hello/__init__.py
-
connectors:
-
- name: websocket
-
-
skills:
-
- name: hello
-
repo: "https://github.com//hello-skill"
configuration.yaml
Errbot
Errbot[16] 是一個功能齊全的開源聊天機器人。Errbot 發行於 2012 年,並且擁有人們從一個成熟的專案能期待的一切,包括良好的檔案、優秀的教程以及許多幫你連入現有的流行聊天服務的外掛。
它內建了什麼
不像採用了較輕量級方式的 Opsdroid,Errbot 自帶了你需要可靠地建立一個自定義機器人的一切東西。
Errbot 包括了對於本地 XMPP、IRC、Slack、Hipchat 以及 Telegram 服務的支援。它透過社群支援的後端列出了另外十種服務。
Errbot 的優勢
良好的檔案: Errbot 的檔案成熟易讀。
動態外掛架構: Errbot 允許你透過和聊天機器人交談安全地安裝、解除安裝、更新、啟用以及禁用外掛。這使得開發和新增特性十分簡便。感謝 Errbot 的顆粒性授權系統,出於安全意識這所有的一切都可以被鎖閉。
當某個人輸入 !help
,Errbot 使用你的外掛的檔案字串來為可獲取的命令生成檔案,這使得瞭解每行命令的作用更加簡便。
內建的管理和安全特性: Errbot 允許你限制擁有管理員許可權的使用者串列,甚至細粒度訪問控制。比如說你可以限制特定使用者或聊天房間訪問特定命令。
額外的外掛框架: Errbot 支援鉤子、回呼、子命令、webhook、輪詢以及其它更多特性[17]。如果那些還不夠,你甚至可以編寫動態外掛[18]。當你需要基於在遠端伺服器上的可用命令來啟用對應的聊天命令時,這個特性十分有用。
自帶測試框架: Errbot 支援 pytest[19],同時也自帶一些能使你簡便測試外掛的有用功能。它的“測試你的外掛[20]”的檔案出於深思熟慮,並提供了足夠的資料讓你上手。
Errbot 可能的不足
以 “!” 開頭: 預設情況下,Errbot 命令發出時以一個驚嘆號打頭(!help
以及 !hello
)。一些人可能會喜歡這樣,但是另一些人可能認為這讓人煩惱。謝天謝地,這很容易關掉。
外掛元資料 首先,Errbot 的 Hello World[21] 外掛示例看上去易於使用。然而我無法載入我的外掛,直到我進一步閱讀了教程併發現我還需要一個 .plug
檔案,這是一個 Errbot 用來載入外掛的檔案。這可能比較吹毛求疵了,但是在我深挖檔案之前,這對我來說都不是顯而易見的。
示例用法
-
import random
-
from errbot import BotPlugin, botcmd
-
-
class Hello(BotPlugin):
-
-
@botcmd
-
def hello(self, msg, args):
-
text = random.choice(["Hi {}", "Hello {}", "Hey {}"]).format(message.user)
-
return text
hello.py
-
[Core]
-
Name = Hello
-
Module = hello
-
-
[Python]
-
Version = 2+
-
-
[Documentation]
-
Description = Example "Hello" plugin
hello.plug
你用過 Errbot 或 Opsdroid 嗎?如果用過請留下關於你對於這些工具印象的留言。