综合实战:日报自动生成系统

2 阅读4分钟

到第6节了。这一节把前5节的知识全部串起来——数据采集、数据处理、报告生成、云端存储、消息推送。做一个完整的端到端自动化项目:日报自动生成系统。


1. 项目需求

目标

每天自动生成一份工作日报,推送到飞书群,并存档到乐享知识库。

输入

  • OUCN 平台的任务数据(浏览器采集)
  • 内部系统的审批数据(API 查询)

输出

  • 一份 Markdown 格式的日报
  • 飞书群推送
  • 乐享知识库存档

流程

定时触发(每天 18:00)
    ↓
Skill 执行
    ├→ 浏览器采集 OUCN 数据(Skill)
    ├→ MCP 查询内部 API(MCP)
    ├→ AI 生成日报(Skill)
    ├→ 飞书推送( MCP)
    └→ 乐享存档(MCP)

2. 数据采集层

浏览器采集(Skill + CDP)

async def collect_ouchn_data():
    """用浏览器采集 OUCN 数据"""
    # 登录
    await browser_login()

    # 采集任务数据
    tasks = []
    for page in range(1, 10):
        await browser.goto(f"/task/list?page={page}")
        await browser.wait(".task-list")

        items = await browser.query_all(".task-item")
        for item in items:
            tasks.append({
                "title": await item.text(".title"),
                "status": await item.text(".status"),
                "count": await item.text(".count")
            })

    return tasks

API 查询(MCP 连接器)

async def get_approval_data():
    """用 MCP 查询审批数据"""
    result = await mcp_call(
        connector="内部系统",  # 自定义 MCP Server
        tool="get_approvals",
        params={
            "date": "today",
            "status": "pending"
        }
    )
    return result

3. 数据处理层

AI 生成报告

async def generate_daily_report(ouchn_data, approval_data):
    """用 AI 生成日报"""

    prompt = f"""
    根据以下数据生成今日工作日报:

    ## OUCN 任务
    {format_tasks(ouchn_data)}

    ## 审批事项
    {format_approvals(approval_data)}

    要求:
    1. 用 Markdown 格式
    2. 包含完成统计和明细
    3. 列出需要跟进的事项
    4. 简洁明了
    """

    report = await ai.generate(prompt)
    return report

4. 输出层

飞书推送

async def notify_feishu(report):
    """飞书推送日报"""

    # 先转成卡片格式
    card = build_report_card(report)

    await mcp_call(
        connector="飞书",
        tool="send_message",
        params={
            "chat_id": "daily-report",
            "message_type": "interactive",
            "content": card
        }
    )

乐享存档

async def archive_to_lexiang(report):
    """存档到乐享"""

    # 先创建文档
    doc = await mcp_call(
        connector="乐享",
        tool="create_doc",
        params={
            "title": f"日报 - {datetime.today().strftime('%Y-%m-%d')}",
            "content": report,
            "kbId": "daily-reports-kb"
        }
    )

    return doc["docId"]

5. 定时调度

Automation 配置

automation:
  name: "daily-report"
  schedule: "每天 18:00"
  timezone: "Asia/Shanghai"

  skill: "daily-report-generator"

  params:
    recipients:
      - "ouchn-daily"
      - "zhangsan"

触发流程

18:00 → Automation 触发
    ↓
Skill 执行 daily-report-generator
    ↓
数据采集 → 处理 → 生成
    ↓
飞书推送 ← 乐享存档

6. 完整代码

Skill 定义

name: "daily-report-generator"
description: "每日自动生成工作日报"

steps:
  - name: "collect_ouchn"
    action: "browser_task"
    params:
      task: "采集 OUCN 今日任务"

  - name: "query_approval"
    action: "mcp_call"
    params:
      connector: "内部API"
      tool: "get_today_approvals"

  - name: "generate_report"
    action: "ai_generate"
    params:
      prompt: "根据以下数据生成日报..."

  - name: "notify_feishu"
    action: "mcp_call"
    params:
      connector: "飞书"
      tool: "send_message"
      message: "{{ report }}"

  - name: "archive_lexiang"
    action: "mcp_call"
    params:
      connector: "乐享"
      tool: "create_doc"
      title: "日报 - {{ date }}"
      content: "{{ report }}"

7. 运维监控

日志记录

async def run_daily_report():
    start_time = time.time()

    try:
        # 各步骤日志
        log("开始采集 OUCN 数据")
        ouchn = await collect_ouchn_data()
        log(f"OUCN 数据: {len(ouchn)} 条")

        log("开始查询审批数据")
        approval = await get_approval_data()
        log(f"审批数据: {len(approval)} 条")

        log("生成日报")
        report = await generate_daily_report(ouchn, approval)

        log("飞书推送")
        await notify_feishu(report)

        log("乐享存档")
        await archive_to_lexiang(report)

        log("日报生成完成")

    except Exception as e:
        log(f"日报生成失败: {e}")
        # 告警
        await notify_error(str(e))

    finally:
        duration = time.time() - start_time
        log(f"总耗时: {duration:.1f}秒")

告警配置

async def notify_error(error_msg):
    await mcp_call(
        connector="飞书",
        tool="send_message",
        params={
            "chat_id": "alert-group",
            "content": f"❌ 日报生成失败:{error_msg}"
        }
    )

8. 扩展方向

这个系统可以扩展:

方向说明
周报加个周末汇总逻辑
月报改为每月1号生成
多报表加财务、运营等报表
AI 分析加入数据洞察和建议

小结

学会的要点
端到端自动化数据采集 → 处理 → 输出,全链路自动化
双通道采集浏览器 + MCP API 互补
AI 辅助用 AI 生成结构化报告
多渠道输出飞书推送 + 乐享存档
定时调度Automation 每天自动跑
运维监控日志 + 错误告警

技术路线

1节:理解 MCP ✅
    ↓
第2节:乐享连接器 ✅
    ↓
第3节:自定义 MCP Server ✅
    ↓
第4节:MCP + Skill 组合技 ✅
    ↓
第5节:消息通知全集成 ✅
    ↓
第6节(本文):综合实战 - 日报自动生成系统 ✅

📺 系列文章:

基础篇(Skill 开发)

  • 第1-8节:8篇已完结

连接器篇(MCP 实战)

MCP 实战系列完结 🎉