Jason Pan

XBot-指令化对话的企微机器人

潘忠显 / 2025-02-10


之前《10分钟搭建能回消息的企微机器人》提供了一个比较基础通用的消息回复框架。但实际使用时,大家往往需要一个指令化的对话,需要自己额外写解析逻辑;另外,基础服务存在耗时较长的任务无法延迟回复等问题。

因此,我这里封装了一个指令化消息处理框架——XBot ,用于通过企业微信接收用户的指令,或触发任务,或查询信息。可以让你接入企业机器人更方便、高效。欢迎使用、加星 Star

all cases

XBot 主要的一些功能和特点包括:

尽管目前只实现了企业微信的应用,但是设计上兼容各种即时办公软件:除了 wecom_app.py 文件之外,其他的代码文件均不涉及特定的IM平台。

1. 使用方法

项目仓库地址:https://github.com/easy-wx/xbot

根据下边的步骤,你可以快速搭建部署你自己的机器人助手。

1.1 修改与部署

  1. git fork 或者 clone 本项目
  2. 修改 config.py 文件,填入企业微信的相关信息
    • 场景模块文件所在目录:scene_dirs
    • 特殊对话的前缀以及处理函数:special_line_prefix
    • 企业微信相关信息
  3. servicesscene_dirs 指定的目录下添加你的服务模块代码
  4. 修改local.db,添加特殊的权限控制,将你的企业微信ID添加到数据库中
  5. 运行 PYTHONPATH=.. python -m xbot.wecom_app 启动服务

以上需要部署到服务器上,然后在企业微信后台配置回调地址,具体的部署和配置方式详见《企业微信机器人回调服务》。

1.2 指令测试

作为基础项目,这里有提供一些测试指令,可以用来测试是否能够正常运行。

2. 设计

本地提供一个HTTP服务,用于接收企业微信(或其他IM工具)的消息推送。

2.1 通用对话格式

对话遵循以下格式:

[scene] [cmd] [args]

其中,scene 是场景,cmd 是命令,args 是参数数组,使用空格分割。

每个 scene 对应一个 Python 模块;而在模块中,cmd的处理函数命名为 cmd_ + cmd。这样带来了方便:可以动态的添加命令。

为了更清晰地组织代码,你可以将不同的场景放在多个目录中,只要你在 __init__.py 文件中,将对应目录追加到 scene_dirs 即可。

框架会按照目录顺序进行搜索,如果有模块名冲突,优先使用排列靠前的模块。 比如,项目的初始创建了 services 和 activities 两个目录,用来存放不同服务和活动级别的场景模块。

有一个特殊的目录——public,用来存放不敏感的公用接口。

common 目录则用来存放公共的函数和类。

2.2 内部对话格式

有些特殊情况,可能不遵循通用对话格式,比如可以将某些对话接入大语言模型,我们可以使用 # 开头让服务知道,需要处理这种特殊服务。

hash_proc.png

因为是需要指定处理模块,也可以放到别的目录中。

建议放到 spec_line_proc_funcs 中,比如示例中的 #,处理模块在 spec_line_proc_funcs/hash_proc.py 中。

2.3 对话服务适配与消息处理的分离

设计上,独立消息处理和服务处理:消息处理负责解析消息,服务处理负责处理业务逻辑。

这样,可以快速的构建企业微信之外、别的即时通信工具对话的服务。

2.4 权限管理

因为企业微信能够获得用户ID,所以通过 scene + cmd + 日期的方式,对用户进行授权。

本地有 db.sqlite3文件进行管理。只有授权用户才能进行对话,否则提示错误。

permissions.png

你也可以简单修改一下 auth.py 文件中的 PermissionOp 类,实现使用 MySQL 或者其他数据库进行权限管理。

如果使用SQLite管理权限,可以通过更新镜像的方式进行同步。

2.5 HELP 指令

待实现自动列举

2.6 异步主动发送消息

企业微信处理消息有几个客观限制:

基于以上,我这里处理不同耗时的消息也有不同的策略:

sync_async_proc.png

以下代码就是完成了上述的功能:

cmd_ret = sync_async_proc.SyncAsyncRspProcessor(task, timeout=2, complete_cb=cb, fail_timeout=10,
                                                fail_cb=fail_cb).get_result()

3. Docker 部署

不使用流水线,直接推送 Docker 镜像,注意将仓库设置为私有。

本仓库中提供的 Dockerfile 可以用于构建基础镜像,提供一个可以运行的环境。

3.1 构建

docker build --network="host" -t jasonzxpan/xbot .

3.2 使用

如果在当前目录运行,可以直接将目录映射到 /data/xbot:

docker run -i -v $PWD:/data/xbot -p 5001:5001 -t jasonzxpan/xbot

docker_deploy

4. TODO 真实场景举例

4.1 回复文件

4.2 外部定时任务发送消息

4.3 接入大模型demo