Python 的 ChatOps 庫:Opsdroid 和 Errbot
ChatOps 是基於會話導向而進行的開發。其思路是你可以編寫能夠對聊天窗口中的某些輸入進行回復的可執行代碼。作為一個開發者,你能夠用 ChatOps 從 Slack 合併拉取請求,自動從收到的 Facebook 消息中給某人分配支持工單,或者通過 IRC 檢查開發狀態。
在 Python 世界,最為廣泛使用的 ChatOps 庫是 Opsdroid 和 Errbot。在這個月的 Python 專欄,讓我們一起聊聊使用它們是怎樣的體驗,它們各自適用於什麼方面以及如何著手使用它們。
Opsdroid
Opsdroid 是一個相對年輕的(始於 2016)Python 開源聊天機器人庫。它有著良好的開發文檔,不錯的教程,並且包含能夠幫助你對接流行的聊天服務的插件。
它內置了什麼
庫本身並沒有自帶所有你需要上手的東西,但這是故意的。輕量級的框架鼓勵你去運用它現有的連接器(Opsdroid 所謂的幫你接入聊天服務的插件)或者去編寫你自己的,但是它並不會因自帶你所不需要的連接器而自貶身價。你可以輕鬆使用現有的 Opsdroid 連接器來接入:
- 命令行
- Cisco Spark
- GitHub
- Matrix
- Slack
- Telegram
- Websocket
Opsdroid 會調用使聊天機器人能夠展現它們的「技能」的函數。這些技能其實是非同步 Python 函數,並使用 Opsdroid 叫做「匹配器」的匹配裝飾器。你可以設置你的 Opsdroid 項目,來使用同樣從你設置文件所在的代碼中的「技能」。你也可以從外面的公共或私人倉庫調用這些「技能」。
你同樣可以啟用一些現存的 Opsdroid 「技能」,包括 seen —— 它會告訴你聊天機器人上次是什麼時候看到某個用戶的,以及 weather —— 會將天氣報告給用戶。
最後,Opdroid 允許你使用現存的資料庫模塊設置資料庫。現在 Opdroid 支持的資料庫包括:
- Mongo
- Redis
- SQLite
你可以在你的 Opdroid 項目中的 configuration.yaml
文件設置資料庫、技能和連接器。
Opsdroid 的優勢
Docker 支持:從一開始 Opsdroid 就打算在 Docker 中良好運行。在 Docker 中的指導是它 安裝文檔 中的一部分。使用 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 之前你需要添加一個機器人用戶。
如果你需要接入一個 Opsdroid 不支持的服務,在文檔里有有添加你自己的連接器的教程。
相當不錯的文檔: 特別是對於一個在積極開發中的新興庫來說,Opsdroid 的文檔十分有幫助。這些文檔包括一篇帶你創建幾個不同的基本技能的教程。Opsdroid 在技能、連接器、資料庫,以及匹配器方面的文檔也十分清晰。
它所支持的技能和連接器的倉庫為它的技能提供了富有幫助的示範代碼。
自然語言處理: Opsdroid 的技能裡面能使用正則表達式,但也同樣提供了幾個包括 Dialogflow,luis.ai,Recast.AI 以及 wit.ai 的 NLP API。
Opsdroid 可能的不足
Opsdroid 對它的一部分連接器還沒有啟用全部的特性。比如說,Slack API 允許你向你的消息添加顏色柱、圖片以及其他的「附件」。Opsdroid Slack 連接器並沒有啟用「附件」特性,所以如果那些特性對你來說很重要的話,你需要編寫一個自定義的 Slack 連接器。如果連接器缺少一個你需要的特性,Opsdroid 將歡迎你的貢獻。文檔中可以使用更多的例子,特別是對於預料到的使用場景。
示例用法
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/<user_id>/hello-skill"
configuration.yaml
Errbot
Errbot 是一個功能齊全的開源聊天機器人。Errbot 發行於 2012 年,並且擁有人們從一個成熟的項目能期待的一切,包括良好的文檔、優秀的教程以及許多幫你連入現有的流行聊天服務的插件。
它內置了什麼
不像採用了較輕量級方式的 Opsdroid,Errbot 自帶了你需要可靠地創建一個自定義機器人的一切東西。
Errbot 包括了對於本地 XMPP、IRC、Slack、Hipchat 以及 Telegram 服務的支持。它通過社區支持的後端列出了另外十種服務。
Errbot 的優勢
良好的文檔: Errbot 的文檔成熟易讀。
動態插件架構: Errbot 允許你通過和聊天機器人交談安全地安裝、卸載、更新、啟用以及禁用插件。這使得開發和添加特性十分簡便。感謝 Errbot 的顆粒性授權系統,出於安全意識這所有的一切都可以被鎖閉。
當某個人輸入 !help
,Errbot 使用你的插件的文檔字元串來為可獲取的命令生成文檔,這使得了解每行命令的作用更加簡便。
內置的管理和安全特性: Errbot 允許你限制擁有管理員許可權的用戶列表,甚至細粒度訪問控制。比如說你可以限制特定用戶或聊天房間訪問特定命令。
額外的插件框架: Errbot 支持鉤子、回調、子命令、webhook、輪詢以及其它更多特性。如果那些還不夠,你甚至可以編寫動態插件。當你需要基於在遠程伺服器上的可用命令來啟用對應的聊天命令時,這個特性十分有用。
自帶測試框架: Errbot 支持 pytest,同時也自帶一些能使你簡便測試插件的有用功能。它的「測試你的插件」的文檔出於深思熟慮,並提供了足夠的資料讓你上手。
Errbot 可能的不足
以 「!」 開頭: 默認情況下,Errbot 命令發出時以一個驚嘆號打頭(!help
以及 !hello
)。一些人可能會喜歡這樣,但是另一些人可能認為這讓人煩惱。謝天謝地,這很容易關掉。
插件元數據 首先,Errbot 的 Hello World 插件示例看上去易於使用。然而我無法載入我的插件,直到我進一步閱讀了教程並發現我還需要一個 .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 嗎?如果用過請留下關於你對於這些工具印象的留言。
via: https://opensource.com/article/18/3/python-chatops-libraries-opsdroid-and-errbot
作者:Jeff Triplett, Lacey Williams Henschel 譯者:tomjlw 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive