惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

郑文峰的博客

使用dify对接飞书多维表格 服务启动时出现 OOM Bug 通缉令 一次服务升级时pg表DDL执行超时失败 Go语言高性能编程 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络 理解Linux TunTap设备 快速了解iptables kafka中listener和advertised.listeners的作用 django rest_framework 分页 django后端服务、logstash和flink接入VictoriaMetrics指标监控 python中import原理 docker容器单机网络 手动实现docker容器bridge网络模型 mysql之MVCC原理 mysql之日志 使用java开发logstash的filter插件 使用python实现单例模式的三种方式 redis之缓存 redis之分片集群 redis之哨兵机制 redis之主从库同步 redis之持久化 redis之五种基本数据类型 go中如何处理error pod中将代码与运行环境分离 友链 ddt源码分析 python装饰器的使用方法 读书笔记:如何阅读一本书 使用ddt实现unittest的参数化测试 分布式锁 使用kubeadm安装k8s 优化gin表单的错误提示信息 gin中validator模块的源码分析 go简单使用grpc python简单使用grpc k8s之PV、PVC和StorageClass k8s之StatefulSet k8s之DaemonSet k8s之Job和CronJob k8s之ConfigMap和Secret k8s之Service k8s之Pod k8s之Deployment 容器的本质 docker容器 python迭代器与生成器 python元编程 python垃圾回收机制 python上下文管理器 django rest_framework使用jwt django rest_framework异常处理 django rest_framework 自定义文档 django压缩文件下载 django rest_framework使用pytest单元测试 django restframework choice 自定义输出数据 django Filtering 使用 django viewset 和 Router 配合使用时报的错 django model的序列化 django中使用AbStractUser django.core.exceptions.ImproperlyConfigured Application labels aren't unique, duplicates users django 中 media配置 django 外键引用自身和on_delete参数 django 警告 while time zone support is active Flask使用flask_socketio实现websocket flask结合mongo tornado 文件上传 tornado 使用jwt完成用户异步认证 tornado 用户密码 bcrypt加密 tornado 结合wtforms使用表单操作 tornado finish和write区别 tornado 使用peewee-async 完成异步orm数据库操作 pyspark streaming简介 和 消费 kafka示例 使用hue创建ozzie的pyspark action workflow
使用n8n对接飞书多维表格
2026-02-23 · via 郑文峰的博客

# 前言

本文主要记录自己使用n8n构建workflow流程,通过麦当劳的mcp mcd (opens new window)获取麦当劳优惠日历信息然后保存到飞书的多维表格中。

17718467102211771846710169.png

# 创建飞书工作台

在飞书开放平台中的工作台 (opens new window)中创建企业自建应用。

17722797752481772279775145.png

进入应用中添加多维表格的权限。

17718472322221771847231833.png

# 创建多维表格并关联应用

提前创建好多维表格,新建表头为:活动日期、活动标题、活动内容,原始图片链接

17722799132491772279913117.png

给当前多维表格添加上面新增的应用。

17718979023721771897901411.png

17718979543721771897953751.png

# 获取 mcd mcp 的token

打开页面麦当劳的 mcp 平台 (opens new window),然后进行登录并获取到token

17722818102541772281809328.png

# 搭建n8n

因为n8n saas版本需要收费,而它又是开源的,所以参考n8n官方文档 (opens new window),使用 docker 本地启动n8n服务。

docker volume create n8n_data
docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

1
2

启动成功后,访问 http://localhost:5678 (opens new window),创建用户并登录

# 配置 AI Agent

创建一个 AI Agent Node,名称为麦当劳情报官,User Message 让它调用mcd mcp campaign-calender 来获取活动日历信息,然后输出json格式的信息,内容如下所示:

**核心任务**:
1. 调用 `campaign-calender` 获取活动日历。
2. **数据处理**: 
   - 将获取到的活动信息整理为 JSON 格式。
   - 必须包含字段: `活动日期`, `活动标题`, `活动内容`, `原始图片链接`。
   - **关键调整 - 活动内容 (Activity Content)**: 
     - 必须生成为**一段紧凑的文本**,**严禁换行**。
     - 模仿**朋友圈/小红书**文案风格,使用 Emoji 来分割不同的关键点。
     - 格式参考: "💥开年💥劲爆💥事件!㊙️某神秘巨星天团🛫空降常驻随心配1+1🌟「鱼酷玉咖牛」五大巨星🙋个个都是美味&品质担当👀连带着随心配也全面焕新💘红白配变蓝粉配,超养眼🔍记得来麦一探究竟!"
3. **输出要求**:
   - 仅输出纯 JSON 数组,不要包含 Markdown 代码块标记(如 ```json),也不要任何解释性文字。
   - 格式示例: `[{"活动日期": "...", "活动标题": "...", "活动内容": "💥开年...", ...}]`

1
2
3
4
5
6
7
8
9
10
11
12

在 System Message 中添加角色内容:

**角色设定**: 你是麦当劳总部的“麦麦情报局长”,负责掌握所有最新的营销活动信息。你的说话风格专业、热情,带有麦当劳特色(喜欢用🍟、🍔等emoji)。

1

17718974953731771897494439.png

创建 openapi chat model来对接AI Agent,我这里使用七牛云的大模型服务,首次体验有 1000万的 Token 免费送,可以通过邀请链接获取 https://s.qiniu.com/NnyiMn (opens new window)

在七牛云上可以获取到模型的 API KEY

17718485412181771848541154.png

然后配置到 openapi chat model中

17718484662181771848465520.png

创建 MCP Client 对接到 AI Agent中,token 通过上面的步骤获取获取 mcd mcp 的token

17718973613741771897361329.png

然后可以点击 Execute step 来进行测试,获取到活动信息。

17718980473701771898047155.png

# 清洗数据

因为模型返回的json数据会包含markdown格式的 ```json 内容 ```,所以需要使用一段js脚本来清洗数据,将 ```json 内容 ``` 转换成纯json数据。

const aiOutput = items[0].json.output || $node["Agent"].json.output;

function robustParse(input) {
    if (typeof input === 'object' && input !== null) return input;

    let str = String(input).trim();
    // 1. 去除 Markdown 代码块标记
    str = str.replace(/^```json\s*/i, '').replace(/^```\s*/i, '').replace(/\s*```$/, '');

    // 2. 尝试标准解析
    try { return JSON.parse(str); } catch (e) {}

    // 3. 修复被截断的 JSON 数组
    if (str.startsWith('[') && !str.endsWith(']')) {
        for (let i = str.length - 1; i >= 0; i--) {
            if (str[i] === '}') {
                const potentialJson = str.substring(0, i + 1) + ']';
                try {
                    const res = JSON.parse(potentialJson);
                    if (Array.isArray(res) && res.length > 0) return res;
                } catch (e) {}
            }
        }
    }

    // 4. JS 引擎执行
    try { return (new Function("return (" + str + ");"))(); } catch (e) {}

    // 5. 【新增】文本兜底:如果不是 JSON,直接作为文本返回
    // 只要不以 { 或 [ 开头,就默认是普通文本(如战报)
    if (!str.startsWith('{') && !str.startsWith('[')) {
        return { "text_content": str }; // 封装为对象
    }

    return null;
}

try {
    if (!aiOutput) throw new Error("AI 没有返回 output 字段");

    const parsedData = robustParse(aiOutput);

    if (!parsedData) {
        const preview = aiOutput.length > 100 ? aiOutput.slice(0, 100) + "..." : aiOutput;
        throw new Error(`解析彻底失败,原始内容: ${preview}`);
    }

    // 统一格式化为数组
    const resultItems = Array.isArray(parsedData) ? parsedData : [parsedData];
    return resultItems.map(item => ({ json: item }));

} catch (error) {
    throw new Error(`JSON解析错误: ${error.message}`);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

# 配置飞书

首选需要下载社区插件飞书

17718983343691771898333607.png

17718983903691771898389604.png

17718984343681771898434257.png

将 n8n-nodes-feishu-lite 名称填入上一个步骤的安装node的输入框中

17718985853691771898584886.png

新增飞书 Node 选择多维表格新增记录,内容填如下所示

17719017293391771901728837.png

其中的飞书的 Appid 和 AppSecret 可以在飞书开放平台新增的应用页面中获取

17719018993381771901898723.png

多维表格的 Token 和 ID 可以在表格链接中获取,如下面链接所示

https://pjduxy64p5.feishu.cn/base/{Token}table={ID}

1

请求体 JSON 内容如何:

{
    "fields": {
        "活动日期": "{{ $json['活动日期'] }}",
        "活动标题": "{{ $json['活动标题'] }}",
        "活动内容": "{{ $json['活动内容'] }}",
        "原始图片链接": "{{ $json['原始图片链接'] }}"
    }
}

1
2
3
4
5
6
7
8

17719021093391771902108456.png

# 运行

点击 Execute Workflow 按钮可以开始运行,运行后,查看飞书表格中的数据如下所示:

17719021473391771902147117.png