Jason Pan

10分钟搭建能回消息的企微机器人

潘忠显 / 2023-12-20


本文介绍如何利用一个 50行的 Python文件,10分钟内创建起一个可以回复消息的企业微信群机器人。如果项目能给你带来些许便利,请不吝加星 Star

一、背景

最近在做需求的时候,经常会遇到产品同学找我来查询某个ID对应的细节。ID对应的细节,需要查询 Redis/ElasticSearch 来获得数据。之前会手动去查询,之后改成HTTP服务,最终改成企业微信机器人【接收回复消息】。

使用企业微信机器人的好处:

如果从0去创建企业微信机器人及其服务,会比较麻烦:需要调用给的加解密API,自己HTTP服务,并且要自己实现消息的解析、校验和解密。这无形中,提高了创建微信群机器人使用门槛。

其实,没有必要每个人都将上边的提到的“麻烦”都再去经历一遍。我这里就是将公共功能,即HTTP服务、消息解析、校验、解密做了封装,使用者只需要pip安装一下,就可以创建一个 Server,只需要实现一下消息处理函数,即可拉起群机器人的服务。

接下来,我们将快速搭建起一个回复消息的企微机器人。

二、添加机器人并命名

拉两个熟人建群,点击右上角 … 添加群机器人:

add_wecom_svr_1

【重要】输入名字,这里名字后边会用到,继续点击添加机器人按钮:

add_wecom_svr_2

获得webhook地址,我们这里用不到,继续点击”配置说明“:

add_wecom_svr_3

点击”接收消息配置“页签,我们为了使用demo,这里先将 Token 和 AESKey 填成固定的 3个x 和 43个x:

add_wecom_svr_4

我们这里还没有服务对吧?接下来我们去部署服务。

三、部署Demo服务

clone 项目,使用其中的 demo.py 和 Dockerfile

git clone https://github.com/easy-wx/wecom-bot-svr.git

【重要】修改 demo/demo.py 中的 bot_name 修改成跟你配置的机器人名字完全一致。

接下来是一个典型的CI/CD的过程,你可以通过流水线来构建服务,也可以像我这样直接推送镜像的方式来构建。

(需要修改成你自己的镜像地址):

cd web-bot-svr/demo
docker build --network="host" . -t  mirrors.tencent.com/jasonzxpan/wecom-bot-svr-demo
docker push mirrors.tencent.com/jasonzxpan/wecom-bot-svr-demo

到你最常用的平台去部署一下这个镜像,比如我用我们部门的Koala平台来部署:

wecom_bot_svr_image_deploy

然后做一些相应的操作,给该服务产生一个可以访问的链接。然后将这个链接+路径(demo中是/wecom_bot)配置到机器人配置留空的URL中:

add_wecom_svr_6

点击保存,如果保存失败,说明服务部署有问题,需要检查。

四、测试机器人

不知不觉中,你已经完成了机器人的部署,接下来我们来测试一下 demo 机器人的基础功能。

  1. 在群中发送消息。demo里有实现 help 和普通消息的回复功能:
test_wecom_bot_1
  1. 可以移除再添加,这里展示的是加入群的事件触发消息发送的功能:
test_wecom_bot_2
  1. 查看机器人资料,有一个发布到公司的按钮,只有发布之后的机器人,才能被公司其他同事搜索到,才可以被添加到其他的群聊当中:
publish_wecom_bot

五、Token和AESKey的管理

上边为了方便,demo中直接使用固定的 Token 和 AESKey,实际使用中,建议直接利用机器人配置页面的随机生成按钮获得。

random_token_1

删除代码中传入的 token 和 key,直接将其以配置的方式传入到服务中即可(三个环境变量 WX_BOT_TOKEN, WX_BOT_AES_KEY, WX_BOT_CORP_ID):

server = app.WecomBotServer(bot_name, host, port, path='/wecom_bot')
random_token_2

六、demo.py 代码解析

只要你看懂了 demo.py 里边做了什么工作,就可以修改他,实现自己机器人的回复逻辑了。

msg_handler(req_msg) -> rsp_msg:消息处理函数将接收一个请求消息对象,返回一个响应消息对象。

所有机器人接收到的消息和事件,罗列在 req_msg.py 中,会作为 msg_handler 的输入,已经提取到具体的格式,用户可以根据自己的需求使用。

机器人发送消息只有两种形式,一种是 Text,另外一种是 Markdown,定义在 rsp_msg.py 文件当中。两种消息都只需要填写 content 内容即可。

七、TODO