8
n8n 中文网amn8n.com

自动化品牌DNA生成器

高级

这是一个Market Research, AI Summarization领域的自动化工作流,包含 22 个节点。主要使用 Code, Notion, SerpApi, HttpRequest, JotFormTrigger 等节点。 使用JotForm、Google搜索、Gemini AI和Notion的品牌DNA生成器

前置要求
  • Notion API Key
  • 可能需要目标 API 的认证凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "hkUBomZwuryHuH6n",
  "meta": {
    "instanceId": "0d045f8fe3802ff2be0bb9a9ea445ee6c9ed61973377effe00767e483681e2f4"
  },
  "name": "使用 JotForm、Google 搜索、AI 提取和 Notion 的自动化品牌 DNA 生成器",
  "tags": [],
  "nodes": [
    {
      "id": "6376bb20-06e3-4ae3-9d61-28ba339555d0",
      "name": "JotForm 触发器",
      "type": "n8n-nodes-base.jotFormTrigger",
      "position": [
        1296,
        272
      ],
      "webhookId": "d0747951-8dad-407d-8430-caa5d437b606",
      "parameters": {
        "form": "="
      },
      "credentials": {
        "jotFormApi": {
          "id": "2uvFQzNFa136AOg4",
          "name": "JotForm account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c022594f-0f11-4b01-9422-5c44369f8b46",
      "name": "JavaScript 代码",
      "type": "n8n-nodes-base.code",
      "position": [
        1504,
        272
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nreturn items.map(item => {\n  let website = item.json[\"Company Website\"] || \"\";\n\n  // Clean whitespace\n  website = website.trim();\n\n  // Add protocol if missing\n  if (!website.startsWith(\"http://\") && !website.startsWith(\"https://\")) {\n    website = \"https://\" + website;\n  }\n\n  try {\n    const url = new URL(website);\n    let domain = url.hostname.replace(/^www\\./, \"\"); // remove \"www.\"\n\n    return {\n      json: {\n        ...item.json,\n        Domain: domain\n      }\n    };\n  } catch (e) {\n    // If not a valid URL, fallback to plain string\n    const fallbackDomain = website\n      .replace(/^https?:\\/\\//, \"\")\n      .replace(/^www\\./, \"\")\n      .split(\"/\")[0];\n\n    return {\n      json: {\n        ...item.json,\n        Domain: fallbackDomain\n      }\n    };\n  }\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "606c9887-c104-4f5c-8b44-f21f55db5f06",
      "name": "Google 搜索",
      "type": "n8n-nodes-serpapi.serpApi",
      "position": [
        1712,
        272
      ],
      "parameters": {
        "q": "=site:{{ $json.Domain }}",
        "requestOptions": {},
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "c96ed505-2b84-4bf3-8e38-e9701f6f7886",
      "name": "HTTP 请求",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2544,
        576
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "ab2ba7f5-9d82-4c06-9350-132522dfbf79",
      "name": "网页内容提取器",
      "type": "n8n-nodes-webpage-content-extractor.webpageContentExtractor",
      "notes": "data not found",
      "onError": "continueRegularOutput",
      "position": [
        3104,
        576
      ],
      "parameters": {
        "html": "={{ $json.data }}"
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "7c4cdb90-cb54-4893-9e27-8002af3c4320",
      "name": "信息提取器",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        3328,
        576
      ],
      "parameters": {
        "text": "=Company name : {{ $('JotForm Trigger').item.json['Company Name'] }}\nWebpage Content : {{ $json.textContent }}",
        "options": {
          "systemPromptTemplate": "=You are an expert information extraction algorithm.\nYour task is to extract only essential and relevant information about the company named \"{{ $('JotForm Trigger').item.json['Company Name'] }}\" and its context within the article text.\nIf a field or value is not available, omit it completely. Do not fabricate or infer information.\nReturn only a clean and valid JSON object following the provided schema."
        },
        "schemaType": "fromJson",
        "jsonSchemaExample": "{\n  \"companyName\":\"11x.ai\",\n  \"relatedToBrand\": \"reply.io\",\n  \"isRelated\": true,\n  \"relationType\": \"positioning\",\n  \"reason\": \"The article mentions 11x as an AI sales automation platform and includes a demo link.\",\n  \"articleGoal\": \"To compare UberConference alternatives and highlight 11x's position within the sales tools ecosystem.\",\n  \"excerpt\": \"Transform your revenue team with digital AI workers that execute, learn, and optimize.\",\n  \"summary\": \"The article introduces 11x as an AI-driven solution for automating sales and prospect management.\",\n  \"keyPoints\": [\n    \"11x positions itself as an AI sales automation platform.\",\n    \"The article compares various meeting and communication tools.\",\n    \"Includes a demo link to showcase 11x’s capabilities.\",\n    \"Focuses on digital AI workers improving sales efficiency.\"\n  ]\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "e0a12b7c-151e-4b52-ae88-06630ad4348a",
      "name": "OpenRouter聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        3328,
        800
      ],
      "parameters": {
        "model": "google/gemini-2.0-flash-exp:free",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "4ac523fc-0ddf-42a0-b797-7c050bbd9b9e",
      "name": "遍历项目",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2128,
        272
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "9aae62eb-881d-4ba0-93ee-4ddf2624b6a1",
      "name": "信息提取器1",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        2752,
        -48
      ],
      "parameters": {
        "text": "=companyName : {{ $json.companyName }}\nrelatedToBrand : {{ $json.relatedToBrand }}\nrelationType: {{ $json.relationType }}\nreason : {{ $json.reason }}\narticleGoal : {{ $json.articleGoal }}\nexcerpt : {{ $json.excerpt }}\nsummary : {{ $json.summary }}\nkeyPoints : {{ $json.keyPoints }}",
        "options": {
          "systemPromptTemplate": "=You are a brand strategist.\nMerge multiple extraction results into one concise Brand DNA for the company named \"{{ $json.relatedToBrand }}\".\nReturn STRICT JSON only, no extra text. Be factual; do not invent details.\nConsolidate duplicates, remove overlap, and keep language neutral and concise.\nIf a field has no evidence, omit it entirely.\n"
        },
        "schemaType": "fromJson",
        "jsonSchemaExample": "{\n  \"companyName\":\"\",\n  \"companyDescription\": \"\",\n  \"idealCustomerProfile\": [],\n  \"painPoints\": [],\n  \"valueProposition\": [],\n  \"proofPoints\": [],\n  \"reasonsToOutreach\": [],\n  \"outreachChannels\": [],\n  \"suggestedKeywords\": [],\n  \"brandTone\": \"\"\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "8df1f5a1-927a-4397-bc4a-60d261d3bf12",
      "name": "OpenRouter 聊天模型1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        2752,
        112
      ],
      "parameters": {
        "model": "google/gemini-2.0-flash-exp:free",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "9b4fde9e-5d58-4762-8dc2-b53eff25e1ca",
      "name": "合并数据",
      "type": "n8n-nodes-base.code",
      "position": [
        2544,
        -48
      ],
      "parameters": {
        "jsCode": "// n8n Code node — Simple Combine to One\n// Combine multiple extractor results into one object without complex heuristics.\n\nconst items = $input.all();\n\n// --- CONFIG ---\nconst AS_ARRAYS = true;   // true: save as array; false: join string \" | \"\nconst JOINER = \" | \";     // separator when AS_ARRAYS=false\n\n// Fields processed as \"list\" (will be merged & deduplicated)\nconst LIST_FIELDS = new Set([\n  \"keyPoints\",        // array\n  \"relationType\",     // can appear in various forms → make it a list\n  \"reason\",           // reasons can be more than one\n  \"articleGoal\",      // goals can vary between pages\n  \"excerpt\",          // can save all excerpts (or take first in SCALAR_PREFERS_FIRST)\n  \"summary\"           // can save all summaries (or take first in SCALAR_PREFERS_FIRST)\n]);\n\n// If you want some fields to remain scalar (take first), put them here:\nconst SCALAR_PREFERS_FIRST = new Set([\n  \"relatedToBrand\"    // take the first non-empty one\n]);\n\n// Helper\nconst norm = (v) => (v == null ? \"\" : String(v).trim());\nconst toArr = (v) => Array.isArray(v) ? v : (v == null ? [] : [v]);\nconst dedupe = (arr) => {\n  const seen = new Set(); const out = [];\n  for (const x of arr) {\n    const s = norm(x);\n    const k = s.toLowerCase();\n    if (s && !seen.has(k)) { seen.add(k); out.push(s); }\n  }\n  return out;\n};\n\n// Extract record from various forms\nconst extractRecord = (it) => {\n  if (it?.json?.output && typeof it.json.output === \"object\") return it.json.output;\n  if (it?.json && typeof it.json === \"object\") return it.json;\n  return {};\n};\n\n// Collect all records\nconst records = items.map(extractRecord);\n\n// Initial combination\nconst combined = {};\nlet anyRelatedTrue = false;\n\n// Loop to combine\nfor (const rec of records) {\n  for (const [k, v] of Object.entries(rec)) {\n    if (k === \"isRelated\") {\n      if (v === true || v === \"true\") anyRelatedTrue = true;\n      continue;\n    }\n\n    // If field is set for scalar-first → save only the first one\n    if (SCALAR_PREFERS_FIRST.has(k)) {\n      if (!combined[k]) {\n        const val = Array.isArray(v) ? v.find(x => norm(x)) : v;\n        if (norm(val)) combined[k] = norm(val);\n      }\n      continue;\n    }\n\n    // Otherwise, treat as list so all values are included\n    const list = toArr(v);\n    if (!combined[k]) combined[k] = [];\n    combined[k].push(...list);\n  }\n}\n\n// Dedupe for all fields that are lists\nfor (const k of Object.keys(combined)) {\n  if (Array.isArray(combined[k]) || LIST_FIELDS.has(k)) {\n    combined[k] = dedupe(toArr(combined[k]));\n  }\n}\n\n// Set boolean isRelated\ncombined.isRelated = anyRelatedTrue;\n\n// Final output:\n// - If AS_ARRAYS=false → join lists into string with JOINER\nif (!AS_ARRAYS) {\n  for (const [k, v] of Object.entries(combined)) {\n    if (Array.isArray(v)) combined[k] = v.join(JOINER);\n  }\n}\n\n// Clean empty fields\nfor (const k of Object.keys(combined)) {\n  const v = combined[k];\n  if (Array.isArray(v) && v.length === 0) delete combined[k];\n  if (typeof v === \"string\" && !v.trim()) delete combined[k];\n}\n\nreturn [{ json: combined }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "8778a112-c980-4c2f-a14c-ec98d8152a75",
      "name": "JavaScript2 代码",
      "type": "n8n-nodes-base.code",
      "position": [
        3072,
        -48
      ],
      "parameters": {
        "jsCode": "// n8n Code Node — Format per-section (strings) for Notion blocks UI\n// Input: items[0].json.output\n// Output: multiple string fields: h1, h2_xxx, p_xxx (each <= ~1900 chars)\n\nconst item = $input.item;\nconst d = item.json.output || item.json || {};\n\n// Safe content limit per Notion block (~2000 chars, using 1900)\nconst LIMIT = 1900;\n\nconst clip = (s) => String(s ?? '').slice(0, LIMIT).trim();\n\n// Array → bullets in one paragraph (1 Notion block, multiline)\nfunction bulletsParagraph(arr) {\n  if (!Array.isArray(arr) || !arr.length) return '- (none)';\n  const lines = arr\n    .filter(x => x != null && String(x).trim() !== '')\n    .map(x => `• ${String(x).replace(/\\s+/g, ' ').trim()}`);\n  return clip(lines.join('\\n'));\n}\n\n// Scalar → single string\nconst scalar = (s) => {\n  const v = (s == null || String(s).trim() === '') ? '- (none)' : String(s);\n  return clip(v);\n};\n\n// Get company name for H1 (layered fallback)\nconst companyName =\n  d.companyName ||\n  d.company ||\n  item.json.companyName ||\n  item.json['Company Name'] ||\n  'Unknown Company';\n\n// Arrange all sections as separate strings\nconst output = {\n  // Main heading = Company Name\n  h1: scalar(companyName),\n\n  // Company Description\n  h2_companyDescription: 'Company Description',\n  p_companyDescription: scalar(d.companyDescription),\n\n  // ICP\n  h2_icp: 'Ideal Customer Profile (ICP)',\n  p_icp: bulletsParagraph(d.idealCustomerProfile),\n\n  // Pain Points\n  h2_painPoints: 'Pain Points',\n  p_painPoints: bulletsParagraph(d.painPoints),\n\n  // Value Proposition\n  h2_valueProposition: 'Value Proposition',\n  p_valueProposition: bulletsParagraph(d.valueProposition),\n\n  // Proof Points\n  h2_proofPoints: 'Proof Points',\n  p_proofPoints: bulletsParagraph(d.proofPoints),\n\n  // Reasons to Outreach\n  h2_reasonsToOutreach: 'Reasons to Outreach',\n  p_reasonsToOutreach: bulletsParagraph(d.reasonsToOutreach),\n\n  // Outreach Channels\n  h2_outreachChannels: 'Outreach Channels',\n  p_outreachChannels: bulletsParagraph(d.outreachChannels),\n\n  // Suggested Keywords\n  h2_suggestedKeywords: 'Suggested Keywords',\n  p_suggestedKeywords: bulletsParagraph(d.suggestedKeywords),\n\n  // Brand Tone\n  h2_brandTone: 'Brand Tone',\n  p_brandTone: scalar(d.brandTone),\n};\n\nreturn [{ json: output }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "e224592f-fecb-414e-a598-e3bdfc326afe",
      "name": "创建数据库页面",
      "type": "n8n-nodes-base.notion",
      "position": [
        3280,
        -48
      ],
      "parameters": {
        "title": "={{ $json.h1 }}",
        "blockUi": {
          "blockValues": [
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_companyDescription }}"
            },
            {
              "textContent": "={{ $json.p_companyDescription }}"
            },
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_icp }}"
            },
            {
              "textContent": "={{ $json.p_icp }}"
            },
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_painPoints }}"
            },
            {
              "textContent": "={{ $json.p_painPoints }}"
            },
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_valueProposition }}"
            },
            {
              "textContent": "={{ $json.p_valueProposition }}"
            },
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_proofPoints }}"
            },
            {
              "textContent": "={{ $json.p_proofPoints }}"
            },
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_reasonsToOutreach }}"
            },
            {
              "textContent": "={{ $json.p_reasonsToOutreach }}"
            },
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_outreachChannels }}"
            },
            {
              "textContent": "={{ $json.p_outreachChannels }}"
            },
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_suggestedKeywords }}"
            },
            {
              "textContent": "={{ $json.p_suggestedKeywords }}"
            },
            {
              "type": "heading_2",
              "textContent": "={{ $json.h2_brandTone }}"
            },
            {
              "textContent": "={{ $json.p_brandTone }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "databaseId": "="
      },
      "typeVersion": 2.2
    },
    {
      "id": "461dc0fa-29ed-4162-8b44-44678b3405a9",
      "name": "JavaScript1 代码",
      "type": "n8n-nodes-base.code",
      "position": [
        2752,
        576
      ],
      "parameters": {
        "jsCode": "// n8n Code Node — Simple HTML → Clean Text Array\n// Output format: [{ \"data\": \"clean text\" }]\n\nconst items = $input.all();\n\n// Helper: remove all HTML tags, comments, and script/style\nfunction cleanHTML(html = '') {\n  return html\n    .replace(/<!--[\\s\\S]*?-->/g, ' ')                     // comments\n    .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, ' ') // script\n    .replace(/<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>/gi, ' ')   // style\n    .replace(/<noscript\\b[^<]*(?:(?!<\\/noscript>)<[^<]*)*<\\/noscript>/gi, ' ')\n    .replace(/<\\/?(svg|math)[\\s\\S]*?<\\/\\1>/gi, ' ')\n    .replace(/<[^>]+>/g, ' ') // remove all tags\n    .replace(/&nbsp;/gi, ' ')\n    .replace(/&amp;/gi, '&')\n    .replace(/&lt;/gi, '<')\n    .replace(/&gt;/gi, '>')\n    .replace(/&quot;/gi, '\"')\n    .replace(/&#39;/gi, \"'\")\n    .replace(/\\s+/g, ' ')\n    .trim();\n}\n\n// Get html from several possible keys\nfunction pickHtml(json) {\n  const keys = ['data', 'html', 'body', 'content', 'text'];\n  for (const k of keys) {\n    if (typeof json?.[k] === 'string' && json[k].trim()) return json[k];\n  }\n  if (typeof json?.output === 'object') {\n    for (const k of keys) {\n      if (typeof json.output[k] === 'string' && json.output[k].trim()) return json.output[k];\n    }\n  }\n  return '';\n}\n\nreturn items.map((item) => {\n  const raw = pickHtml(item.json) || '';\n  const cleaned = cleanHTML(raw);\n  return { json: { data: cleaned } };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "c0a0e828-12c2-4024-b2ce-3df29f0b424b",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        -176
      ],
      "parameters": {
        "width": 620,
        "height": 1288,
        "content": "# 使用 JotForm、Google 搜索、AI 提取和 Notion 的自动化品牌 DNA 生成器"
      },
      "typeVersion": 1
    },
    {
      "id": "810cd05b-cd23-4af0-a5ec-5ebccb3d9e3e",
      "name": "便签 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1264,
        112
      ],
      "parameters": {
        "color": 2,
        "width": 384,
        "height": 304,
        "content": "- 当从 JotForm 收到新的表单提交时启动工作流。"
      },
      "typeVersion": 1
    },
    {
      "id": "95e9e2a4-2469-48df-85f3-11ae0110b139",
      "name": "便签 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        112
      ],
      "parameters": {
        "color": 3,
        "width": 368,
        "height": 304,
        "content": "- 自动检索与公司域名相关的搜索结果。"
      },
      "typeVersion": 1
    },
    {
      "id": "2ea4072f-acf6-4c7f-98af-abd531ab0a68",
      "name": "设置 URL",
      "type": "n8n-nodes-base.code",
      "position": [
        1920,
        272
      ],
      "parameters": {
        "jsCode": "// Get all items from previous node (each item = one SerpAPI result)\nconst items = $input.all();\nconst out = [];\n\nfor (const item of items) {\n  const data = item.json || {};\n  const results = Array.isArray(data.organic_results) ? data.organic_results : [];\n\n  // Collect links + fallback from redirect_link?url=...\n  const urls = results.map(r => {\n    if (r.link) return r.link;\n    if (r.redirect_link) {\n      try {\n        const u = new URL(r.redirect_link);\n        const real = u.searchParams.get('url');\n        if (real) return real;\n      } catch (e) {}\n    }\n    return null;\n  }).filter(Boolean);\n\n  // Dedupe\n  const unique = [...new Set(urls)];\n\n  // Output one item per URL (include useful metadata)\n  for (const r of results) {\n    // Match parsed URL with r.link/redirect_link\n    let resolved = r.link;\n    if (!resolved && r.redirect_link) {\n      try {\n        const u = new URL(r.redirect_link);\n        const real = u.searchParams.get('url');\n        if (real) resolved = real;\n      } catch (e) {}\n    }\n    if (resolved && unique.includes(resolved)) {\n      out.push({\n        json: {\n          url: resolved,\n          position: r.position ?? null,\n          title: r.title ?? null,\n          displayed_link: r.displayed_link ?? null,\n          source: r.source ?? null,\n          date: r.date ?? null\n        }\n      });\n    }\n  }\n}\n\n// If no organic_results, return empty info to keep flow running\nreturn out.length ? out : [{ json: { url: null, note: 'No organic_results found' } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "253be165-bc96-4178-8842-04a165dd012f",
      "name": "便签 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2512,
        -272
      ],
      "parameters": {
        "color": 4,
        "width": 496,
        "height": 528,
        "content": "- 将多个提取结果(来自多个页面)合并为单个去重记录。"
      },
      "typeVersion": 1
    },
    {
      "id": "36e117cb-214d-4d44-b012-3bdc82c5f01e",
      "name": "便签 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3040,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 496,
        "height": 528,
        "content": "- 将整合的品牌 DNA JSON 格式化为适合 Notion 块的字符串字段。"
      },
      "typeVersion": 1
    },
    {
      "id": "9efd3a0a-5a04-42b3-abbe-29cd8e878fa6",
      "name": "便签 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2512,
        352
      ],
      "parameters": {
        "color": 4,
        "width": 496,
        "height": 528,
        "content": "- 从给定的网站 URL 获取原始 HTML 内容。"
      },
      "typeVersion": 1
    },
    {
      "id": "6cc1c8d7-7d7b-470f-86d2-542a7443e879",
      "name": "便签6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3056,
        352
      ],
      "parameters": {
        "color": 5,
        "width": 576,
        "height": 608,
        "content": "- 从原始 HTML 中提取结构化和可读内容。"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a4b127eb-22d0-4a63-88e7-2ff617914cfa",
  "connections": {
    "Set url": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Data": {
      "main": [
        [
          {
            "node": "Information Extractor1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google search": {
      "main": [
        [
          {
            "node": "Set url",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "JotForm Trigger": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Merge Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Google search",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "WebpageContentExtractor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript2": {
      "main": [
        [
          {
            "node": "Create a database page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Information Extractor": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Information Extractor",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Information Extractor1": {
      "main": [
        [
          {
            "node": "Code in JavaScript2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Information Extractor1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "WebpageContentExtractor": {
      "main": [
        [
          {
            "node": "Information Extractor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 市场调研, AI 摘要总结

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量22
分类2
节点类型10
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Budi SJ

Budi SJ

@budisj

I’m a Product Designer who also works as an Automation Developer. With a background in product design and systems thinking, I build user-centered workflows. My focus is on helping teams and businesses work more productively through impactful automation systems.

外部链接
在 n8n.io 查看

分享此工作流