标签 工作流自动化 下的文章

https://linux.do/t/topic/1465569?u=yeahhe




📌 转载信息
原作者: yeahhe
转载时间: 2026/1/25 08:05:53

从上次说起

我的skill都可以在这里看到

安装也是非常的简洁

npx skills add BenedictKing/codex-review
npx skills add BenedictKing/tavily-web
npx skills add BenedictKing/context7-auto-research
npx skills add BenedictKing/exa-search
npx skills add BenedictKing/firecrawl-scraper

上下文占用非常少,主打的就是一个省钱还好用


📌 转载信息
原作者: Foward
转载时间: 2026/1/25 08:04:37

点赞 + 关注 + 收藏 = 学会了

整理了一个n8n小专栏,有兴趣的工友可以关注一下 👉 《n8n修炼手册》

不管是在电脑还是 NAS 通过 Docker 部署 n8n,环境变量没配置好的话,使用 Read/Write Files from Disk 节点「读取本地本地」或者「保存文件到本地」,有可能出现这个报错。

这是 Docker + n8n 文件系统权限/路径隔离 的经典问题,不是 n8n 节点用错,而是容器只能访问被允许的目录

⚠️⚠️⚠️

想解决这个问题,首先要将你 n8n 上已有的工作流等数据找个地方保存好。因为要改环境变量,有可能会丢失数据。

⚠️⚠️⚠️

在电脑用 Docker 部署

打开 Docker,首先要在 Containers 里删掉部署好的 n8n。

然后到 Images,假设你没删掉 n8n 镜像的话,重新点击一下运行按钮。

删掉镜像了就重新拉一遍吧。可以参考《『n8n』环境搭建》

点击运行按钮后,需要添加在 Volumes 里添加一项(下图红框)。

在你的电脑,找个位置创建要给文件夹。

  • 上图红框的 Host path 这项就填入你在电脑创建的文件夹的绝对路径。
  • Container path 这项填入 /home/node/.n8n-files,必须是这个值!一个字一个符号都不能少!

然后点击“Run”按钮(弹窗右下角蓝色底色那个按钮)。

之后再浏览器输入 localhost:5678 就能运行 n8n 了。

接下来使用 Read/Write Files from Disk 节点读写文件,都是指向你刚刚在电脑创建的那个文件夹。

比如我的 /home/node/.n8n-files 指向了 文稿/n8n-data 这个文件夹,里面有一个 hello.txt 文件。

在 n8n 里使用 Read/Write Files from Disk 节点时,File(s) Selector 项需要这么写:

/home/node/.n8n-files/hello.txt

可以看到文件读取成功了。

记住记住!用法是这样的,别问为什么⬇️⬇️⬇️

/home/node/.n8n-files/文件名.后缀

在绿联 NAS 部署

如果你是在 NAS 上部署 n8n,通常使用 Docker 部署的吧~

不管你是用群晖还是其他牌子的NAS,如果使用新建项目,用是 yaml 拉镜像。

services:
  n8n:
    image: n8nio/n8n:latest   # 为了汉化成功,这里需要指定镜像版本号
    container_name: n8n
    ports:
      - 5678:5678
    volumes:
      - n8n:/home/node/.n8n # 冒号前面映射n8n文件夹绝对路径
      - n8n-files:/home/node/.n8n-files # 冒号前面映射n8n-files文件夹绝对路径
    restart: unless-stopped

那么 yaml 的代码必须在 volumes 里加一项 - n8n-files:/home/node/.n8n-files。冒号前面的 n8n-files 是允许 n8n 读写文件的文件夹的绝对路径

如果你是使用《『NAS』不止娱乐,NAS也是生产力,在绿联部署AI工作流工具-n8n》里提到的方法,在 Docker 的「镜像」模块里搜索 n8n 下载部署的话,需要这么做。

我用绿联 NAS 举例,其他品牌的 NAS 操作方法大同小异。

在 Docker 的「容器」里找到 n8n,停止运行。

然后编辑它。

在 NAS 的「文件管理」里创建一个文件夹,用来给 n8n 读写文件使用的。

然后在「编辑容器」的「存储空间」里添加一项 /home/node/.n8n-files 指向那个文件夹,提供“读写”权限,如下图红框所示。

点击“保存”按钮,然后运行项目。

我在 NAS 的 n8n-files 文件夹里准备了一个 雷猴世界.txt 文件。

在 n8n 里,使用 /home/node/.n8n-files/雷猴世界.txt 这个路径就能读取到上面这个文件了。

同样,也是这个格式:

/home/node/.n8n-files/文件名.后缀

以上就是本文的全部内容啦,想了解更多n8n玩法欢迎关注《n8n修炼手册》👏

如果你有 NAS,我非常建议你在 NAS 上部署一套 n8n,搞搞副业也好,帮你完成工作任务也好 《『NAS』不止娱乐,NAS也是生产力,在绿联部署AI工作流工具-n8n》

点赞 + 关注 + 收藏 = 学会了

一、引言:为什么选择TextIn与Coze搭建财报机器人?

面对季度、年度财报堆叠如山的PDF文档,技术团队如何快速、准确地将其中复杂的表格数据转化为结构化信息?本文将介绍一种高效实践方案:利用TextIn的智能文档解析能力,结合Coze的自动化工作流编排,快速构建一个能够处理多格式财报、抽取关键表格的自动化流程。

1.1 财报文档的典型难点

财报处理长期存在几大核心难点:

1.表格结构复杂:资产负债表、利润表等核心表格常存在跨页、续表情况,且合并报表与母公司报表两套体系并存,单元格合并频繁,对程序的结构化识别构成首要挑战。

2.文档格式多样:资料库中通常是电子PDF与扫描件图像混合共存,要求解决方案同时具备强大的文本解析与OCR版面分析能力。

3.手工处理成本高昂:三大表及附注的手动复制、粘贴、核对工作极其耗时,且容易出错,难以满足及时性、准确性要求。

1.2 TextIn+Coze方案的核心价值

本方案采用清晰的分工架构,将复杂问题模块化:

TextIn xParse引擎负责“读懂”文档:其强大的版面分析与表格识别技术,能统一处理电子PDF与扫描件,将混乱的原始文档转换为包含完整表格结构、段落标题的清晰JSON数据,为下游提取提供高质量的结构化输入。
Coze工作流负责“串联”自动化流程:可自动化编排“文件上传→调用TextIn解析→定位并抽取目标表格→输出至数据库/Excel”的完整管道。
Coze Bot 提供交互层:可构建一个对话机器人,不仅支持触发自动化流程,更能基于抽取出的数据,提供报表摘要、关键指标对比、甚至问答解释,让数据结果可直接被业务人员使用。

这种组合将专业的文档解析、灵活的业务逻辑编排与友好的交互界面相结合,使开发者能聚焦于核心的抽取规则,快速搭建从原始文档到业务可用数据的端到端流水线。

二、方案应用速览

工作流:

图片

输出结果:

图片

三、架构设计

3.1 总体链路

用户上传财报 → Coze触发工作流 → xParse → 代码节点抽取 → 输出结构化tables


图片

开始节点:接收用户上传的财报文件(File)。
TextIn插件节点:将财报解析为结构化JSON,核心使用result.detail(包含paragraph/table/image等元素)以及result.markdown。
代码节点:仅遍历detail,通过“表标题 → 后续表格”方式抽取三大表,并统一输出为tables{balanceSheet,incomeStatement,cashFlow}。
结束节点:将tables / debug / markdown输出给Bot,用于展示与后续问答分析。

3.2 数据结构约定

TextIn xParse - 插件节点的输出(result.detail / result.markdown等,详情见TextIn xParse API文档:https://docs.textin.com/xparse/parse-getjson

Response
├─ code                               # 接口状态码
├─ message                            # 状态信息
└─ result
   ├─ markdown                         # 文档级 Markdown
   └─ detail[]                         # 元素明细数组(只处理 type=table)
      └─ (仅当 item.type == "table" 时关注)
         ├─ type                        # 固定为 "table"(表格块)
         ├─ sub_type                    # "bordered"(有线) / "borderless"(无线)
         ├─ page_id                     # 表格所在页(续表拼接用)
         ├─ paragraph_id                # 表格元素ID(续表拼接用)
         ├─ rows                        # 表格行数
         ├─ cols                        # 表格列数
         ├─ text                        # 表格整体文本(md/html;展示用,抽字段优先 cells)
         ├─ continue?                   # 是否跨页/跨段续表(可选字段)
         └─ cells[]                     # 单元格数组(抽取字段核心)
            ├─ row                       # 行号(从0开始)
            ├─ col                       # 列号(从0开始)
            ├─ row_span?                 # 行合并跨度(默认1)
            ├─ col_span?                 # 列合并跨度(默认1)
            └─ text                      # 单元格文本(字段值通常从这里拿)

TextIn的返回结果中对表格块(type=table)的两种常见数据形态(务必兼容)

形态 A:HTML/Markdown 表格(最常见于工作流插件输出)


    抽取方式:解析text→ 转二维矩阵(headers/rows)
    item.text内包含<table>...</table>(或Markdown table)
    item.type == "table"


形态 B:单元格数组cells(部分接口/参数下提供)

    item.cells[]存在,包含row/col/text等
    抽取方式:优先用cells拼matrix(更结构化),不存在再回退到解析tex






财务三大表抽取 - 代码节点的输出示例(tables)
tables.balanceSheet / incomeStatement / cashFlow均为数组,设计理由如下:

同一份财报可能包含“合并 + 母公司”两套表;
或者出现“(续)”导致一张表被拆成多段;
因此用数组承载多张/多段表更稳妥,业务侧可按title/page_id再做合并与筛选。

tables

{
    "balanceSheet": [
        {
            "headers": [
                "项 目",
                "附注",
                "2025 年6 月30 日",
                "2024 年12 月31 日"
            ],
            "page_id": [
                2
            ],
            "rows": [
                [
                    "流动资产:",
                    "",
                    "-",
                    "-"
                ],
            ],
            "title": "合并资产负债表"
        },
 
 
    ],
    "incomeStatement": [
        {
            "headers": [
                "项 目",
                "附注",
                "2025 年1-6 月",
                "2024 年1-6 月"
            ],
            "page_id": [
                4
            ],
            "rows": [
                [
                    "一、营业总收入",
                    "",
                    "88,095,798,091.41",
                    "85,336,441,428.97"
                ],
            ],
            "title": "母公司利润表"
        }
    ],
    "cashFlow": [
        {
            "headers": [
                "项 目",
                "附注",
                "2025 年1-6 月",
                "2024 年1-6 月"
            ],
            "page_id": [
                5
            ],
            "rows": [
                [
                    "一、经营活动产生的现金流量;",
                    "",
                    "-",
                    "-"
                ],
            ],
            "title": "母公司现金流量表"
        }
    ]
}

Debug

"debug": {
  "detailLen": 823,
  "titleCandidates": 6,
  "hitTitles": [
    {"idx": 120, "page_id": 2, "title": "合并资产负债表"},
    {"idx": 260, "page_id": 4, "title": "母公司利润表"}
  ],
  "picked": [
    {"titleIdx": 120, "tableIdx": 125, "tableType": "balanceSheet"},
    {"titleIdx": 260, "tableIdx": 268, "tableType": "incomeStatement"}
  ],
  "tableBlocks": 12
}

3.3 关键设计点(财报专属)

标题命中策略(table_title + 关键词)
标题长度阈值(>20 跳过):避免长文档中出现“包含关键词的长句”被误判为表标题,从而误抽无关表格。
只认sub_type=table_title:优先使用版面分析识别到的“表格标题”元素,减少正文段落(header/text)误命中概率。

const TITLE_PATTERNS = {
  balanceSheet: ["资产负债表", "合并资产负债表", "母公司资产负债表"],
  incomeStatement: ["利润表", "合并利润表", "母公司利润表", "损益表", "收益表"],
  cashFlow: ["现金流量表", "合并现金流量表", "母公司现金流量表", "现金流量"],
};

function normalizeTitle(s) {
  return String(s || "")
    .replace(/\*\*/g, "")
    .replace(/[\s ]/g, "")
    .replace(/[《》]/g, "");
}
function matchType(norm) {
  for (const [k, kws] of Object.entries(TITLE_PATTERNS)) {
    if (kws.some(kw => norm.includes(kw))) return k;
  }
  return null;
}

function extractFromDetail(detail) {
  const tables = { balanceSheet: [], incomeStatement: [], cashFlow: [] };
  const debug = { hitTitles: [], picked: [], tableBlocks: 0, titleCandidates: 0 };

  for (let i = 0; i < detail.length; i++) {
    const item = detail[i];
    if (!item || typeof item !== "object") continue;

    const rawTitle = String(item.text || "");
    const title = normalizeTitle(rawTitle);

    // ✅ 简单校验:标题长度太长跳过
    if (title.length > 20) continue;

    // ✅ 查询TextIn接口返回数据中的表格标题,避免正文误命中
    if (String(item.sub_type || "").toLowerCase() !== "table_title") continue;

    const ttype = matchType(title);
    if (!ttype) continue;

四、准备工作

TextIn 开发者信息(x-ti-app-id / secret_code)

图片

在TextIn控制台(https://www.textin.com/)「开发者信息」中获取x-ti-app-id与x-ti-secret-code(下文统称 app_id/secret_code)。
建议在Coze工作流里把鉴权参数作为开始节点输入传入(便于不同环境切换),或在团队内部用变量/密钥管理统一配置。

五、工作流搭建

5.1 创建工作流

工作流命名、描述、版本说明
图片

5.2 开始节点配置

Input类型:File(接收上传文件)

图片

5.3 添加 xParse插件节点

输入映射:file → Input.file
鉴权配置:x_ti_app_id / x_ti_secret_code
输出字段说明:result.detail / result.markdown 等,输出重点使用:ParseX.result(作为代码节点输入),其中result.detail是抽表主数据源。


图片

5.4 添加代码节点(核心)

输入变量配置 (选择ParseX.result)

图片

代码职责:遍历detail→找table_title→找后续table→HTML转二维矩阵→输出 tables(代码节点源码附在文章最末尾)

图片

输出结构:tables{balanceSheet,incomeStatement,cashFlow} +debug

5.5 结束节点输出

输出给Agent:tables / markdown / debug

六、不止于抽取:更多自动化扩展方向

财报抽取机器人是一个高效的起点,接下来,基于TextIn提供的精准结构化数据与Coze灵活的工作流,还可以轻松延伸出更多智能化的数据处理能力:

续表自动合并:财报中经常存在大型表格跨页,可在工作流中添加逻辑节点,按title相同且表头一致合并 rows,并合并 page_id,彻底解决数据割裂问题。
表内锚点词校验:为确保抽取表格的完整性与正确性,可设计自动校验规则。例如,检查资产负债表中是否同时存在“流动资产”/“资产总计”科目;验证利润表是否包含“营业收入”/“净利润”;确认现金流量表是否包含“经营活动”。这一步能有效拦截因解析页面错误或文档版本差异导致的重大数据缺失。
结构化导出至Excel:将最终整理的tables列表,通过添加代码节点或Coze插件,转换为更通用的CSV或XLSX格式文件。这能让财务、业务部门的同事无缝接手,直接在Excel环境中进行后续分析与可视化。
实现智能多期对比:将工作流升级为可接收两份财报,分别提取后,系统能根据标准化的会计科目名称自动对齐数据,计算关键项目的同比、环比变化,并可由集成的LLM输出差异分析简报。

通过TextIn与Coze的组合,我们完成了从杂乱文档到结构化数据,再到可交互、可扩展的业务工具的完整路径,构建了一个可靠、可重复、且持续进化的数据流水线。无论是应对合规检查,还是满足定期的经营分析,这个财报机器人都能成为你技术工具箱中一个反应迅速、值得信赖的数字化助手。
现在,是时候告别手动处理的繁琐与不确定,让你的数据工作流真正“智能”起来。

七、附:代码节点源码

下载链接:https://dllf.textin.com/download/2026/CustomService/财报提取-coze代码节点源码.js

看到了 v 友的分享 https://www.v2ex.com/t/1186743 ,给我打开了新思路。

刚好,我最近刚搭建了一个 n8n ;刚好,我有一个 CalDAV 账户;刚好,我有一个 OpenWeather 的 API 。

于是我就让 AI 给写了一段代码,如果你正在折腾 n8n 可以尝试下我这个工作流。

仓库地址:https://github.com/eyebrowkang/n8n-workflows

下面简单介绍一下这个工作流:

通过 Schedule 定时触发 http request (默认 30 分钟更新一次),获取返回的数据,然后通过 python 代码写入到 CalDAV 中指定的日历里面。可以设置保留过去的天气信息,其中当天的信息用的是 current 。由于 CalDAV 是通用协议,因此不局限于 Apple ,任何日历软件只要支持 CalDAV 就行。顺便要夸一下果子,默认的日历对于 CalDAV 的集成真的是顶级的。

目前跑了一下没问题,还有不少需要完善和不太优雅的地方,比如凭据我直接写在了代码里,因为免费版不让用 variables ,我后面再折腾下看 n8n 怎么在代码里用密钥会比较优雅。

以上,感谢 v 友的分享

看到大家都在折腾 Claude,我也来分享一下我自己目前在用的 Skills 清单。主打实用,涵盖前端、SEO 和 提示词生成。

常用 Skills 清单

1. Anthropic 官方 Skills
官方出品,必属精品。这里面我只安装了 skill-creator,用来手搓其他 Skill 非常方便。

https://github.com/anthropics/skills

2. UI UX Pro Max
前端神器,用来写 UI 非常好用,推荐前端佬们试试。

https://github.com/nextlevelbuilder/ui-ux-pro-max-skill

3. seo-review
主要用来做 AI 网站的 SEO 审查,查漏补缺。

https://github.com/leonardomso/33-js-concepts/tree/master/.opencode/skill/seo-review

4. content-creator
SEO 的好搭档。根据关键词自动创建博客文章,适合做内容营销。

https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/skills/business-marketing/content-creator

5. skill-prompt-generator
主要用于生成提示词,搭配生图工具使用效果拔群,强烈推荐!

https://github.com/huangserva/skill-prompt-generator

6. Planning-with-files
参考了 Manus 的 Agent 思路写的 Skill。非常适合处理多步骤的复杂任务。

https://github.com/OthmanAdi/planning-with-files


个人心得与建议

最后强烈建议各位佬友,一定要多多搭建属于自己的 Skills ,从日常的一些工作流开始沉淀。

我的 Skill 迭代方法论:

  1. 手动跑通: 遇到流程,先用 Claude Code (CC) 人肉跑一遍。

  2. 总结提炼: 跑通后,让 CC 总结成一个 Skill。

  3. 评分优化: 基于第一性原理进行打分,不断迭代调优。

如果觉得手写代码麻烦,可以直接用官方的 skill-creator 进行自然语言沟通,创建一个自己的 Skill。

自己沉淀下来的 Skill,才是最好的生产力工具。



📌 转载信息
原作者:
Hiven09
转载时间:
2026/1/15 18:17:35

最高危Ni8mare漏洞允许黑客劫持n8n服务器

                        By

12:41 PM

一个被称为“Ni8mare”的最高严重性漏洞允许远程、未经身份验证的攻击者控制本地部署的N8N工作流自动化平台实例。

该安全问题被标识为CVE-2026-21858,严重性评分为10分(满分10分)。根据数据安全公司Cyera的研究人员称,存在超过100,000台易受攻击的n8n服务器。

n8n是一个开源工作流自动化工具,允许用户通过可视化编辑器将应用程序、API和服务连接成复杂的工作流。它主要用于自动化任务,并支持与人工智能和大型语言模型(LLM)服务的集成。

Ni8mare漏洞详情

Ni8mare漏洞使攻击者能够通过执行某些基于表单的工作流来访问底层服务器上的文件。

n8n开发者表示:“易受攻击的工作流可能向未经身份验证的远程攻击者授予访问权限。这可能导致系统上存储的敏感信息暴露,并可能根据部署配置和工作流使用情况,引发进一步的系统危害。”

Cyera研究人员发现了Ni8mare漏洞(CVE-2026-21858),并于2025年11月9日向n8n报告。他们指出,该安全问题是n8n解析数据方式中存在的内容类型混淆。

n8n使用两个函数来处理传入数据,基于webhook中配置的'content-type'头部(webhook是通过监听特定消息来触发工作流中事件的组件)。

当webhook请求被标记为multipart/form-data时,n8n将其视为文件上传,并使用特殊的上传解析器将文件保存在随机生成的临时位置。

“这意味着用户无法控制文件的最终存储位置,从而防止了路径遍历攻击。”

然而,对于所有其他内容类型,n8n则使用其标准解析器。

Cyera发现,通过设置不同的内容类型(例如application/json),攻击者可以绕过上传解析器。

存在缺陷的解析器逻辑

来源:Cyera

Cyera解释道:“由于调用此函数时未验证内容类型是否为multipart/form-data,我们控制了整个req.body.files对象。这意味着我们控制了filepath参数——因此,我们不是复制上传的文件,而是可以复制系统中的任何本地文件。”

这允许从n8n实例中读取任意文件,通过将内部文件添加到工作流的知识库中,可能暴露密钥信息。

Cyera表示,这可能被滥用以暴露实例上存储的密钥、将敏感文件注入工作流、伪造会话cookie以绕过身份验证,甚至执行任意命令。

触发Ni8mare(CVE-2026-21858)以访问数据库

来源:Cyera

Cyera强调,n8n通常存储API密钥、OAuth令牌、数据库凭证、云存储访问权限、CI/CD密钥和业务数据,使其成为中心自动化枢纽。

n8n开发者表示,目前没有针对Ni8mare的官方临时解决方案,但一种缓解措施是限制或禁用可公开访问的webhook和表单端点。

建议的操作是更新到n8n 1.121.0或更高版本。


Awesome Claude Skills 是一个精心整理的开源项目,旨在收集和分享实用的 “Claude Skills”(定制化工作流),以增强 Claude 在 Claude.ai、Claude Code 和 Claude API 全平台上的生产力。该项目提供了一系列涵盖文档处理、软件开发、数据分析、商业营销等领域的现成技能,帮助用户通过标准化的方式执行特定任务,同时还包含了关于如何安装、使用以及创建自定义技能的详细指南,致力于让 Claude 能够以可重复的方式处理各类复杂需求,从而极大地提升工作效率。


📌 转载信息
转载时间:
2026/1/3 15:07:22