1. 项目背景与核心需求
最近在帮团队配置OpenClaw对接飞书机器人的自动化回复功能时,发现一个痛点问题:默认情况下飞书机器人必须被@才会响应,这在几十人的大群里非常影响使用体验。经过两天摸索,终于找到了让机器人自动监听并回复所有群消息的完整解决方案。
这个方案特别适合需要实时监控群聊关键词的客服场景,或是自动收集反馈的运营场景。比如当用户提到"报销"、"请假"等关键词时,机器人能立即触发预设流程,无需人工@操作。下面就把具体实现步骤和踩坑经验完整分享给大家。
2. 环境准备与基础配置
2.1 飞书开发者账号申请
首先需要登录飞书开放平台(https://open.feishu.cn/),在"开发者后台"创建企业自建应用。注意要选择"机器人"应用类型,并记录下App ID和App Secret这两个关键凭证。
重要提示:创建应用时务必勾选"机器人"权限,并在"权限管理"中开启"获取群组中所有消息"权限。这是实现免@的关键前提。
2.2 OpenClaw服务部署
推荐使用Docker快速部署OpenClaw服务:
docker run -d --name openclaw \ -p 8080:8080 \ -e APP_ID=你的飞书AppID \ -e APP_SECRET=你的飞书AppSecret \ openclaw/openclaw:latest部署完成后访问http://你的服务器IP:8080 应该能看到管理界面。这里建议配置Nginx反代并启用HTTPS,具体步骤可参考官方文档。
3. 关键配置实现免@响应
3.1 事件订阅配置
在飞书开放平台找到"事件订阅"菜单,需要配置两项核心内容:
- 请求地址填写:
https://你的域名/feishu/event - 订阅事件勾选:
- 接收消息v2.0
- 群组消息已读v1.0
- 消息撤回事件v1.0
特别注意:飞书要求请求地址必须支持HTTPS且返回固定校验字符串。OpenClaw已内置校验逻辑,但需要确保你的域名证书有效。
3.2 消息处理逻辑开发
在OpenClaw中创建message_handler.py文件,核心代码如下:
async def handle_group_message(event): # 检查消息类型和群组ID if event.event.message.chat_type != "group": return # 获取原始消息内容 msg_content = json.loads(event.event.message.content) text = msg_content.get("text", "").strip() # 关键词匹配逻辑 if "报销" in text: await reply_message(event, "请提交报销单至OA系统...") elif "请假" in text: await reply_message(event, "请假流程请参考...")3.3 免@触发配置
在飞书机器人后台找到"高级设置",开启"接收所有群消息"选项。这个隐藏选项需要联系飞书客服开通企业权限才能看到。
4. 常见问题与解决方案
4.1 消息重复响应问题
现象:机器人对同一条消息回复多次 解决方法:
# 在handler开头添加去重逻辑 message_id = event.event.message.message_id if cache.get(message_id): return cache.set(message_id, True, timeout=60)4.2 敏感词过滤失效
现象:机器人响应了不该处理的消息 推荐方案:
- 在飞书后台配置"敏感词管理"
- 在代码中添加前置过滤:
blacklist = ["赌博", "诈骗"] if any(word in text for word in blacklist): return4.3 性能优化建议
当群消息量较大时(>100条/分钟),建议:
- 使用Redis缓存消息记录
- 对关键词匹配使用Trie树算法
- 异步处理耗时操作(如调用外部API)
5. 进阶功能扩展
5.1 上下文对话实现
通过维护对话状态,可以实现多轮对话:
# 使用redis存储对话上下文 user_id = event.event.sender.sender_id context = redis.get(f"dialog:{user_id}") if context == "waiting_for_reason": await handle_leave_reason(event) redis.delete(f"dialog:{user_id}")5.2 消息卡片交互
飞书支持丰富的消息卡片,示例按钮响应代码:
async def handle_card_action(event): action = event.action.value if action == "confirm": await update_card("操作已确认")整个配置过程中最关键的三个检查点:
- 飞书后台必须开通"接收所有群消息"权限
- 事件订阅URL必须通过飞书校验
- OpenClaw服务需要公网可访问的HTTPS地址
配置完成后,可以通过在群内发送测试消息验证功能。如果遇到403错误,通常是权限配置不全导致的,建议按文档重新检查各环节权限设置。