Errbot

Python 的 ChatOps 库:Opsdroid 和 Errbot

学习一下 Python 世界里最广泛使用的 ChatOps 库:每个都能做什么,如何使用。

ChatOps 是基于会话导向而进行的开发。其思路是你可以编写能够对聊天窗口中的某些输入进行回复的可执行代码。作为一个开发者,你能够用 ChatOps 从 Slack 合并拉取请求,自动从收到的 Facebook 消息中给某人分配支持工单,或者通过 IRC 检查开发状态。

在 Python 世界,最为广泛使用的 ChatOps 库是 Opsdroid 和 Errbot。在这个月的 Python 专栏,让我们一起聊聊使用它们是怎样的体验,它们各自适用于什么方面以及如何着手使用它们。

Opsdroid

Opsdroid 是一个相对年轻的(始于 2016)Python 开源聊天机器人库。它有着良好的开发文档,不错的教程,并且包含能够帮助你对接流行的聊天服务的插件。

它内置了什么

库本身并没有自带所有你需要上手的东西,但这是故意的。轻量级的框架鼓励你去运用它现有的连接器(Opsdroid 所谓的帮你接入聊天服务的插件)或者去编写你自己的,但是它并不会因自带你所不需要的连接器而自贬身价。你可以轻松使用现有的 Opsdroid 连接器来接入:

  • 命令行
  • Cisco Spark
  • Facebook
  • GitHub
  • Matrix
  • Slack
  • Telegram
  • Twitter
  • 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 的技能里面能使用正则表达式,但也同样提供了几个包括 Dialogflowluis.aiRecast.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 吗?如果用过请留下关于你对于这些工具印象的留言。

Errbot是一个聊天机器人,它是一个连接到您最喜欢的聊天服务的守护程序,并将您的工具和一些有趣的东西带到对话中。

Errbot

Errbot是一个聊天机器人。它允许你从聊天室以交互方式启动脚本,原因包括:随机幽默、聊天、启动构建、监控提交、触发警报。。。

它是用Python编写的,易于扩展。

Errbot作为open-source软件提供,并在gplv3许可下发布。

Features

聊天服务器支持

Built-in

With add-ons

  • 营火(见说明)
  • Cisco Spark(请参阅说明)
  • 不和谐(见说明)
  • Gitter支持(参见说明)
  • 矩阵(见说明)
  • 最重要(见说明)
  • RocketChat(见说明)
  • Skype(请参阅说明)
  • 毒物(见说明)
  • VK(见说明)
  • Zulip(见说明)

Administration

在初始安装和安全设置之后,可以通过与bot(chatops)聊天来管理Errbot。

  • 安装/卸载/更新/启用/禁用git上托管的私有或公共插件
  • 插件可以通过聊天配置
  • 引导机器人加入/离开多用户聊天室(MUC)
  • 安全性:ACL控制功能(每个命令的管理员/用户权限)
  • 后援:综合指挥部!备份创建持久数据的完整导出。
  • 日志:可以从聊天或流到哨兵。

Developer features

  • 在Python中很容易扩展!(见下文)
  • 每个插件(即self['foo'] = 'bar')的预置存储将保持该值。
  • 会话流跟踪用户的会话状态。
  • Webhook回调支持
  • 支持markdown附加格式,包括表格、嵌入图像、链接等。
  • 配置助手,允许通过聊天配置插件
  • 图形和文本开发/调试控制台
  • Self-documenting:你的docstring会自动变成帮助
  • 可以使用子命令和各种arg解析选项(re,命令行类型)
  • 轮询支持:你可以设置一个插件来定期做一些事情
  • 端到端测试后端
  • Slack和Hipchat下的卡片渲染。

社区和支持

如果您有:

  • 一个快速的问题,请随时加入我们的聊天室errbotio/errbot on Gitter。
  • 一个插件开发问题,请使用带有errbot和python标记的Stackoverflow。
  • 要报告的错误或功能请求,请使用我们的GitHub项目页面。

关于更多的一般性讨论和公告,您可以加入googleplus社区。你也可以在Twitter上用标签#errbotping我们。

Installation

Prerequisites

Errbot在Linux、Windows和Mac上的Python3.6+下运行。对于某些聊天系统,您需要一个密钥或登录名才能访问它。

Quickstart

我们建议设置一个virtualenv。

  1. 从pip安装errbot
  2. 在某处创建一个目录(这里称为errbot)来存放errbot的数据文件
  3. 初始化目录
  4. 在文本模式下试用Errbot
$ pip install errbot
$ mkdir errbot; cd errbot
$ errbot --init
$ errbot

它将显示一个提示>>>以便您可以直接与您的机器人对话!尝试!帮助开始。

添加对聊天系统的支持

对于built-ins,只需使用slack、hipchat、telegram、IRC、XMPP和pip中的一个,您仍然可以在初始安装之后添加缺失的支持

$ pip install "errbot[slack]"

对于外部的(Skype、Gitter、Discord等…),请按照各自的github页面进行操作。

Configuration

为了配置Errbot连接到其中一个聊天系统,您需要调整Errbot–init生成的config.py文件。

为了帮助您,我们在这里提供了一个文档模板:config-template.py。

注意:即使您从配置中更改了后端,您仍然可以使用errbot-T和errbot-G在本地测试实例(分别以文本和图形模式)。

将Errbot作为守护程序启动

如果所有这些都有效,现在可以使用-d(或–daemon)参数以分离模式运行它:

errbot --daemon

与机器人交互

启动Errbot之后,如果还没有,应该将bot添加到好友列表中。你也需要在一些聊天系统上明确邀请机器人进入聊天室。你现在可以直接向机器人发送命令了!

要获取所有可用命令的列表,可以发出:

!help

如果您只想了解有关特定命令的更多信息,可以发出:

!help command

Managing plugins

如果您的句柄在中的BOT_ADMINS列表中,则可以在one-on-one聊天中管理bot配置.py.

例如,要在公共插件回购中搜索关键字,您可以发布:

!repos search jira

要安装此列表中的插件,请发出:

!repos install <name of repo>

例如!repos安装errbotio/err-imagebot。

Writing plugins

编写自己的插件非常简单。errbot–init将在plugins子目录中安装一个名为err-example的插件,您可以使用它作为基础。

例如,创建一个“Hello,world!”Errbot插件:

from errbot import BotPlugin, botcmd

class Hello(BotPlugin):
    """Example 'Hello, world!' plugin for Errbot"""

    @botcmd
    def hello(self, msg, args):
        """Return the phrase "Hello, world!" to you"""
        return "Hello, world!"