Python 工厂模式封装 Webhook 群聊机器人
引言
在企业级应用中,向特定群组自动推送消息是常见需求。例如:监控系统报警推送、销售线索通知、运营活动提醒等。通常的做法是在群聊中添加一个自定义机器人,通过服务端调用 webhook 地址,即可将外部系统的通知消息即时推送到群聊中。
主流 IM 平台(如飞书、钉钉、企业微信)均提供了类似的 Webhook 接入能力,但不同平台的签名算法、请求参数格式存在差异。如果业务代码中直接硬编码了具体平台的实现,一旦需要切换平台或新增支持的平台,所有调用处的代码都需要修改,导致系统耦合度高,维护成本大。
本文介绍如何使用 Python 的工厂模式(Factory Pattern)来封装 Webhook 群聊机器人,实现创建对象与使用对象的解耦,提高代码的可维护性和可扩展性。
问题分析
在初始阶段,我们可能会为每个平台编写独立的类,并在业务逻辑中直接实例化:
feishu = FeiShuChatBot(webhook_url="xxx", secret="xxxx")
feishu.send_msg("test msg")
dingtalk = DingTalkChatBot(webhook_url="xxx", secret="xxxx")
dingtalk.send_msg("test msg")
这种方式的缺点显而易见:
- 耦合性强:业务逻辑依赖具体实现类。
- 扩展困难:新增企微机器人时,需修改多处业务代码。
- 配置不灵活:无法通过配置文件动态切换机器人类型。
解决方案:工厂模式
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过一个共同的接口来引用具体类型的对象。
对于 Webhook 群聊机器人场景,我们可以定义一个抽象基类 BaseChatBot 规范通用方法(如 send_msg),然后为每个平台实现具体的子类。最后,创建一个 ChatBotFactory 工厂类,根据传入的类型参数动态返回对应的机器人实例。
1. 异常定义
首先定义统一的异常类,便于上层捕获和处理发送错误。
# exceptions.py
class SendMsgException(Exception):
"""消息发送异常"""
pass
2. 抽象基类
定义机器人基类,包含初始化逻辑和抽象方法。
# chatbot/base.py
import hmac
import base64
import hashlib
import time
from urllib.parse import quote_plus
import requests
from abc ABC, abstractmethod
():
():
.webhook_url = webhook_url
.secret = secret
() -> :
NotImplementedError
():
NotImplementedError


