[astro/nextjs] 为文章/帖子分配类别/标签
高级
这是一个Content Creation, AI Summarization领域的自动化工作流,包含 29 个节点。主要使用 Code, Form, Merge, Github, Switch 等节点。 使用OpenAI GPT-4、GitHub和Google Sheets为Astro/Next.js博客文章自动分类
前置要求
- •GitHub Personal Access Token
- •Google Sheets API 凭证
- •OpenAI API Key
使用的节点 (29)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "c3REFIr9ubIDDYJ5",
"meta": {
"instanceId": "2295c029f4cb86c8f849f9c87dade323734dc279619eb9e2704f8473c381e4d1",
"templateCredsSetupCompleted": true
},
"name": "[astro/nextjs] Assign cattegories / tags for article / post",
"tags": [],
"nodes": [
{
"id": "48cac2b7-14b3-4d02-8db7-082c9a8a5cec",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2192,
96
],
"parameters": {
"text": "={{ $json.path }}",
"options": {
"systemMessage": "You are a helpful assistant which helps to assign proper tags and categories for post. Example of post is added in section <post>. \n\nEach post has a section which starts with \"---\" and ands with next ocurance of \"---\". This section is metadata which describes the post. After second ocurance of \"---\" file has a content. \n\nRead tags and categories and assign them to <tags> and <categories> variables used later in response.\n\nBased on content please provide categories assigned to <new_assigned_categories> and tags list assigned to <new_assigned_tags> as example below:\n\n<example>\ncategories: [\"business\"] \ntags: [\"DigitalGirls\", \"ITPioneers\", \"WomenInIT\", \"IT\", \"FemalePower\", \"Debugging\", \"GraceHopper\"] \n</example>\n\nFinal result should be post with updated metadata passed to variable <content>.\n\n<post> \n--- \ntitle: \"Where Did the Term ‘Debug’ Come From? – Women in IT\" \npubDate: 2024-07-23 description: \"Did you know that the term ‘debug’ was coined by Admiral Grace Hopper?\" \ncategories: [\"business\"] \ntags: [\"DigitalGirls\", \"ITPioneers\", \"WomenInIT\", \"IT\", \"FemalePower\", \"Debugging\", \"GraceHopper\"] \ncoverImage: \"@assets/2024-07-23-skad-sie-wzielo-okreslenie-debug-kobiety-w-it.jpeg\" \n---\n\nDid you know that the term debug was coined by Admiral Grace Hopper?\nWhile working on the Mark II computer at Harvard University, a moth got trapped in a relay, interfering with the machine’s operation. Removing the dead insect was humorously referred to by Admiral Hopper as debugging.\n\nPS. After a conversation with Wioletta Klimczak, I got my hands on the book “Digital Girls. Pioneers of Polish Computer Science” by Karolina Wasielewska. The story above comes from that book. It’s proof that women are an important part of the IT world!\n\n#DigitalGirls #ITPioneers #WomenInIT #IT #FemalePower #Debugging #GraceHopper\n</post>"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "1844db4c-6da3-47cb-be7a-2aad32126178",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
2272,
288
],
"parameters": {
"sessionKey": "simple_memory",
"sessionIdType": "customKey",
"contextWindowLength": 2
},
"typeVersion": 1.3
},
{
"id": "5467bd31-25c6-4133-ba33-a6c66c332881",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2128,
288
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {
"responseFormat": "json_object"
}
},
"credentials": {
"openAiApi": {
"id": "7lmHcPMAjhsZFa1f",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "d462260a-ba85-4e3b-9ddf-f3e0d37ea249",
"name": "List posts/articles/pages",
"type": "n8n-nodes-base.github",
"position": [
-240,
512
],
"webhookId": "ecf1a2e3-4fc4-4660-b4a9-a97743df2a1b",
"parameters": {
"owner": {
"__rl": true,
"mode": "list",
"value": "pjsikora",
"cachedResultUrl": "https://github.com/pjsikora",
"cachedResultName": "pjsikora"
},
"filePath": "src/content/blog/pl/",
"resource": "file",
"operation": "list",
"repository": {
"__rl": true,
"mode": "list",
"value": "astro-n8n-test",
"cachedResultUrl": "https://github.com/pjsikora/astro-n8n-test",
"cachedResultName": "astro-n8n-test"
}
},
"credentials": {
"githubApi": {
"id": "Qjzxc6aMdLBzUGJB",
"name": "GitHub account"
}
},
"typeVersion": 1.1
},
{
"id": "3fb2d73a-f707-46dc-8357-67772d6a9b67",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
208
],
"parameters": {
"color": 6,
"width": 256,
"height": 480,
"content": "## Define repository\nDefine repository and directory in which workflow can find articles / post "
},
"typeVersion": 1
},
{
"id": "41217dfe-2aa3-43bc-a415-88d22bb7e042",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1424,
-576
],
"parameters": {
"color": 5,
"height": 416,
"content": "## Get file content\nGet file content and pass it to AI Agent"
},
"typeVersion": 1
},
{
"id": "9985d456-e5ec-4546-9020-ce0a0f9eb57c",
"name": "Append rows with posts / article analysis",
"type": "n8n-nodes-base.googleSheets",
"position": [
2768,
400
],
"parameters": {
"columns": {
"value": {
"Tags": "={{ JSON.stringify($json.output.old_tags) }}",
"FileName": "={{ $('Get post/article file').item.json.path }}",
"Categories": "={{ JSON.stringify($json.output.old_categories) }}",
"Proposed Tags": "={{ JSON.stringify($json.output.tags) }}",
"Proposed Categories": "={{ JSON.stringify($json.output.categories) }}"
},
"schema": [
{
"id": "FileName",
"type": "string",
"display": true,
"required": false,
"displayName": "FileName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Categories",
"type": "string",
"display": true,
"required": false,
"displayName": "Categories",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Proposed Categories",
"type": "string",
"display": true,
"required": false,
"displayName": "Proposed Categories",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tags",
"type": "string",
"display": true,
"required": false,
"displayName": "Tags",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Proposed Tags",
"type": "string",
"display": true,
"required": false,
"displayName": "Proposed Tags",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MU35s5OAZ4rcCXRnvkkcxrgSVAjXISeULPrCdCl0gXo/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1MU35s5OAZ4rcCXRnvkkcxrgSVAjXISeULPrCdCl0gXo",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MU35s5OAZ4rcCXRnvkkcxrgSVAjXISeULPrCdCl0gXo/edit?usp=drivesdk",
"cachedResultName": "[AstroPosts]"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "sgj6aGeryqEVmS3h",
"name": "GSheets - Piotr.Sikora.Ck@gmail.com"
}
},
"typeVersion": 4.7
},
{
"id": "2476998a-9a1b-4d40-b9d1-32f6f68d5d02",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
2624,
112
],
"parameters": {
"color": 4,
"width": 368,
"height": 464,
"content": "## Save propositions to Google SHeet file\n\nPrepare Google Sheet to contain following columns:\n- FileName\n- Categories\n- Proposed Categories\n- Tags\n- Proposed Tags"
},
"typeVersion": 1
},
{
"id": "b8e31673-da84-4368-9f88-7a9cc2980e43",
"name": "Get post/article file",
"type": "n8n-nodes-base.github",
"position": [
1504,
-352
],
"webhookId": "682a79e6-7c61-452d-8170-6f83196743a8",
"parameters": {
"owner": {
"__rl": true,
"mode": "list",
"value": "pjsikora",
"cachedResultUrl": "https://github.com/pjsikora",
"cachedResultName": "pjsikora"
},
"filePath": "={{ $json.path }}",
"resource": "file",
"operation": "get",
"repository": {
"__rl": true,
"mode": "list",
"value": "piotr-sikora.com",
"cachedResultUrl": "https://github.com/pjsikora/piotr-sikora.com",
"cachedResultName": "piotr-sikora.com"
},
"additionalParameters": {}
},
"credentials": {
"githubApi": {
"id": "Qjzxc6aMdLBzUGJB",
"name": "GitHub account"
}
},
"typeVersion": 1.1
},
{
"id": "980668bc-d2d2-4452-8f89-b16bec365c91",
"name": "Get row(s) in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
-512,
-512
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MU35s5OAZ4rcCXRnvkkcxrgSVAjXISeULPrCdCl0gXo/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1MU35s5OAZ4rcCXRnvkkcxrgSVAjXISeULPrCdCl0gXo",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MU35s5OAZ4rcCXRnvkkcxrgSVAjXISeULPrCdCl0gXo/edit?usp=drivesdk",
"cachedResultName": "[AstroPosts]"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "sgj6aGeryqEVmS3h",
"name": "GSheets - Piotr.Sikora.Ck@gmail.com"
}
},
"typeVersion": 4.7
},
{
"id": "00c43343-2e97-43fb-96d7-a1df7492516e",
"name": "List FileName only / Remove duplicates",
"type": "n8n-nodes-base.code",
"position": [
-240,
-512
],
"parameters": {
"jsCode": "const filteredList = $input.all().map(item => {\n return {\n json: {\n path: item.json.FileName\n }\n };\n});\n\n\nconst seen = new Set();\nconst unique = [];\n\nfor (const item of filteredList) {\n const name = item.json.path;\n if (!seen.has(name)) {\n seen.add(name);\n unique.push(item);\n }\n}\n\nreturn unique;"
},
"typeVersion": 2
},
{
"id": "2f1096f5-0280-4a3b-9a6f-3247bdd1ea44",
"name": "Get paths to files only from GitHub repository",
"type": "n8n-nodes-base.aggregate",
"position": [
48,
512
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "githubPaths",
"fieldToAggregate": "path"
}
]
}
},
"typeVersion": 1
},
{
"id": "31799c27-6a3b-4220-bceb-e7dcf6277f5f",
"name": "Get file paths only from GoogleSheets",
"type": "n8n-nodes-base.aggregate",
"position": [
32,
-512
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "googlesheetsPaths",
"fieldToAggregate": "path"
}
]
}
},
"typeVersion": 1
},
{
"id": "3aba4eab-3305-4f86-9976-ef33d5a7c96e",
"name": "Check new repo files for AI processing",
"type": "n8n-nodes-base.code",
"position": [
800,
-448
],
"parameters": {
"jsCode": "const allItems = $input.all();\n\n// Extract arrays \nconst googlePaths = allItems.find(i => i.json.googlesheetsPaths)?.json.googlesheetsPaths || [];\nconst githubPaths = allItems.find(i => i.json.githubPaths)?.json.githubPaths || [];\n\n// Compute difference: elements in githubPaths not in googlesheetsPaths\nconst difference = githubPaths.filter(path => !googlePaths.includes(path));\n\n// Return as n8n item array\nreturn difference.map(path => ({ json: { path } }));"
},
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "1b542ec1-b963-4064-89fb-40a2a846c5f6",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
1008,
-448
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "Empty JSON",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "7a2c39ae-c079-4e60-ac98-163b1b148244",
"operator": {
"type": "object",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
},
"renameOutput": true
},
{
"outputKey": "Not empty JSON",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "90067dec-6a4b-4a26-8703-61d4fd44ed7a",
"operator": {
"type": "object",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.3
},
{
"id": "8e129b23-d5a7-4630-ab8a-e780373657db",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
-832,
-512
],
"webhookId": "67880b06-ee61-4732-9324-3440d25c9f95",
"parameters": {
"options": {},
"formTitle": "Start process ",
"formDescription": "Start process of adding tags and categories"
},
"typeVersion": 2.3
},
{
"id": "47908ded-1702-483c-9ab9-f60a1ba3c82f",
"name": "No new posts/articles in GitHub",
"type": "n8n-nodes-base.form",
"position": [
1488,
-848
],
"webhookId": "bee21cb0-92f3-45a1-b680-d9fc37b4f9d8",
"parameters": {
"options": {},
"operation": "completion",
"completionTitle": "List is empty",
"completionMessage": "List of articles is empty (there is no new articles/pages in repository)"
},
"typeVersion": 2.3
},
{
"id": "a1410a1b-0ce6-490e-912b-3c14107b13bb",
"name": "Proces finished - Categories and tags added",
"type": "n8n-nodes-base.form",
"position": [
2176,
-560
],
"webhookId": "bee21cb0-92f3-45a1-b680-d9fc37b4f9d8",
"parameters": {
"options": {},
"operation": "completion",
"completionTitle": "Proces finished",
"completionMessage": "Categories and tags added"
},
"typeVersion": 2.3
},
{
"id": "ec135e1d-ba4d-4069-8da0-a1d663ad839c",
"name": "Merge GitHub and Google Sheets read",
"type": "n8n-nodes-base.merge",
"position": [
560,
-448
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "ba6b4acc-e548-4df7-9559-bf3ba9b087b6",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
2416,
288
],
"parameters": {
"jsonSchemaExample": "{\n \"old_categories\": [\"category1\"],\n \"categories\": [\"category1\",\"category2\"],\n \"old_tags\": [\"tag1\",\"tag2\"],\n \"tags\": [\"tag1\",\"tag2\",\"tag3\",\"tag4\"]\n}"
},
"typeVersion": 1.3
},
{
"id": "a637ee7d-af38-420d-8717-e82dbafb3edb",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
-960
],
"parameters": {
"color": 4,
"width": 256,
"height": 608,
"content": "## Get list of posts from Google Sheets\n\nThis step prevents repeating usage of AI Agent for previously analysed posts/pages.\n\nPrepare Google Sheet to contain following columns:\n- FileName\n- Categories\n- Proposed Categories\n- Tags\n- Proposed Tags"
},
"typeVersion": 1
},
{
"id": "3fa92146-9b0d-45a9-be49-9cf6be9d66ec",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
-960
],
"parameters": {
"color": 7,
"width": 256,
"height": 608,
"content": "## List FileNames only and Remove duplicates\n\nThis function filters out duplicate items from a list of Google Sheet objects based on the value of each item’s `FileName` property"
},
"typeVersion": 1
},
{
"id": "1653cada-fdf6-418e-aab6-bb715d25ebf1",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-960
],
"parameters": {
"color": 7,
"width": 320,
"height": 608,
"content": "## Conver JSON to Array\n\nConvert from:\n```\n{\n\"path\": \"src1\"\n},\n{\n\"path\": \"src2\"\n},\n```\nTo\n```\n{\n\"googlesheetsPaths\": \n[\n\"src1\", \n\"src2\"\n]\n}\n```"
},
"typeVersion": 1
},
{
"id": "45a2544a-424d-466c-9fa4-afa25ea1f08c",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1424,
-1008
],
"parameters": {
"height": 352,
"content": "## No new files in GitHub repository\n"
},
"typeVersion": 1
},
{
"id": "8b7ed568-b0fb-4589-9d5d-cf10699794d1",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
208
],
"parameters": {
"color": 7,
"width": 320,
"height": 480,
"content": "## Conver JSON to Array\n\nConvert complex JSON to Array\n```\n{\n\"githubPaths\": \n[\n\"src1\", \n\"src2\"\n]\n}\n```"
},
"typeVersion": 1
},
{
"id": "c39a9ece-2d68-47c0-b4e5-82e6acb0eb1e",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
-608
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## Compare list from Google Sheets with list from Github\n"
},
"typeVersion": 1
},
{
"id": "97c232f0-6358-442d-a8c1-8234e7afff4d",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
2080,
-288
],
"parameters": {
"color": 7,
"width": 480,
"height": 736,
"content": "## AI Agent\n\nRole of **AI Agent** is to:\n- Analyse content of the file (post/page)\n- Assign categories and tags per analysed file\n- Return JSON in format by `Structured output` like below:\n\n```\n{\n \"old_categories\": [\"category1\"],\n \"categories\": [\"category1\",\"category2\"],\n \"old_tags\": [\"tag1\",\"tag2\"],\n \"tags\": [\"tag1\",\"tag2\",\"tag3\",\"tag4\"]\n}\n```"
},
"typeVersion": 1
},
{
"id": "935037f1-860d-42a3-b898-fccbd545c145",
"name": "Loop Over Posts/Pages",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1776,
-352
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "779d1b8f-1523-4c49-bdcc-6f4ed34ca301",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
2096,
-736
],
"parameters": {
"height": 352,
"content": "## No new files in GitHub repository\n"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "e501f3f5-a580-4fdb-94cb-62bb5de8d0dc",
"connections": {
"1b542ec1-b963-4064-89fb-40a2a846c5f6": {
"main": [
[
{
"node": "47908ded-1702-483c-9ab9-f60a1ba3c82f",
"type": "main",
"index": 0
}
],
[
{
"node": "b8e31673-da84-4368-9f88-7a9cc2980e43",
"type": "main",
"index": 0
}
]
]
},
"48cac2b7-14b3-4d02-8db7-082c9a8a5cec": {
"main": [
[
{
"node": "9985d456-e5ec-4546-9020-ce0a0f9eb57c",
"type": "main",
"index": 0
}
]
]
},
"1844db4c-6da3-47cb-be7a-2aad32126178": {
"ai_memory": [
[
{
"node": "48cac2b7-14b3-4d02-8db7-082c9a8a5cec",
"type": "ai_memory",
"index": 0
}
]
]
},
"5467bd31-25c6-4133-ba33-a6c66c332881": {
"ai_languageModel": [
[
{
"node": "48cac2b7-14b3-4d02-8db7-082c9a8a5cec",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"8e129b23-d5a7-4630-ab8a-e780373657db": {
"main": [
[
{
"node": "980668bc-d2d2-4452-8f89-b16bec365c91",
"type": "main",
"index": 0
},
{
"node": "d462260a-ba85-4e3b-9ddf-f3e0d37ea249",
"type": "main",
"index": 0
}
]
]
},
"980668bc-d2d2-4452-8f89-b16bec365c91": {
"main": [
[
{
"node": "00c43343-2e97-43fb-96d7-a1df7492516e",
"type": "main",
"index": 0
}
]
]
},
"b8e31673-da84-4368-9f88-7a9cc2980e43": {
"main": [
[
{
"node": "935037f1-860d-42a3-b898-fccbd545c145",
"type": "main",
"index": 0
}
]
]
},
"935037f1-860d-42a3-b898-fccbd545c145": {
"main": [
[
{
"node": "a1410a1b-0ce6-490e-912b-3c14107b13bb",
"type": "main",
"index": 0
}
],
[
{
"node": "48cac2b7-14b3-4d02-8db7-082c9a8a5cec",
"type": "main",
"index": 0
}
]
]
},
"ba6b4acc-e548-4df7-9559-bf3ba9b087b6": {
"ai_outputParser": [
[
{
"node": "48cac2b7-14b3-4d02-8db7-082c9a8a5cec",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"d462260a-ba85-4e3b-9ddf-f3e0d37ea249": {
"main": [
[
{
"node": "2f1096f5-0280-4a3b-9a6f-3247bdd1ea44",
"type": "main",
"index": 0
}
]
]
},
"ec135e1d-ba4d-4069-8da0-a1d663ad839c": {
"main": [
[
{
"node": "3aba4eab-3305-4f86-9976-ef33d5a7c96e",
"type": "main",
"index": 0
}
]
]
},
"3aba4eab-3305-4f86-9976-ef33d5a7c96e": {
"main": [
[
{
"node": "1b542ec1-b963-4064-89fb-40a2a846c5f6",
"type": "main",
"index": 0
}
]
]
},
"31799c27-6a3b-4220-bceb-e7dcf6277f5f": {
"main": [
[
{
"node": "ec135e1d-ba4d-4069-8da0-a1d663ad839c",
"type": "main",
"index": 0
}
]
]
},
"00c43343-2e97-43fb-96d7-a1df7492516e": {
"main": [
[
{
"node": "31799c27-6a3b-4220-bceb-e7dcf6277f5f",
"type": "main",
"index": 0
}
]
]
},
"9985d456-e5ec-4546-9020-ce0a0f9eb57c": {
"main": [
[
{
"node": "935037f1-860d-42a3-b898-fccbd545c145",
"type": "main",
"index": 0
}
]
]
},
"2f1096f5-0280-4a3b-9a6f-3247bdd1ea44": {
"main": [
[
{
"node": "ec135e1d-ba4d-4069-8da0-a1d663ad839c",
"type": "main",
"index": 1
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 内容创作, AI 摘要总结
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
WordPress博客自动化专业版(深度研究)v2.1市场
使用GPT-4o、Perplexity AI和多语言支持自动化SEO优化的博客创建
If
Set
Xml
+
If
Set
Xml
125 节点Daniel Ng
内容创作
使用 OpenAI、ElevenLabs 和 Fal.ai 自动化病毒式内容创作
使用 OpenAI、ElevenLabs 和 Fal.ai 自动化病毒式内容创作,适用于视频、播客和 ASMR
Set
Code
Wait
+
Set
Code
Wait
97 节点Adam Crafts
内容创作
使用Bright Data MCP和AIAgents搜索和分析社交媒体资料
使用AI生成360度社交媒体报告 - Bright Data MCP
Set
Code
Form
+
Set
Code
Form
50 节点Romuald Członkowski
潜在客户开发
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+
If
Ftp
Set
113 节点I versus AI
其他
💥 使用NanoBanana、Seedream 4、ChatGPT Image和Veo 3自动化视频广告 - VIDE
使用AI(NanoBanana、Seedream、GPT-4o、Veo 3)自动化和发布视频广告活动
Set
Code
Wait
+
Set
Code
Wait
63 节点Dr. Firas
内容创作
批量SEO内容生成与带AI图片的Webflow草稿创建(模板)
使用GPT、Gemini图片和Webflow草稿创建进行批量SEO内容生成
If
Set
Code
+
If
Set
Code
54 节点Dahiana
内容创作