10分钟搭建能回消息的企微机器人
潘忠显 / 2023-12-20
本文介绍如何利用一个 50行的 Python文件,10分钟内创建起一个可以回复消息的企业微信群机器人。如果项目能给你带来些许便利,请不吝加星 Star
一、背景
最近在做需求的时候,经常会遇到产品同学找我来查询某个ID对应的细节。ID对应的细节,需要查询 Redis/ElasticSearch 来获得数据。之前会手动去查询,之后改成HTTP服务,最终改成企业微信机器人【接收回复消息】。
使用企业微信机器人的好处:
- 不受网络环境的限制
- 交互性强,不需要记复杂链接地址
- 有用户信息,方便控制权限
如果从0去创建企业微信机器人及其服务,会比较麻烦:需要调用给的加解密API,自己HTTP服务,并且要自己实现消息的解析、校验和解密。这无形中,提高了创建微信群机器人使用门槛。
其实,没有必要每个人都将上边的提到的“麻烦”都再去经历一遍。我这里就是将公共功能,即HTTP服务、消息解析、校验、解密做了封装,使用者只需要pip安装一下,就可以创建一个 Server,只需要实现一下消息处理函数,即可拉起群机器人的服务。
接下来,我们将快速搭建起一个回复消息的企微机器人。
二、添加机器人并命名
拉两个熟人建群,点击右上角 … 添加群机器人:
【重要】输入名字,这里名字后边会用到,继续点击添加机器人按钮:
获得webhook地址,我们这里用不到,继续点击”配置说明“:
点击”接收消息配置“页签,我们为了使用demo,这里先将 Token 和 AESKey 填成固定的 3个x 和 43个x:
我们这里还没有服务对吧?接下来我们去部署服务。
三、部署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平台来部署:
然后做一些相应的操作,给该服务产生一个可以访问的链接。然后将这个链接+路径(demo中是/wecom_bot
)配置到机器人配置留空的URL中:
点击保存,如果保存失败,说明服务部署有问题,需要检查。
四、测试机器人
不知不觉中,你已经完成了机器人的部署,接下来我们来测试一下 demo 机器人的基础功能。
- 在群中发送消息。demo里有实现 help 和普通消息的回复功能:
- 可以移除再添加,这里展示的是加入群的事件触发消息发送的功能:
- 查看机器人资料,有一个发布到公司的按钮,只有发布之后的机器人,才能被公司其他同事搜索到,才可以被添加到其他的群聊当中:
五、Token和AESKey的管理
上边为了方便,demo中直接使用固定的 Token 和 AESKey,实际使用中,建议直接利用机器人配置页面的随机生成按钮获得。
删除代码中传入的 token 和 key,直接将其以配置的方式传入到服务中即可(三个环境变量 WX_BOT_TOKEN
, WX_BOT_AES_KEY
, WX_BOT_CORP_ID
):
server = app.WecomBotServer(bot_name, host, port, path='/wecom_bot')
六、demo.py 代码解析
只要你看懂了 demo.py 里边做了什么工作,就可以修改他,实现自己机器人的回复逻辑了。
msg_handler
: 消息处理函数,简单的实现了 help 和普通消息的回复功能event_handler
: 事件处理函数,简单的实现了加入群聊的事件触发消息发送的功能WecomBotServer
: 企业微信机器人回调服务的接口服务,实现了加解密的功能,运行后能拉起 HTTP 服务- 通过
set_message_handler
和set_event_handler
将消息处理函数和事件处理函数注册到服务中
msg_handler(req_msg) -> rsp_msg
:消息处理函数将接收一个请求消息对象,返回一个响应消息对象。
所有机器人接收到的消息和事件,罗列在 req_msg.py 中,会作为 msg_handler 的输入,已经提取到具体的格式,用户可以根据自己的需求使用。
机器人发送消息只有两种形式,一种是 Text,另外一种是 Markdown,定义在 rsp_msg.py 文件当中。两种消息都只需要填写 content 内容即可。
七、TODO
- 单独启一个端口,接收主动发送消息的触发,然后让机器人在对应的群聊里发送消息