[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] 为文章/帖子分配类别/标签",
"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": "简单记忆",
"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 聊天模型",
"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": "列出帖子/文章/页面",
"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": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
208
],
"parameters": {
"color": 6,
"width": 256,
"height": 480,
"content": "## 定义仓库"
},
"typeVersion": 1
},
{
"id": "41217dfe-2aa3-43bc-a415-88d22bb7e042",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1424,
-576
],
"parameters": {
"color": 5,
"height": 416,
"content": "## 获取文件内容"
},
"typeVersion": 1
},
{
"id": "9985d456-e5ec-4546-9020-ce0a0f9eb57c",
"name": "添加包含帖子/文章分析的行",
"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": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
2624,
112
],
"parameters": {
"color": 4,
"width": 368,
"height": 464,
"content": "## 将建议保存到 Google Sheets 文件"
},
"typeVersion": 1
},
{
"id": "b8e31673-da84-4368-9f88-7a9cc2980e43",
"name": "获取帖子/文章文件",
"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": "获取表格中的行",
"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": "仅列出文件名/移除重复项",
"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": "仅从 GitHub 仓库获取文件路径",
"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": "仅从 Google Sheets 获取文件路径",
"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": "检查新仓库文件以进行 AI 处理",
"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": "分支",
"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": "表单提交时",
"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": "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": "处理完成 - 已添加类别和标签",
"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": "合并 GitHub 和 Google Sheets 读取",
"type": "n8n-nodes-base.merge",
"position": [
560,
-448
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "ba6b4acc-e548-4df7-9559-bf3ba9b087b6",
"name": "结构化输出解析器",
"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": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
-960
],
"parameters": {
"color": 4,
"width": 256,
"height": 608,
"content": "## 从 Google Sheets 获取帖子列表"
},
"typeVersion": 1
},
{
"id": "3fa92146-9b0d-45a9-be49-9cf6be9d66ec",
"name": "便签4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
-960
],
"parameters": {
"color": 7,
"width": 256,
"height": 608,
"content": "## 仅列出文件名并移除重复项"
},
"typeVersion": 1
},
{
"id": "1653cada-fdf6-418e-aab6-bb715d25ebf1",
"name": "便利贴5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-960
],
"parameters": {
"color": 7,
"width": 320,
"height": 608,
"content": "## 将 JSON 转换为数组"
},
"typeVersion": 1
},
{
"id": "45a2544a-424d-466c-9fa4-afa25ea1f08c",
"name": "便签 6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1424,
-1008
],
"parameters": {
"height": 352,
"content": "## GitHub 仓库中没有新文件"
},
"typeVersion": 1
},
{
"id": "8b7ed568-b0fb-4589-9d5d-cf10699794d1",
"name": "便签 7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
208
],
"parameters": {
"color": 7,
"width": 320,
"height": 480,
"content": "## 将 JSON 转换为数组"
},
"typeVersion": 1
},
{
"id": "c39a9ece-2d68-47c0-b4e5-82e6acb0eb1e",
"name": "便签8",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
-608
],
"parameters": {
"color": 7,
"width": 256,
"height": 320,
"content": "## 比较来自 Google Sheets 的列表与来自 Github 的列表"
},
"typeVersion": 1
},
{
"id": "97c232f0-6358-442d-a8c1-8234e7afff4d",
"name": "便签 9",
"type": "n8n-nodes-base.stickyNote",
"position": [
2080,
-288
],
"parameters": {
"color": 7,
"width": 480,
"height": 736,
"content": "## AI Agent"
},
"typeVersion": 1
},
{
"id": "935037f1-860d-42a3-b898-fccbd545c145",
"name": "循环处理帖子/页面",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1776,
-352
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "779d1b8f-1523-4c49-bdcc-6f4ed34ca301",
"name": "便签10",
"type": "n8n-nodes-base.stickyNote",
"position": [
2096,
-736
],
"parameters": {
"height": 352,
"content": "## GitHub 仓库中没有新文件"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "e501f3f5-a580-4fdb-94cb-62bb5de8d0dc",
"connections": {
"Switch": {
"main": [
[
{
"node": "No new posts/articles in GitHub",
"type": "main",
"index": 0
}
],
[
{
"node": "Get post/article file",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Append rows with posts / article analysis",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"On form submission": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
},
{
"node": "List posts/articles/pages",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "List FileName only / Remove duplicates",
"type": "main",
"index": 0
}
]
]
},
"Get post/article file": {
"main": [
[
{
"node": "Loop Over Posts/Pages",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Posts/Pages": {
"main": [
[
{
"node": "Proces finished - Categories and tags added",
"type": "main",
"index": 0
}
],
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"List posts/articles/pages": {
"main": [
[
{
"node": "Get paths to files only from GitHub repository",
"type": "main",
"index": 0
}
]
]
},
"Merge GitHub and Google Sheets read": {
"main": [
[
{
"node": "Check new repo files for AI processing",
"type": "main",
"index": 0
}
]
]
},
"Check new repo files for AI processing": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"Get file paths only from GoogleSheets": {
"main": [
[
{
"node": "Merge GitHub and Google Sheets read",
"type": "main",
"index": 0
}
]
]
},
"List FileName only / Remove duplicates": {
"main": [
[
{
"node": "Get file paths only from GoogleSheets",
"type": "main",
"index": 0
}
]
]
},
"Append rows with posts / article analysis": {
"main": [
[
{
"node": "Loop Over Posts/Pages",
"type": "main",
"index": 0
}
]
]
},
"Get paths to files only from GitHub repository": {
"main": [
[
{
"node": "Merge GitHub and Google Sheets read",
"type": "main",
"index": 1
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 内容创作, AI 摘要总结
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
WordPress博客自动化专业版(深度研究)v2.1市场
使用GPT-4o、Perplexity AI和多语言支持自动化SEO优化的博客创建
If
Set
Xml
+27
125 节点Daniel Ng
内容创作
使用 OpenAI、ElevenLabs 和 Fal.ai 自动化病毒式内容创作,适用于视频、播客和 ASMR
使用 OpenAI、ElevenLabs 和 Fal.ai 自动化病毒式内容创作,适用于视频、播客和 ASMR
Set
Code
Wait
+16
97 节点Adam Crafts
内容创作
使用Bright Data MCP和AIAgents搜索和分析社交媒体资料
使用AI生成360度社交媒体报告 - Bright Data MCP
Set
Code
Form
+13
50 节点Romuald Członkowski
潜在客户开发
使用 OpenAI、QuickChart 和 Google Drive 将电子表格数据转换为智能图表
使用 OpenAI、QuickChart 和 Google Drive 将电子表格数据转换为智能图表
If
Set
Code
+18
82 节点LeeWei
内容创作
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+93
113 节点I versus AI
其他
(Duc)深度研究市场模板
集成PerplexityAI研究和OpenAI内容的多层级WordPress博客生成器
If
Set
Xml
+28
132 节点Daniel Ng
人工智能