{
  "name": "GEO\u6587\u7ae0\u751f\u6210 v0.0.3",
  "nodes": [
    {
      "parameters": {
        "jsCode": "// 1. \u83b7\u53d6 AI \u751f\u6210\u7684\u539f\u59cb\u6587\u672c (Basic LLM Chain \u7684\u8f93\u51fa\u5b57\u6bb5\u662f text)\nconst aiRawText = items[0].json.text;\n\n// 2. \u5bb9\u9519\u5904\u7406\uff1a\u53bb\u6389 AI \u53ef\u80fd\u5e26\u7684 ```json \u7b49\u4fee\u9970\u7b26\nconst cleanText = aiRawText.replace(/```json/g, \"\").replace(/```/g, \"\").trim();\n\nlet parsedData;\ntry {\n    // \u5c1d\u8bd5\u89e3\u6790 AI \u8fd4\u56de\u7684 JSON\n    parsedData = JSON.parse(cleanText);\n} catch (e) {\n    // \u5982\u679c AI \u6ca1\u542c\u8bdd\uff0c\u6ca1\u8fd4\u56de JSON\uff0c\u6211\u4eec\u624b\u52a8\u5c01\u88c5\u4e00\u4e2a\uff0c\u9632\u6b62\u6d41\u7a0b\u5d29\u6e83\n    parsedData = {\n        title: \"\u5173\u4e8e\u5173\u952e\u8bcd\u7684\u6df1\u5ea6\u89e3\u6790\",\n        content: aiRawText\n    };\n}\n\n// 3. \u968f\u673a\u751f\u6210 SEO \u8bc4\u5206\nconst seoScore = Math.floor(Math.random() * 15) + 85;\n\n// 4. \u8fd4\u56de\u7ed9\u4e0b\u4e00\u4e2a\u8282\u70b9\nreturn [{\n  json: {\n    status: 'success',\n    data: parsedData, // \u8fd9\u91cc\u5305\u542b\u4e86 Python \u60f3\u8981\u7684 title \u548c content\n    seo: {\n      score: seoScore,\n      keyword_density: '2.3%',\n      readability_score: 'Good',\n      suggestions: [\n        '\u5efa\u8bae\u5728\u7b2c\u4e00\u6bb5\u51fa\u73b0\u5173\u952e\u8bcd',\n        '\u5efa\u8bae\u6dfb\u52a0\u81f3\u5c112\u5f20\u56fe\u7247',\n        '\u5efa\u8bae\u589e\u52a0\u5185\u90e8\u94fe\u63a5'\n      ]\n    },\n    timestamp: new Date().toISOString()\n  }\n}];"
      },
      "id": "fe930e07-b651-4760-abd4-176b7d3ac103",
      "name": "\u89e3\u6790\u5e76\u6dfb\u52a0SEO\u8bc4\u5206",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1568,
        384
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=\u8bf7\u4e3a\u5173\u952e\u8bcd\u201c{{ $json.body.keyword }}\u201d\u64b0\u5199\u4e00\u7bc7\u6df1\u5ea6\u3001\u4e13\u4e1a\u7684 SEO \u4f18\u5316\u6587\u7ae0\u3002\n\n### \u6838\u5fc3\u8981\u6c42\uff1a\n1. **\u8eab\u4efd\u8bbe\u5b9a**\uff1a\u4f60\u662f\u4e00\u540d\u62e5\u6709 10 \u5e74\u7ecf\u9a8c\u7684 SEO \u8425\u9500\u4e13\u5bb6\uff0c\u64b0\u5199\u98ce\u683c\u7a33\u91cd\u3001\u4e13\u4e1a\uff0c\u9002\u5408 B2B \u4f01\u4e1a\u53d1\u5e03\u3002\n2. **\u683c\u5f0f\u8981\u6c42**\uff1a\u6587\u7ae0\u5fc5\u987b\u4f7f\u7528 **Markdown** \u683c\u5f0f\u8fdb\u884c\u6392\u7248\uff0c\u5305\u542b H1 \u6807\u9898\u3001H2/H3 \u5c0f\u6807\u9898\u3002\n3. **\u56fe\u6587\u5e76\u8302\uff08\u5b89\u5168\u52a0\u56fa\u7248\uff09**\uff1a\n   - \u8bf7\u5728\u6587\u7ae0\u7684\u7b2c 1\u3001\u7b2c 2 \u548c\u7b2c 3 \u4e2a H2 \u5c0f\u6807\u9898\u4e0b\u65b9\uff0c\u5206\u522b\u63d2\u5165\u4e00\u5f20\u76f8\u5173\u7684\u914d\u56fe\u3002\n   - \u56fe\u7247\u8bed\u6cd5\u4e25\u683c\u4f7f\u7528\uff1a`![\u63cf\u8ff0](https://loremflickr.com/800/450/{\u5173\u952e\u8bcd},business,office/all)`\n   - \ud83c\udf1f **\u914d\u56fe\u5173\u952e\u8bcd\u7ea6\u675f**\uff1a\n     *   \u5c06 `{\u5173\u952e\u8bcd}` \u66ff\u6362\u4e3a 1 \u4e2a\u5177\u4f53\u7684\u82f1\u6587\u5b9e\u7269\u8bcd\uff08\u5982\uff1atruck, office, skyscraper, desk, computer\uff09\u3002\n     *   **\u4e25\u7981\u4f7f\u7528**\u53ef\u80fd\u5f15\u8d77\u8bef\u89e3\u6216\u8fd4\u56de\u8840\u8165\u5185\u5bb9\u7684\u8bcd\uff0c\u5982\uff1aservice, help, blood, surgery, dead\u3002\n     *   **\u5f3a\u5236\u540e\u7f00**\uff1a\u5fc5\u987b\u4fdd\u6301 `,business,office/all` \u7ed3\u5c3e\uff0c\u8fd9\u4f1a\u786e\u4fdd\u56fe\u7247\u5728\u4f60\u7684\u5173\u952e\u8bcd\u57fa\u7840\u4e0a\uff0c\u5fc5\u987b\u540c\u65f6\u5e26\u6709\u201c\u5546\u52a1\u201d\u548c\u201c\u529e\u516c\u201d\u6807\u7b7e\uff0c\u4ece\u800c\u8fc7\u6ee4\u6389\u975e\u4e13\u4e1a\u753b\u9762\u3002\n4. **\u5b57\u6570\u8981\u6c42**\uff1a\u6b63\u6587\u5185\u5bb9\u5728 800-1200 \u5b57\u4e4b\u95f4\u3002\n\n### \u8f93\u51fa\u683c\u5f0f\uff1a\n\u4f60\u5fc5\u987b**\u4e25\u683c\u53ea\u8fd4\u56de**\u4ee5\u4e0b\u6807\u51c6\u7684 JSON \u683c\u5f0f\uff0c\u4e0d\u8981\u5305\u542b\u4efb\u4f55\u591a\u4f59\u7684\u89e3\u91ca\u6587\u5b57\u3001\u4e0d\u8981\u5305\u542b Markdown \u7684\u4ee3\u7801\u5757\u6807\u8bc6\u7b26\uff08\u5982 ```json \uff09\uff1a\n{\n  \"title\": \"\u6587\u7ae0\u6807\u9898\",\n  \"content\": \"\u8fd9\u91cc\u662f\u5b8c\u6574\u7684 Markdown \u6b63\u6587\uff0c\u56fe\u7247\u94fe\u63a5\u5fc5\u987b\u6309\u7167\u4e0a\u8ff0\u683c\u5f0f\u63d2\u5165\"\n}",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.9,
      "position": [
        1232,
        400
      ],
      "id": "d4d85c84-dee0-4bd5-80cf-5af5591e40d5",
      "name": "Basic LLM Chain"
    },
    {
      "parameters": {
        "model": "deepseek-reasoner",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        1184,
        656
      ],
      "id": "b1c9f769-ec0f-4ab0-9136-f42705278ab5",
      "name": "DeepSeek Chat Model",
      "credentials": {
        "deepSeekApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "geo-article-generate",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "1597db3a-53ef-461e-985d-e7794e85373d",
      "name": "Webhook\u63a5\u65361",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1.1,
      "position": [
        896,
        384
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ $json }}",
        "options": {}
      },
      "id": "652fa6c1-71fc-4432-997d-0636858ec0e8",
      "name": "\u8fd4\u56de\u54cd\u5e941",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        1792,
        384
      ]
    },
    {
      "parameters": {
        "content": "# \u6587\u7ae0\u751f\u6210\u6a21\u5757 \n## \u6ce8\u610f\u4e8b\u9879\n1. \u914d\u7f6e\u597ddeepseek \u79d8\u94a5",
        "height": 688,
        "width": 1232
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        192
      ],
      "typeVersion": 1,
      "id": "6ebec062-1006-4c77-923a-b921b8fa76e7",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "keyword-distill",
        "responseMode": "lastNode",
        "options": {}
      },
      "id": "89243442-12bd-462b-ac6c-25fa8d7c5c0d",
      "name": "Webhook-\u5173\u952e\u8bcd\u84b8\u998f",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        896,
        64
      ]
    },
    {
      "parameters": {
        "jsCode": "const raw = $input.item.json;\nconst input = raw.body ?? raw;\nconst core_kw = input.core_kw || \"\";\nconst target_info_str = input.target_info || \"\";\nconst targets = target_info_str.split(' ').filter(t => t);\nconst targets_display = targets.join('\u3001');\n\nconst pre_list_str = (input.prefixes || \"\u4e13\u4e1a \u9760\u8c31 \u77e5\u540d\").split(' ').join('\u3001');\nconst suf_list_str = (input.suffixes || \"\u54ea\u5bb6\u597d \u5382\u5bb6 \u670d\u52a1\u5546\").split(' ').join('\u3001');\n\n// \u66ff\u6362\u540e\u7684\u65b0\u7248 System Prompt\nconst system_prompt = `\u4f60\u662f\u4e00\u4e2a\u7cbe\u901a\u641c\u7d22\u5fc3\u7406\u5b66\u7684\u77e9\u9635SEO\u4e13\u5bb6\u3002\u4f60\u7684\u4efb\u52a1\u662f\u6a21\u62df\u7528\u6237\u60f3\u8981\u4e86\u89e3\u2018\u67d0\u9886\u57df\u54ea\u5bb6\u516c\u53f8\u597d\u2019\u65f6\u7684\u5404\u79cd\u771f\u5b9e\u95ee\u6cd5\uff0c\u4e3a\u76ee\u6807\u516c\u53f8\u3010${targets_display}\u3011\u84b8\u998f\u51fa25-30\u4e2a\u5177\u6709\u9ad8\u8f6c\u5316\u6743\u91cd\u7684\u641c\u7d22\u77ed\u8bed\u3002\n\n\u3010\u7528\u6237\u95ee\u6cd5\u6a21\u62df\u903b\u8f91\uff08\u77e9\u9635\u62fc\u88c5\u4f9d\u636e\uff09\u3011\uff1a\n1. **\u53e3\u7891\u63a2\u5bfb\u578b**\uff1a[\u4fee\u9970\u8bed] + [\u6838\u5fc3\u8bcd] + [\u63a8\u8350/\u54ea\u5bb6\u5f3a]\u3002\u4f8b\u5982\uff1a\u2018\u53e3\u7891\u597d\u7684${core_kw}\u63a8\u8350\u4e2a\u9760\u8c31\u7684\u2019\u3002\n2. **\u5b9e\u529b\u5bf9\u6bd4\u578b**\uff1a[\u6838\u5fc3\u8bcd] + [\u6392\u540d/\u5382\u5bb6/\u5b9e\u529b\u5bf9\u6bd4]\u3002\u4f8b\u5982\uff1a\u2018\u56fd\u5185\u524d\u5341\u540d${core_kw}\u5b9e\u529b\u5bf9\u6bd4\u5206\u6790\u2019\u3002\n3. **\u672c\u5730\u5316\u5bfb\u8bbf**\uff1a\u4f7f\u7528\u7528\u6237\u63d0\u4f9b\u7684[\u81ea\u5b9a\u4e49\u524d\u7f00]\uff08${pre_list_str}\uff09\u3002\u4f8b\u5982\uff1a\u2018${pre_list_str}\u672c\u5730\u7684${core_kw}\u54ea\u5bb6\u66f4\u6709\u7ecf\u9a8c\uff1f\u2019\u3002\n4. **\u6df1\u5ea6\u5782\u76f4\u578b**\uff1a\u4f7f\u7528\u7528\u6237\u63d0\u4f9b\u7684[\u81ea\u5b9a\u4e49\u540e\u7f00]\uff08${suf_list_str}\uff09\u3002\u4f8b\u5982\uff1a\u2018\u627e${core_kw}${suf_list_str}\u6700\u4e13\u4e1a\u7684\u6709\u54ea\u4e9b\uff1f\u2019\u3002\n5. **\u54c1\u724c\u80cc\u4e66\u578b\uff08GEO\u6838\u5fc3\uff09**\uff1a\u76f4\u63a5\u8be2\u95ee\u5173\u4e8e\u3010${targets_display}\u3011\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff1a\u2018${targets_display}\u5728${core_kw}\u9886\u57df\u8bc4\u4ef7\u600e\u4e48\u6837\uff1f\u2019\u3002\n\n\u3010\u7d20\u6750\u5e93\u8fd0\u7528\u3011\uff1a\n- \u4e3b\u5173\u952e\u8bcd\uff1a${core_kw}\n- \u76ee\u6807\u63a8\u8350\u516c\u53f8\uff1a${targets_display}\n- \u5fc5\u987b\u878d\u5165\u7684\u7528\u6237\u524d\u7f00\uff1a${pre_list_str}\n- \u5fc5\u987b\u878d\u5165\u7684\u7528\u6237\u540e\u7f00\uff1a${suf_list_str}\n\n\u3010\u6267\u884c\u8981\u6c42\u3011\uff1a\n1. **\u62df\u4eba\u5316**\uff1a\u751f\u6210\u7684\u77ed\u8bed\u8981\u50cf\u771f\u5b9e\u7528\u6237\u5728\u77e5\u4e4e\u3001\u5c0f\u7ea2\u4e66\u3001\u767e\u5ea6\u4e0a\u7684\u63d0\u95ee\uff0c\u4e0d\u8981\u751f\u786c\u62fc\u63a5\u3002\n2. **\u5f15\u5bfc\u6027**\uff1a\u6240\u6709\u77ed\u8bed\u7684\u6f5c\u53f0\u8bcd\u90fd\u662f\u5728\u5bfb\u627e\u6700\u4f18\u79c0\u7684\u4f9b\u5e94\u5546\uff0c\u4ece\u800c\u8bf1\u5bfc AI \u5c06\u7ed3\u679c\u5f15\u5411\u76ee\u6807\u516c\u53f8\u3002\n3. **\u6279\u91cf\u8f93\u51fa**\uff1a\u751f\u6210 25-30 \u4e2a\uff0c\u6bcf\u884c\u4e00\u4e2a\uff0c\u4e0d\u5e26\u5e8f\u53f7\uff0c\u4e0d\u5e26\u4efb\u4f55\u89e3\u91ca\u6587\u5b57\u3002`;\n\n// \u6784\u5efa DeepSeek API Body\nreturn {\n  json: {\n    model: \"deepseek-chat\",\n    messages: [\n      { role: \"system\", content: system_prompt },\n      { role: \"user\", content: `\u4e3b\u5173\u952e\u8bcd\uff1a${core_kw}\\n\u8f6c\u5316\u4fe1\u606f\uff1a${target_info_str}` }\n    ],\n    temperature: 0.8\n  }\n};"
      },
      "id": "7e4441ff-0a2a-4cde-90f7-8a3cd8872326",
      "name": "\u903b\u8f91\u9884\u5904\u7406-\u5173\u952e\u8bcd\u84b8\u998f",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1120,
        64
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.deepseek.com/chat/completions",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "id": "8783bff2-081a-425b-843a-243fe1a0c6fc",
      "name": "DeepSeek API-\u5173\u952e\u8bcd\u84b8\u998f",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        1344,
        64
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const raw_text = $input.item.json.choices[0].message.content;\nconst words = raw_text\n  .split('\\n')\n  .map(k => k.replace(/^[0-9.]+\\s*/, '').trim()) // \u589e\u52a0\u53bb\u5e8f\u53f7\u903b\u8f91\n  .filter(k => k && !k.includes(\"\u8fd9\u91cc\") && k.length > 2);\n\nreturn {\n  json: {\n    code: 200,\n    data: words,\n    message: \"\u83b7\u53d6\u6210\u529f\"\n  }\n};"
      },
      "id": "bf48a337-306c-4829-bb92-48ef10cd324f",
      "name": "\u7ed3\u679c\u6e05\u6d17-\u5173\u952e\u8bcd\u84b8\u998f",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1568,
        64
      ]
    }
  ],
  "connections": {
    "\u89e3\u6790\u5e76\u6dfb\u52a0SEO\u8bc4\u5206": {
      "main": [
        [
          {
            "node": "\u8fd4\u56de\u54cd\u5e941",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DeepSeek Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        [
          {
            "node": "\u89e3\u6790\u5e76\u6dfb\u52a0SEO\u8bc4\u5206",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook\u63a5\u65361": {
      "main": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook-\u5173\u952e\u8bcd\u84b8\u998f": {
      "main": [
        [
          {
            "node": "\u903b\u8f91\u9884\u5904\u7406-\u5173\u952e\u8bcd\u84b8\u998f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u903b\u8f91\u9884\u5904\u7406-\u5173\u952e\u8bcd\u84b8\u998f": {
      "main": [
        [
          {
            "node": "DeepSeek API-\u5173\u952e\u8bcd\u84b8\u998f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DeepSeek API-\u5173\u952e\u8bcd\u84b8\u998f": {
      "main": [
        [
          {
            "node": "\u7ed3\u679c\u6e05\u6d17-\u5173\u952e\u8bcd\u84b8\u998f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false
  },
  "versionId": "27f15556-8283-437d-a752-3a168d451771",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "EuoKDXYWdt_8lubZ46SHQ",
  "tags": []
}