8
n8n 中文网amn8n.com

Typebot 流程与 GitHub 双向同步,使用 Typebot API

高级

这是一个DevOps领域的自动化工作流,包含 31 个节点。主要使用 If, Set, Code, Merge, Github 等节点。 Typebot 流程与 GitHub 双向同步,使用 Typebot API

前置要求
  • GitHub Personal Access Token
  • 可能需要目标 API 的认证凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "meta": {
    "instanceId": "00e9ec826c332aaa2865e65cdec318b633185c63a1cba1b3a2500858724cc85e",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "e770fbf4-8c4f-4aaa-b722-3140ecec28f2",
      "name": "点击\"执行\"时",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        360,
        640
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "49b53bc4-6441-4577-a851-bb7f2c580a39",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -220,
        480
      ],
      "parameters": {
        "color": 4,
        "width": 371,
        "height": 601,
        "content": "## Typebot备份到GitHub"
      },
      "typeVersion": 1
    },
    {
      "id": "7dede05f-8c5a-426e-a822-d21b7e50d976",
      "name": "执行工作流触发器",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -140,
        1620
      ],
      "parameters": {
        "inputSource": "passthrough"
      },
      "typeVersion": 1.1
    },
    {
      "id": "7469a576-e3ea-4e55-93f3-7f380f1a57e7",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        180,
        480
      ],
      "parameters": {
        "color": 7,
        "width": 1831,
        "height": 601,
        "content": "## 主工作流循环"
      },
      "typeVersion": 1
    },
    {
      "id": "acb81c9e-152a-4bf3-ab23-1eb66e8d5510",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -220,
        1100
      ],
      "parameters": {
        "color": 6,
        "width": 2231,
        "height": 941,
        "content": "## 子工作流"
      },
      "typeVersion": 1
    },
    {
      "id": "6df6e830-5721-421f-9b46-f99f9164eb4d",
      "name": "列出Typebots",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        800,
        740
      ],
      "parameters": {
        "url": "={{ $json.typebot.url }}/api/v1/typebots",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "workspaceId",
              "value": "={{ $json.typebot.workspace.id }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3d44e0b2-c404-424a-8eba-7ec111738939",
      "name": "typebot",
      "type": "n8n-nodes-base.set",
      "position": [
        1240,
        640
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "8fbbf5fa-0455-4066-80e0-1b2885343aea",
              "name": "typebot.url",
              "type": "string",
              "value": "={{ $('Globals').item.json.typebot.url }}"
            },
            {
              "id": "5e73d2e7-4b1a-4180-8af2-047e52eb8a0a",
              "name": "repo.owner",
              "type": "string",
              "value": "={{ $('Globals').item.json.repo.owner }}"
            },
            {
              "id": "22445c28-5431-45a5-86ca-0ab2ff26cff5",
              "name": "repo.name",
              "type": "string",
              "value": "={{ $('Globals').item.json.repo.name }}"
            },
            {
              "id": "232d9947-a43f-48a9-b385-da1aa8f5139e",
              "name": "origin",
              "type": "string",
              "value": "typebot"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "4be16d80-43fd-4cc1-b79c-11fec3c76829",
      "name": "获取Typebot",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        300,
        1360
      ],
      "parameters": {
        "url": "={{ $('Switch').item.json.typebot.url }}/api/v1/typebots/{{ $json.id }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "952f2ff9-0421-4239-947d-3d8f0b7925fd",
      "name": "分离输出",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1020,
        640
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "typebots"
      },
      "typeVersion": 1
    },
    {
      "id": "ef97c1ec-d175-44b7-a462-2c8c2a8221ad",
      "name": "编辑字段",
      "type": "n8n-nodes-base.set",
      "position": [
        520,
        1460
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={{ $json.typebot }}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "ef0cd866-afcd-41b9-8fad-15d79a88041e",
      "name": "便签4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        600
      ],
      "parameters": {
        "color": 4,
        "width": 150,
        "height": 80,
        "content": "## 编辑此节点 👇"
      },
      "typeVersion": 1
    },
    {
      "id": "e68821d5-11ea-4324-9957-303433a8aad7",
      "name": "全局变量",
      "type": "n8n-nodes-base.set",
      "position": [
        580,
        740
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "45027581-a75b-4375-a0f1-ebfddb0531f7",
              "name": "typebot.url",
              "type": "string",
              "value": "https://typebot.io"
            },
            {
              "id": "5513c8d4-1aba-45f3-ab8c-498fa36f5f59",
              "name": "typebot.workspace.id",
              "type": "string",
              "value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            },
            {
              "id": "6cf546c5-5737-4dbd-851b-17d68e0a3780",
              "name": "repo.owner",
              "type": "string",
              "value": "john-doe"
            },
            {
              "id": "452efa28-2dc6-4ea3-a7a2-c35d100d0382",
              "name": "repo.name",
              "type": "string",
              "value": "typebot-backup"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "3027c8bd-a477-4f47-a2a9-fd952d9f9698",
      "name": "计划触发器",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        360,
        840
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 7
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "caff32a5-6d82-43c9-998c-3258342d66b3",
      "name": "github",
      "type": "n8n-nodes-base.set",
      "position": [
        1240,
        840
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "5e73d2e7-4b1a-4180-8af2-047e52eb8a0a",
              "name": "repo.owner",
              "type": "string",
              "value": "={{ $('Globals').item.json.repo.owner }}"
            },
            {
              "id": "22445c28-5431-45a5-86ca-0ab2ff26cff5",
              "name": "repo.name",
              "type": "string",
              "value": "={{ $('Globals').item.json.repo.name }}"
            },
            {
              "id": "232d9947-a43f-48a9-b385-da1aa8f5139e",
              "name": "origin",
              "type": "string",
              "value": "github"
            },
            {
              "id": "456ec816-8c15-498b-bbc5-a96abce95d59",
              "name": "typebots",
              "type": "array",
              "value": "={{ $('List Typebots').item.json.typebots }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "4333f695-81d9-4c87-8d68-9a6245dc12d5",
      "name": "列出文件",
      "type": "n8n-nodes-base.github",
      "position": [
        1020,
        840
      ],
      "webhookId": "244ea8da-851f-4afb-980c-5e5973b6a1af",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Globals').item.json.repo.owner }}"
        },
        "resource": "file",
        "operation": "list",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Globals').item.json.repo.name }}"
        },
        "authentication": "oAuth2"
      },
      "credentials": {
        "githubOAuth2Api": {
          "id": "5UZFyU8iEpfKOIbY",
          "name": "GitHub marskdev"
        }
      },
      "executeOnce": true,
      "typeVersion": 1.1
    },
    {
      "id": "7eab3efa-c3e0-420a-9fb8-9cd9ff52f90e",
      "name": "获取文件数据",
      "type": "n8n-nodes-base.github",
      "position": [
        520,
        1260
      ],
      "webhookId": "5cf07ee9-70c6-48bf-b370-534315f2d48e",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.owner }}"
        },
        "filePath": "={{ $('Switch').item.json.id }}.json",
        "resource": "file",
        "operation": "get",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.name }}"
        },
        "authentication": "oAuth2",
        "asBinaryProperty": false,
        "additionalParameters": {}
      },
      "credentials": {
        "githubOAuth2Api": {
          "id": "5UZFyU8iEpfKOIbY",
          "name": "GitHub marskdev"
        }
      },
      "typeVersion": 1,
      "continueOnFail": true,
      "alwaysOutputData": true
    },
    {
      "id": "5e01d7b1-c09d-494f-8df1-c241db278084",
      "name": "创建新文件",
      "type": "n8n-nodes-base.github",
      "position": [
        1620,
        1160
      ],
      "webhookId": "93cca36a-a5f4-4919-b655-e0fa2cc2ca36",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.owner }}"
        },
        "filePath": "={{$('Switch').first().json.id}}.json",
        "resource": "file",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.name }}"
        },
        "fileContent": "={{$('isDiffOrNew').item.json[\"typebot_data_stringy\"]}}",
        "commitMessage": "={{$('Switch').first().json.name}} ({{$json.github_status}})",
        "authentication": "oAuth2"
      },
      "credentials": {
        "githubOAuth2Api": {
          "id": "5UZFyU8iEpfKOIbY",
          "name": "GitHub marskdev"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4b8b16d4-5363-4f08-b8b5-deac7f4250f3",
      "name": "编辑现有文件",
      "type": "n8n-nodes-base.github",
      "position": [
        1620,
        1360
      ],
      "webhookId": "286cabce-a3ec-4202-9d94-d005502d73cc",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.owner }}"
        },
        "filePath": "={{$('Switch').first().json.id}}.json",
        "resource": "file",
        "operation": "edit",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.name }}"
        },
        "fileContent": "={{$('isDiffOrNew').item.json[\"typebot_data_stringy\"]}}",
        "commitMessage": "={{$('Switch').first().json.name}} ({{$json.github_status}})",
        "authentication": "oAuth2"
      },
      "credentials": {
        "githubOAuth2Api": {
          "id": "5UZFyU8iEpfKOIbY",
          "name": "GitHub marskdev"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c2cb20ab-07e5-41a3-8f7d-ed6474977226",
      "name": "返回",
      "type": "n8n-nodes-base.set",
      "position": [
        1840,
        1560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "8d513345-6484-431f-afb7-7cf045c90f4f",
              "name": "Done",
              "type": "boolean",
              "value": true
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "7ce14355-b3b9-4cd0-a09e-6d91bfe6bfcc",
      "name": "删除文件",
      "type": "n8n-nodes-base.github",
      "position": [
        1620,
        1860
      ],
      "webhookId": "592f888e-3e41-49ce-b88a-d73f8756eac8",
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.owner }}"
        },
        "filePath": "={{$('Switch').first().json.name}}",
        "resource": "file",
        "operation": "delete",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.name }}"
        },
        "commitMessage": "={{$('Switch').first().json.name}} (deleted)",
        "authentication": "oAuth2"
      },
      "credentials": {
        "githubOAuth2Api": {
          "id": "5UZFyU8iEpfKOIbY",
          "name": "GitHub marskdev"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "c2252937-414f-446c-a2b1-96eef623f57e",
      "name": "条件判断",
      "type": "n8n-nodes-base.if",
      "position": [
        1400,
        1780
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "bb927e0c-f27b-4dce-80df-8d7611467045",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.isDeleted }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "10146994-a24f-4d9e-955d-f3e76f4abae0",
      "name": "已删除",
      "type": "n8n-nodes-base.code",
      "position": [
        1180,
        1780
      ],
      "parameters": {
        "jsCode": "const flow = $input.first().json.typebots;\n\nconst some = flow.some(x => x.id === $input.first().json.name.split(\".\")[0])\n\nreturn [{json: { isDeleted: !some }}];"
      },
      "typeVersion": 2
    },
    {
      "id": "d692e133-5184-4753-bbab-751f9903b1cb",
      "name": "是否差异或新增",
      "type": "n8n-nodes-base.code",
      "position": [
        960,
        1360
      ],
      "parameters": {
        "jsCode": "const orderJsonKeys = (jsonObj) => {\n  const ordered = {};\n  Object.keys(jsonObj).sort().forEach(key => {\n    ordered[key] = jsonObj[key];\n  });\n  return ordered;\n}\n\n// Check if file returned with content\nif (Object.keys($input.all()[0].json).includes(\"content\")) {\n  // Decode base64 content and parse JSON\n  const origFlow = JSON.parse(Buffer.from($input.all()[0].json.content, 'base64').toString());\n  const typebotFlow = $input.all()[1].json;\n  \n  // Order JSON objects\n  const orderedOriginal = orderJsonKeys(origFlow);\n  const orderedActual = orderJsonKeys(typebotFlow);\n\n  // Determine difference\n  if (JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual)) {\n    $input.all()[0].json.github_status = \"same\";\n  } else {\n    $input.all()[0].json.github_status = \"different\";\n    $input.all()[0].json.typebot_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n  $input.all()[0].json.content_decoded = orderedOriginal;\n// No file returned / new workflow\n} else if (Object.keys($input.all()[0].json).includes(\"data\")) {\n  const origFlow = JSON.parse($input.all()[0].json.data);\n  const typebotFlow = $input.all()[1].json;\n  \n  // Order JSON objects\n  const orderedOriginal = orderJsonKeys(origFlow);\n  const orderedActual = orderJsonKeys(typebotFlow);\n\n  // Determine difference\n  if (JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual)) {\n    $input.all()[0].json.github_status = \"same\";\n  } else {\n    $input.all()[0].json.github_status = \"different\";\n    $input.all()[0].json.typebot_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n  $input.all()[0].json.content_decoded = orderedOriginal;\n\n} else {\n  // Order JSON object\n  const typebotFlow = $input.all()[1].json;\n  const orderedActual = orderJsonKeys(typebotFlow);\n  \n  // Proper formatting\n  $input.all()[0].json.github_status = \"new\";\n  $input.all()[0].json.typebot_data_stringy = JSON.stringify(orderedActual, null, 2);\n}\n\n// Return items\nreturn $input.all();"
      },
      "typeVersion": 1
    },
    {
      "id": "bcafd96c-6fd4-44ce-b975-33c7cf2dff84",
      "name": "检查状态",
      "type": "n8n-nodes-base.switch",
      "position": [
        1180,
        1360
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "new",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "aea200f9-9f83-4e4e-a965-65fddcbb6a5f",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{$json.github_status}}",
                    "rightValue": "new"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "different",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "706ebf35-6f74-43b6-9f98-94cf14107947",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{$json.github_status}}",
                    "rightValue": "different"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "same",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "30c8c5a8-269f-424a-93ed-d2cbe52acf7c",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{$json.github_status}}",
                    "rightValue": "same"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "aaf2d938-ec55-4152-9e34-a2e2e6769760",
      "name": "文件不同",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1400,
        1360
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f2759b0f-3ec3-434f-acfe-36c10ebb35bb",
      "name": "文件是新的",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1400,
        1160
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "785fff83-40c4-4d38-9300-369e68779412",
      "name": "文件相同",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1400,
        1560
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "54804b0b-0001-4a41-afb5-12c0c6cf653c",
      "name": "合并",
      "type": "n8n-nodes-base.merge",
      "position": [
        740,
        1360
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "b9cb042f-d767-4c2a-86f8-5d567d23c32a",
      "name": "分支",
      "type": "n8n-nodes-base.switch",
      "position": [
        80,
        1620
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "typebot",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "8f6b31b0-a75c-4299-a530-d15b3ff65c9a",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.origin }}",
                    "rightValue": "typebot"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "github",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "09e36861-1120-4343-8d38-4797e9d67eec",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.origin }}",
                    "rightValue": "github"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "eb4adeea-418b-4d2d-a8ce-36739c195d7e",
      "name": "遍历项目",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1460,
        740
      ],
      "parameters": {
        "options": {
          "reset": "={{ $node[\"Loop Over Items\"].context[\"done\"] }}"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "58fb33e4-520e-4a58-b3ea-acdb5ef02208",
      "name": "执行工作流",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        1680,
        740
      ],
      "parameters": {
        "mode": "each",
        "options": {},
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $workflow.id }}"
        },
        "workflowInputs": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.2
    }
  ],
  "pinData": {},
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Delete a file",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "isDiffOrNew",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Get Typebot",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "isDeleted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "github": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Globals": {
      "main": [
        [
          {
            "node": "List Typebots",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "typebot": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "typebot",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "isDeleted": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List files": {
      "main": [
        [
          {
            "node": "github",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "File is new": {
      "main": [
        [
          {
            "node": "Create new file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Typebot": {
      "main": [
        [
          {
            "node": "Get file data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "isDiffOrNew": {
      "main": [
        [
          {
            "node": "Check Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Status": {
      "main": [
        [
          {
            "node": "File is new",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "File is different",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "File is same",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "File is same": {
      "main": [
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delete a file": {
      "main": [
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get file data": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List Typebots": {
      "main": [
        [
          {
            "node": "List files",
            "type": "main",
            "index": 0
          },
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create new file": {
      "main": [
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Execute Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Workflow": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Globals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "File is different": {
      "main": [
        [
          {
            "node": "Edit existing file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit existing file": {
      "main": [
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On clicking 'execute'": {
      "main": [
        [
          {
            "node": "Globals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Workflow Trigger": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

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

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

高级 - 开发运维

需要付费吗?

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

工作流信息
难度等级
高级
节点数量31
分类1
节点类型15
难度说明

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

外部链接
在 n8n.io 查看

分享此工作流