背景
公司用企业微信做客服,每天重复回答大量相似问题。试过龙虾(OpenClaw),个人聊天场景确实好用,但企业客服场景有些不够:
- 需要对接企微的客服 API(不是个人聊天)
- 需要自选模型(Claude/GPT/DeepSeek,哪个便宜用哪个)
- 需要对话记忆(客户分多次问,上下文不能丢)
- 需要自部署(客户数据不能跑到第三方平台)
找了一圈没有现成的轻量方案,就自己写了一个开源框架:WeComBot。
GitHub:github.com/hi-xXX/weco… PyPI:
pip install wecom-ai-bot
分享一下实现过程,希望对有类似需求的同学有帮助。
最终效果
10 行核心代码,企微客服就能自动回复 AI 生成的内容:
from wecombot import WeComBot
from wecombot.ai import AIChatHandler
from wecombot.ai.providers import AnthropicProvider
from wecombot.memory import LocalMemory
bot = WeComBot("config.yaml")
provider = AnthropicProvider(api_key="你的API Key")
memory = LocalMemory("./history")
ai = AIChatHandler(provider=provider, memory=memory,
system_prompt="你是XX公司的客服助手,回答要简洁专业。")
@bot.on_text
async def handle(bot, msg):
reply = await ai.handle(msg.content, msg.external_userid)
await bot.reply(msg, reply)
bot.run()
技术方案
为什么用企微客服 API 而不是 Webhook?
企微有两种机器人接入方式:
| Webhook 机器人 | 客服 API | |
|---|---|---|
| 能力 | 只能往群里发消息 | 完整收发、加解密、客户管理 |
| 场景 | 告警通知 | 对外客服 |
| 双向通信 | ❌ | ✅ |
| 适合 AI 对话 | 不适合 | 适合 |
客服 API 才是做 AI 客服的正确选择。
架构
客户微信 → 企微客服 → Webhook回调 → WeComBot → AI模型 → 回复
↓
AES-CBC 解密
消息去重
异步处理
核心模块:
- 消息加解密:企微回调消息是 AES-CBC 加密的,必须正确解密
- Token 管理:access_token 有效期 2 小时,需缓存+自动刷新
- 消息去重:企微可能重复推送同一条消息,用 msgid 做去重
- 异步处理:收到回调立即返回 200,AI 处理放后台
多模型支持
不绑定任何一家 AI 服务,通过 Provider 抽象层支持所有主流模型:
# Claude
from wecombot.ai.providers import AnthropicProvider
provider = AnthropicProvider(api_key="sk-ant-xxx")
# GPT
from wecombot.ai.providers import OpenAIProvider
provider = OpenAIProvider(api_key="sk-xxx")
# DeepSeek(或任何 OpenAI 兼容接口)
provider = OpenAIProvider(
api_key="你的key",
base_url="https://api.deepseek.com/v1"
)
# 本地 Ollama
provider = OpenAIProvider(base_url="http://localhost:11434/v1")
所有 Provider 都是纯 httpx 实现,不依赖任何官方 SDK,零外部依赖冲突。
对话记忆
客服场景需要记住上下文。框架内置两种记忆方案:
- LocalMemory:JSON 文件存储,每个客户一个文件,适合单机部署
- RedisMemory:Redis 存储,支持多实例共享,适合集群部署
# 单机
memory = LocalMemory("./history")
# 集群
from wecombot.memory import RedisMemory
memory = RedisMemory(redis_url="redis://localhost:6379")
插件系统
除了 AI 对话,还可以用插件处理特定场景:
from wecombot.plugins import BasePlugin
class PriceQueryPlugin(BasePlugin):
name = "price_query"
description = "查询产品价格"
async def can_handle(self, message):
return "价格" in message.content or "多少钱" in message.content
async def handle(self, bot, message):
# 查数据库,返回价格
return "我们的标准版价格是 999 元/年,详情请咨询销售。"
bot.use(PriceQueryPlugin())
插件优先于 AI 处理——匹配到插件就直接回复,不消耗 AI token。
部署
Docker 一键启动:
docker compose -f docker/docker-compose.yml up -d
用 cloudflared 暴露到公网(免费):
cloudflared tunnel --url http://localhost:8000
把 tunnel URL 填到企微后台的回调地址里就完事了。
企微后台配置(5 分钟)
- 登录 企微管理后台
- 进入「客服」→ 创建客服账号
- 记下
corp_id、secret、kf_account - 设置回调 URL,获取
token和encoding_aes_key - 填入
config.yaml
详细图文教程见 文档。
合规说明
项目仅使用企业微信官方开放 API,不涉及任何逆向工程或非授权协议。
这和 WeChatPadPro、itchat 等方案有本质区别——那些走的是非官方协议,有法律风险(已有判赔 500 万的案例)。企微客服 API 是腾讯自己开放的,完全合规。
源码
MIT 协议开源,欢迎 Star 和 PR:
- GitHub:github.com/hi-xXX/weco…
- PyPI:
pip install wecom-ai-bot
如果你也在做企微 AI 客服,欢迎交流。