第 61 章

Azure AI Foundry 集成:部署配置 / Structured Outputs Beta / 企业 Entra ID 接入

第六十一章:与 n8n/Zapier 集成:无代码工作流中的 Claude 节点

61.1 无代码自动化平台的价值

n8n 和 Zapier 代表了"工作流自动化"这一类平台的两种形态:

将 Claude 嵌入这两个平台,能让不懂编程的业务团队直接构建 AI 驱动的自动化流程:客户邮件自动分类回复、表单数据智能提取、报告自动生成发送、多渠道内容发布等。

61.2 在 n8n 中配置 Claude HTTP 节点

n8n 内置了 Anthropic 节点(从 n8n v1.22+ 开始),也可以通过通用 HTTP Request 节点手动配置。本节重点介绍手动配置方式,以便理解底层原理。

61.2.1 创建 Anthropic API 凭据

在 n8n 中:

  1. 进入 Settings → Credentials → New Credential
  2. 选择 HTTP Header Auth
  3. 设置 Header Name 为 x-api-key,Header Value 为你的 Anthropic API Key

61.2.2 配置 HTTP Request 节点调用 Claude

// n8n HTTP Request 节点配置(JSON 视图)
{
  "method": "POST",
  "url": "https://api.anthropic.com/v1/messages",
  "authentication": "headerAuth",
  "headers": {
    "anthropic-version": "2023-06-01",
    "content-type": "application/json"
  },
  "body": {
    "model": "claude-opus-4-5",
    "max_tokens": 1024,
    "system": "{{ $json.systemPrompt }}",
    "messages": [
      {
        "role": "user",
        "content": "{{ $json.userMessage }}"
      }
    ]
  },
  "options": {
    "response": {
      "response": {
        "responseFormat": "json"
      }
    }
  }
}

在 n8n 的 GUI 中配置步骤:

  1. 拖入 HTTP Request 节点
  2. Method: POST
  3. URL: https://api.anthropic.com/v1/messages
  4. Authentication: 选择之前创建的 Header Auth 凭据
  5. Headers 标签页:
    • anthropic-version: 2023-06-01
    • Content-Type: application/json
  6. Body 标签页 → JSON:粘贴上方 body 内容
  7. 使用 {{ $json.fieldName }} 引用上游节点的数据

61.2.3 提取 Claude 响应内容

Claude API 返回的响应结构为:

{
  "id": "msg_01xxx",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "这里是 Claude 的回复内容..."
    }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 42,
    "output_tokens": 128
  }
}

在 n8n 中使用 Set 节点 提取文本内容:

// Set 节点中的表达式
{{ $json.content[0].text }}

或使用 Code 节点 进行更复杂的处理:

// Code 节点
const response = $input.first().json;
const text = response.content[0].text;
const inputTokens = response.usage.input_tokens;
const outputTokens = response.usage.output_tokens;

return [{
  json: {
    claudeResponse: text,
    tokensUsed: inputTokens + outputTokens,
    cost: ((inputTokens * 3 + outputTokens * 15) / 1_000_000).toFixed(6)
  }
}];

61.3 构建实用的 n8n Claude 工作流

61.3.1 工作流一:Gmail 邮件智能分类与自动回复

触发器:Gmail Trigger(新邮件到达)
  ↓
Set 节点:构建分类 Prompt
  ↓
HTTP Request:调用 Claude(分类)
  ↓
IF 节点:根据分类分支
  ├── 技术支持 → 查询知识库 → Claude 生成回复 → Gmail Reply
  ├── 销售询价 → 通知 Slack → 创建 CRM 记录
  └── 投诉 → 标记高优先级 → 通知主管 → 人工处理

分类节点的 Claude 配置:

// HTTP Request 节点 - Body
{
  "model": "claude-haiku-4-5",
  "max_tokens": 64,
  "messages": [
    {
      "role": "user",
      "content": "将以下邮件分类为:technical_support/sales_inquiry/complaint/general。只输出分类名称,不要解释。\n\n邮件主题:{{ $json.subject }}\n邮件内容:{{ $json.snippet }}"
    }
  ]
}

回复生成节点:

{
  "model": "claude-opus-4-5",
  "max_tokens": 512,
  "system": "你是公司的技术支持专员。根据知识库内容(如有提供)生成专业、友好的回复邮件。用与来信相同的语言回复。",
  "messages": [
    {
      "role": "user",
      "content": "客户邮件:\n{{ $json.emailBody }}\n\n知识库参考:\n{{ $json.knowledgeBaseResult }}\n\n请生成回复邮件正文(不要包含邮件头和签名):"
    }
  ]
}

61.3.2 工作流二:Webhook 触发的文档处理流水线

触发器:Webhook(接收 POST 请求,携带文档 URL)
  ↓
HTTP Request:下载文档内容
  ↓
Code 节点:文本预处理(去除 HTML 标签、截断到 50000 字符)
  ↓
HTTP Request:Claude 提取结构化信息
  ↓
Set 节点:解析 Claude 的 JSON 输出
  ↓
Google Sheets:写入提取的数据
  ↓
Webhook Response:返回处理结果

Claude 提取节点配置:

{
  "model": "claude-opus-4-5",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "从以下文档中提取关键信息,严格按照 JSON 格式输出,不要包含任何其他文字:\n\n文档内容:\n{{ $json.documentText }}\n\n需要提取的字段:\n- company_name: 公司名称\n- contact_person: 联系人\n- phone: 联系电话\n- email: 邮箱地址\n- product_mentioned: 提到的产品列表(数组)\n- key_requirements: 关键需求(最多3条,数组)\n- urgency: 紧迫程度(high/medium/low)\n\n输出示例:{\"company_name\": \"...\", ...}"
    }
  ]
}

Code 节点解析 JSON 输出:

const claudeText = $input.first().json.content[0].text;

// Claude 有时会在 JSON 前后加上说明文字,需要提取 JSON 部分
const jsonMatch = claudeText.match(/\{[\s\S]*\}/);
if (!jsonMatch) {
  throw new Error(`Claude 未返回有效 JSON: ${claudeText}`);
}

const extracted = JSON.parse(jsonMatch[0]);

return [{ json: extracted }];

61.3.3 工作流三:定时内容生成与多渠道发布

触发器:Schedule(每天 9:00 AM)
  ↓
HTTP Request:获取今日热点话题(RSS/API)
  ↓
HTTP Request:Claude 生成多格式内容
  ↓
Code 节点:解析不同格式的内容
  ↓
并行执行:
  ├── Twitter API:发布简短版本(280字符)
  ├── LinkedIn API:发布专业版本
  └── Notion API:存档完整版本

Claude 多格式生成节点:

{
  "model": "claude-opus-4-5",
  "max_tokens": 2048,
  "messages": [
    {
      "role": "user",
      "content": "基于以下话题,生成三种格式的内容。严格按照 JSON 格式输出。\n\n话题:{{ $json.topic }}\n背景信息:{{ $json.background }}\n\n输出格式:\n{\n  \"twitter\": \"Twitter 帖子(最多280字符,可含 hashtag)\",\n  \"linkedin\": \"LinkedIn 长文(300-500字,专业语气,可含换行)\",\n  \"full_article\": \"完整文章(800-1200字,包含标题、引言、正文、结语)\"\n}"
    }
  ]
}

61.4 在 Zapier 中集成 Claude

Zapier 通过 Webhooks by ZapierHTTP 操作(需要 Zapier Premium)调用 Claude API。

61.4.1 使用 Webhooks by Zapier 调用 Claude

Zap 结构:

触发器:你的应用(如 Typeform 新表单提交)
  ↓
操作:Webhooks by Zapier - Custom Request
  ↓
操作:Formatter by Zapier - Text(提取 Claude 回复)
  ↓
操作:下游应用(Gmail/Slack/Google Sheets 等)

Webhooks by Zapier 节点配置:

提取回复的 Formatter 配置:

或者使用 Zapier 的 Code by Zapier(Python/JavaScript):

// Zapier Code by Zapier - JavaScript
const responseBody = JSON.parse(inputData.webhookBody);
const claudeText = responseBody.content[0].text;

return {
  claudeResponse: claudeText,
  inputTokens: responseBody.usage.input_tokens,
  outputTokens: responseBody.usage.output_tokens
};

61.4.2 Zapier 工作流示例:Typeform → Claude 分析 → Google Sheets

触发器:Typeform - New Entry(新客户调研表单)
  ↓
操作:Webhooks by Zapier(POST 到 Claude API)
  - 分析表单答案,提取关键痛点和优先级
  ↓
操作:Code by Zapier(解析 Claude JSON 输出)
  ↓
操作:Google Sheets - Create Spreadsheet Row
  - 写入提取的结构化数据
  ↓
操作:Slack - Send Channel Message
  - 通知产品团队有新的高优先级反馈

61.5 Webhook 触发器:让外部事件驱动 Claude

n8n 的 Webhook 触发器允许外部系统主动触发 Claude 处理。

61.5.1 n8n Webhook 接收 + Claude 处理

// 工作流:HTTP POST 请求 → Claude 分析 → 返回结果

POST https://your-n8n.com/webhook/analyze-text
Content-Type: application/json

{
  "text": "需要分析的文本内容",
  "analysis_type": "sentiment|summary|extraction",
  "language": "zh"
}

n8n 工作流节点:

  1. Webhook 触发器:监听 POST 请求,记录 Body
  2. Switch 节点:根据 analysis_type 分支
  3. HTTP Request(Claude):对应不同 analysis_type 使用不同 prompt
  4. Set 节点:格式化输出
  5. Webhook Response 节点:返回结果给调用方
// Webhook Response 的返回内容(Set 节点配置)
{
  "success": true,
  "result": "{{ $json.claudeResponse }}",
  "tokens_used": "{{ $json.tokensUsed }}",
  "processing_time_ms": "{{ $json.processingTime }}"
}

61.6 错误处理与稳定性

61.6.1 n8n 的错误处理节点

HTTP Request(Claude)
  ↓ 成功
Set 节点(处理结果)
  ↓ 失败(Error Trigger)
  ↓
IF 节点:检查错误类型
  ├── 429 Rate Limit → Wait 节点(等待 60s)→ 重试
  ├── 500 Server Error → 发送告警到 Slack
  └── 其他 → 记录日志 → 跳过处理

Rate Limit 处理的 Code 节点:

// 检查是否是速率限制错误
const statusCode = $input.first().json.statusCode;
const retryAfter = $input.first().json.headers?.['retry-after'];

if (statusCode === 429) {
  const waitSeconds = retryAfter ? parseInt(retryAfter) : 60;
  return [{
    json: {
      shouldRetry: true,
      waitMs: waitSeconds * 1000,
      message: `Rate limited, waiting ${waitSeconds}s`
    }
  }];
}

return [{ json: { shouldRetry: false, error: $input.first().json } }];

61.6.2 成本控制:按需选择模型

// Code 节点:根据任务复杂度选择模型
const taskType = $input.first().json.taskType;
const textLength = $input.first().json.text?.length || 0;

let model = "claude-haiku-4-5";  // 默认用最便宜的模型

if (taskType === "complex_analysis" || textLength > 10000) {
  model = "claude-opus-4-5";
} else if (taskType === "summarization" || taskType === "translation") {
  model = "claude-sonnet-4-5";
}

return [{
  json: {
    ...$input.first().json,
    selectedModel: model
  }
}];

61.7 最佳实践

提示词管理

在 n8n 中,将系统提示词存储在专用的数据节点或环境变量中,而非硬编码在每个节点里:

// n8n 环境变量(Settings → Environment Variables)
// CLAUDE_SYSTEM_PROMPT_CUSTOMER_SERVICE = "你是..."
// CLAUDE_SYSTEM_PROMPT_ANALYTICS = "你是数据分析..."

// 在 Code 节点中读取
const systemPrompt = $env.CLAUDE_SYSTEM_PROMPT_CUSTOMER_SERVICE;

输出验证

// 验证 Claude 输出是否为有效 JSON
function safeParseClaudeJson(text) {
  // 尝试直接解析
  try {
    return JSON.parse(text);
  } catch (e) {}
  
  // 尝试提取 JSON 块
  const jsonMatch = text.match(/```json\n?([\s\S]*?)\n?```/) || 
                    text.match(/\{[\s\S]*\}/);
  if (jsonMatch) {
    try {
      return JSON.parse(jsonMatch[1] || jsonMatch[0]);
    } catch (e) {}
  }
  
  throw new Error(`无法解析 Claude 输出为 JSON: ${text.substring(0, 200)}`);
}

小结

n8n 和 Zapier 通过 HTTP Request 节点将 Claude API 整合进可视化工作流。关键配置要素包括:Header Auth 凭据(x-api-key)、anthropic-version 请求头,以及使用表达式(n8n 的 {{ $json.field }},Zapier 的 __field__)动态注入上下文。实用工作流场景涵盖邮件自动分类回复、文档结构化提取、多格式内容生成。生产化要点是:速率限制重试、按任务复杂度路由模型、Claude 输出的 JSON 安全解析,以及集中管理系统提示词。

本章评分
4.7  / 5  (3 评分)

💬 留言讨论