# Errbot 入门（1）

## 简介

ChatBot，也就是聊天机器人，是近期偷偷热起来的东西之一，个人觉得原因很简单——太多系统需要运维了。

使用 Grafana 可以将各种监控、日志的东西进行跟踪，在同一个 Dashboard 进行展示，但是缺点也比较明显：

1. Dashboard 需要定制，不够灵活，难于满足突发的个性化需要。
    
2. 信息是单向流动的，无法进行远程干预。
    
3. 插件开发需要兼顾前后端，前端漂亮的界面对运维来说，并非必要。
    

聊天机器人简单说来是一个需要**很多二次开发**的控制台，这个控制台的不同之处在于，可以和多种聊天室之类的东西进行集成，另外部分产品提供了认证、授权等功能；另外还有不少开源插件，用来同其他系统进行集成。称为机器人，应该说是一个历史遗留，跟 AI 大概有半毛钱的关系吧。

目前最流行的同类产品大概是 Github 的 Hubot，不过个人爱好问题，还是选择了 Python 的 Errbot。官方网站 http://errbot.io/ ，大致功能：

* 内置多后端支持：
    
    * Slack
        
    * Telegram
        
    * XMPP
        
    * IRC
        
    * HipChat
        
* 第三方后端支持：
    
    * Skype
        
    * Gitter
        
    * Cisco Spark
        
    * ...
        
* 内置访问控制
    
* 聊天室支持
    
* 输出模板支持
    
* 本地存储支持
    
* 消息回调功能
    
* Webhook 支持
    
* 自带文本终端
    
* ...
    

下面会写一点教程，尝试**在 Slack 上，通过 Errbot 来和 Kubernetes 集群进行交互**。大概分为三部分：

1. 安装运行和一些基本操作
    
2. Slack 的集成
    
3. 插件编写入门
    

## 安装和运行

安装过程还是有点点烦的，所以我做了个 Docker 镜像，源码见后。

镜像已经在 DockerHub 上构建，Tag 为 `dustise/errbot-image`，简单运行`docker run -it --rm dustise/errbot-image`，就进入了文本调试界面，如图所示：

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1745895148055/dcbf4e07-aac8-4431-a956-656c633f198d.png align="center")

输入`!help`（注意，要输入两次回车）会列出当前支持的命令列表。感叹号是 errbot 的命令前缀。输入`!shutdown --confirm`，会提示关机字样，errbot 进程退出。

接下来我们将其中的存储卷进行映射：

```bash
mkdir -p /var/volume/errbot

docker run -it --rm --name=errbot \
-v /var/volume/errbot:/errbot \
dustise/errbot-image
```

运行之后，我们可以在宿主机系统上看到 errbot 的 Home 文件夹，其中`plugins/err-example`中包含了一个样板插件，我们可以查看一下其中的内容：

\*\* err-example.plug\*\*

```ini
[Core]
Name = Example
Module = example

[Documentation]
Description = This is a simple plugin example to get you started.

[Python]
Version = 2+
```

\*\* err-example.py\*\*

```python
from errbot import BotPlugin, botcmd
class Example(BotPlugin):
....
    @botcmd  # flags a command
    def tryme(self, msg, args):  # a command callable with !tryme
        return 'It *works* !'  # This string format is markdown.
```

字面上看来，这个 Example 中提供了一条叫`tryme`的命令，我们回到 bot 控制台，输入`!tryme`看一下结果，会发现系统返回了`It works`字样。

接下来我们添加一个新的命令，在 err-example.py 中加入：

```python
    @botcmd(split_args_with=None)
    def who_are_you(self, msg, args):
       return "you are " + args[0]
```

这一个比上面的稍微复杂一些：

1. botcmd 的 `split_args_with` 代表拆分参数
    
2. 函数中的下划线，代表子命令，输入时可以使用`!who are you`的形式
    
3. 拆分参数的结果，以数组形式保存在 args 中。
    

修改存盘之后，使用`!restart`命令重启 errbot。输入`!who are you ali`，会看到回显内容：`you are ali`。

## 源代码

**Dockerfile**：

```dockerfile
FROM alpine
COPY prepare.sh /usr/local/bin
ENV CLIENT_VER=">=3.0.0,<4.0.0"
RUN /usr/local/bin/prepare.sh
WORKDIR /errbot
VOLUME ["/errbot"]
CMD ["/usr/local/bin/entry.sh"]
```

**prepare.sh**：

```bash
#!/bin/sh
set -xe
env
apk update
apk upgrade
apk add python3
apk add python3-dev musl-dev gcc libffi-dev openssl-dev
pip3 install errbot
pip3 install "kubernetes$CLIENT_VER"
pip3 install sleekxmpp pyasn1 pyasn1-modules irc hypchat \
  slackclient python-telegram-bot prometheus_client

apk del musl-dev gcc libffi-dev --purge

cat >> /usr/local/bin/entry.sh << EOF
#!/bin/sh
if [ ! -f /errbot/config.py ]; then
    errbot --init
fi
errbot
EOF

chmod a+x /usr/local/bin/entry.sh
```
