一、引言

在MarketClaw项目中,我们需要提供一种基于飞书的轻量级对话服务,让用户无需切换复杂系统,在日常聊天场景中即可完成营销内容生成。本章的核心目标:实现用户通过飞书发送商品描述,机器人自动调用大模型生成小红书风格的营销文案并直接回复,打通“商品输入 → 文案生成 → 飞书回复”的最小闭环。

我们选择飞书开放平台作为接入渠道,因其提供了完善的企业自建应用能力和长连接机制,无需公网IP即可本地开发调试。大模型选择了DeepSeek API,主要因为它响应速度快、支持JSON结构化输出,方便我们直接生成带标题、正文、标签的文案。

二、方案设计

飞书提供两种事件接收方式:Webhook回调(需公网地址)和长连接模式(本地即可建立持久连接)。我们处于开发测试阶段,选择长连接模式,利用飞书官方SDK在本地与服务器建立WebSocket连接。

整体流程:

  • 用户通过飞书单聊向机器人发送消息(以“商品:”开头)

  • 飞书服务器通过长连接将事件推送到本地Python程序

  • 程序解析消息内容,调用DeepSeek API生成小红书文案(JSON格式)

  • 解析JSON并组装成飞书文本,调用飞书发送消息API回复用户

三、飞书应用配置

首先在飞书开放平台创建企业自建应用,命名为“MarketClaw”,并开启机器人能力。获取App IDApp Secret,后续代码中使用。

配置权限:添加im:message.p2p_msg:readonly(接收单聊消息)和im:message:send_as_bot(发送消息)。

配置事件:在“事件与回调”中选择“使用长连接接收事件”,添加im.message.receive_v1事件。最后发布应用版本,使配置生效。

四、本地环境搭建

创建项目文件夹MarketClaw-bot,使用虚拟环境并安装依赖:

python -m venv venv
venv\Scripts\activate   # Windows
pip install lark-oapi requests python-dotenv

在根目录创建.env文件,存储密钥:(因涉及个人隐私,故使用“****”代替)

FEISHU_APP_ID=****
FEISHU_APP_SECRET=****
DEEPSEEK_API_KEY=****

图4:本地项目目录结构

五、核心代码实现

5.1 长连接启动与事件注册

长连接模式下,直接使用SDK的WsClient和事件分发器。关键代码:

from lark_oapi.ws import Client as WsClient
from lark_oapi import EventDispatcherHandler
from lark_oapi.api.im.v1 import P2ImMessageReceiveV1

def main():
    handler = EventDispatcherHandler.builder("", "") \
        .register_p2_im_message_receive_v1(handle_message) \
        .build()
    ws_client = WsClient(APP_ID, APP_SECRET, event_handler=handler)
    ws_client.start()

5.2 解析用户消息

在事件处理函数中,从event.event.message提取发送者open_id和消息文本:

def handle_message(event: P2ImMessageReceiveV1):
    open_id = event.event.sender.sender_id.open_id
    content = json.loads(event.event.message.content)
    user_text = content.get("text", "")

5.3 调用DeepSeek生成文案

设计system prompt要求返回JSON格式(标题、正文、标签),调用API后解析JSON并组装成回复文本:

def generate_copy(product_info):
    prompt = """请根据商品信息生成小红书种草文案,返回JSON:
{"title":"...","body":"...","hashtags":["..."]}"""
    resp = requests.post("https://api.deepseek.com/chat/completions", 
                         headers={"Authorization": f"Bearer {DEEPSEEK_API_KEY}"},
                         json={"model":"deepseek-chat","messages":[{"role":"system","content":prompt},{"role":"user","content":product_info}]})
    data = resp.json()["choices"][0]["message"]["content"]
    # 解析JSON并格式化...

5.4 发送消息到飞书

发送消息采用HTTP API,注意receive_id_type必须放在URL参数中,否则会报错。

def send_reply(open_id, text):
    token = get_tenant_access_token()  # 通过app_id/app_secret换取
    requests.post("https://open.feishu.cn/open-apis/im/v1/messages",
                  params={"receive_id_type": "open_id"},
                  headers={"Authorization": f"Bearer {token}"},
                  json={"receive_id":open_id, "msg_type":"text", "content":json.dumps({"text":text})})

5.5 防重复回复

测试中发现有时机器人会重复回复相同内容。原因是飞书在网络波动时可能重推事件(虽消息ID不同但内容相同)。我们增加基于(open_id, user_text, 时间窗口)的去重机制,5分钟内相同内容不再处理。

六、遇到的问题与解决

  • 导入错误Message类从lark_oapi顶层导入失败 → 改为从lark_oapi.api.im.v1导入CreateMessageRequest

  • 获取open_id失败:误用message.sender → 正确路径为event.event.sender.sender_id.open_id

  • 发送消息字段验证失败receive_id_type is required → 将该字段从请求体移到URL参数中。

  • 重复回复:飞书重推导致 → 增加内容级去重。

  • JSON解析失败:DeepSeek偶尔返回包含注释或多余文本 → 用正则提取JSON对象。

七、成果展示

在手机飞书中搜索机器人“MarketClaw”,发送“商品:智能台灯,卖点:护眼无蓝光、亮度可调、定时关灯”,机器人约3秒后回复完整的小红书文案(含标题、正文、标签)。终端日志显示长连接正常、消息发送成功。

图5:终端输出,长连接已建立且消息发送成功

图6:飞书对话演示,用户输入商品信息,机器人返回小红书风格文案

八、总结

本章实现了飞书机器人对话生成营销文案的核心功能,完成了“商品输入 → 文案生成 → 回复”的闭环。后续我将开发热点信息采集模块,使文案能够结合时事热点,进一步提升营销效果。

完整代码已上传Gitee:https://gitee.com/cusir666/MarketClaw

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐