闲社服务运行正常AI智能体自动化平台
w

工作流迁移

技能标识:workflow-migrate

Migrate N8N/Zapier/Make workflows to production-grade Python or Node.js scripts. Given a workflow description or paste, rewrites automation logic with retry, backoff, logging, and self-healing. Billable migration deliverable.

作者:admin | 来源记录:ClawHub
登记来源
ClawHub
版本
V 1.0.0
检测标记
后台标记通过
免费
免费获取
1
收藏
来源与检测标记为平台登记信息,并不代表已展示可复核的检测报告。使用前请核对版本、依赖和所需权限,建议先在隔离环境中运行。
概述
安装方式
版本历史

工作流迁移

工作流迁移 — 自动化迁移工具

为什么存在

N8N/Zapier/Make 工作流会静默失效,无法进行版本控制,且每月需支付50-500美元的SaaS费用。本技能将其重写为独立脚本,可永久运行且无需任何订阅费用。每次迁移都是价值500-5000美元的可交付成果。

触发条件

使用场景:迁移此工作流、将N8N转换为Python、重写我的Zapier、将此自动化转为脚本、脱离N8N

调用方式:/workflow-migrate [工作流描述或粘贴内容]



流程

步骤1:解析工作流输入

从 $ARGUMENTS:

  • - 如果是描述(当表单提交时,发送邮件并更新Airtable):直接解析
  • 如果是N8N JSON:读取并提取节点/连接
  • 如果是Zapier步骤:解析触发器+操作链
  • 如果是Make(原Integromat)场景:解析模块

提取并记录:

触发器:

  • - Webhook(POST端点)
  • Cron/定时任务(每X分钟/小时)
  • 表单提交
  • 收到邮件
  • 文件投放(S3、Google Drive、本地文件夹)
  • 数据库行创建/更新

操作:

  • - HTTP/API调用(列出每个端点、方法、负载)
  • 数据库读写
  • 邮件发送
  • 文件操作
  • 条件逻辑(if/else分支)
  • 数组循环
  • 数据转换

数据流:

  • - 使用的输入负载字段
  • 中间计算值
  • 输出目标

如果工作流描述过于模糊,在继续之前提出2-3个针对性问题:

  • - 触发方式是什么——webhook、定时任务还是其他?
  • 它调用哪些API端点,使用什么数据?
  • 什么算成功?失败时应该怎么做?



步骤2:选择语言

默认使用Python,除非:

  • - 工作流高度异步/事件驱动(优先选择Node.js)
  • 现有代码库是Node.js
  • Kevin明确要求使用Node

Python技术栈:requests、schedule、logging、tenacity(重试)、python-dotenv
Node.js技术栈:axios、node-cron、winston、async-retry、dotenv



步骤3:编写脚本

生成完整可运行的脚本。必需元素:

Python模板结构:

python #!/usr/bin/env python3

[工作流名称] — 从[N8N/Zapier/Make]迁移
原始:[工作流功能的简要描述]
迁移日期:[日期]

用法:
python workflow_[名称].py # 运行一次
python workflow_[名称].py --schedule # 按计划运行
python workflow_[名称].py --dry-run # 测试,无副作用

import os
import sys
import logging
import time
import argparse
from datetime import datetime
from typing import Optional, Dict, Any

import requests
from tenacity import retry, stopafterattempt, waitexponential, retryifexceptiontype
from dotenv import load_dotenv

load_dotenv()

─── 日志 ───────────────────────────────────────────────────────────────────

logging.basicConfig( level=logging.INFO, format=%(asctime)s [%(levelname)s] %(message)s, handlers=[ logging.StreamHandler(sys.stdout), logging.FileHandler(flogs/workflow_{datetime.now().strftime(%Y%m)}.log), ] ) log = logging.getLogger(name)

─── 配置 ────────────────────────────────────────────────────────────────────

APIKEY = os.getenv(APIKEY) # 来自 .env WEBHOOKURL = os.getenv(WEBHOOKURL) # 目标地址 DRY_RUN = False

─── 重试装饰器 ───────────────────────────────────────────────────────────

@retry( stop=stopafterattempt(3), wait=wait_exponential(multiplier=1, min=2, max=30), retry=retryifexception_type((requests.RequestException, ConnectionError)), beforesleep=lambda rs: log.warning(f正在重试(第{rs.attemptnumber}次尝试)...), reraise=True ) def api_call(method: str, url: str, kwargs) -> Dict[str, Any]: 进行HTTP调用,自动重试并指数退避。 if DRY_RUN: log.info(f[模拟运行] {method.upper()} {url} 负载={kwargs.get(json, {})}) return {dry_run: True} resp = requests.request(method, url, timeout=30, kwargs) resp.raiseforstatus() return resp.json()

Node.js模板结构:

javascript #!/usr/bin/env node / * [工作流名称] — 从[N8N/Zapier/Make]迁移 * 原始:[简要描述] * 迁移日期:[日期] * * 用法: * node workflow_[名称].js # 运行一次 * node workflow_[名称].js --schedule # 按计划运行 * node workflow_[名称].js --dry-run # 测试,无副作用 */

require(dotenv).config();
const axios = require(axios);
const retry = require(async-retry);
const cron = require(node-cron);
const winston = require(winston);
const fs = require(fs);

// ─── 日志器 ────────────────────────────────────────────────────────────────────
const logger = winston.createLogger({
level: info,
format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
transports: [
new winston.transports.Console({ format: winston.format.simple() }),
new winston.transports.File({ filename: logs/workflow_${new Date().toISOString().slice(0,7)}.log }),
],
});

// ─── 配置 ────────────────────────────────────────────────────────────────────
const APIKEY = process.env.APIKEY;
const DRY_RUN = process.argv.includes(--dry-run);

// ─── 重试包装器 ─────────────────────────────────────────────────────────────
async function apiCall(method, url, data = {}, headers = {}) {
return retry(async (bail, attempt) => {
if (DRY_RUN) {
logger.info([模拟运行] ${method.toUpperCase()} ${url}, { data });
return { dry_run: true };
}
try {
const resp = await axios({ method, url, data, headers, timeout: 30000 });
return resp.data;
} catch (err) {
if (err.response && err.response.status < 500) bail(err); // 4xx = 不重试
logger.warn(正在重试第${attempt}次尝试..., { error: err.message });
throw err;
}
}, { retries: 3, minTimeout: 2000, maxTimeout: 30000, factor: 2 });
}

对于工作流中的每个操作,编写专用函数:

  • - 每个逻辑操作一个函数(例如 fetchleads()、sendnotification()、update_database())
  • 函数可组合且可独立测试
  • 每个函数记录其操作:开始、结果、任何错误

主编排器:
python
def run(dry_run: bool = False):
global DRY_RUN
DRYRUN = dryrun
log.info(=== 工作流开始 ===)
try:
# 步骤1:[操作名称]
data = fetchsourcedata()
log.info(f获取了{len(data)}条记录)

# 步骤2:[操作名称]
for item in data:
result = process_item(item)
if result:
sendtodestination(result)

log.info(=== 工作流成功完成 ===)
except Exception as e:
log.error(f工作流失败:{e}, exc_info=True)
send_alert(f工作流[名称]失败:{e}) # 自愈警报
raise

需包含的自愈模式:

  • - 失败时告警(如有可用,通过Kevin的机器人令牌发送Telegram消息,否则记录到文件)
  • 幂等性:跳过已处理的记录(使用状态文件或数据库标志)
  • 死信队列:失败项保存到 failed_[日期].json 供人工审查
  • 心跳:对于定时工作流,每N次运行记录仍在运行



步骤4:生成 .env.example

bash

[工作流名称] — 环境变量


复制到 .env 并填写值

API_KEY=在此填写您的API密钥
WEBHOOK_URL=https://...
DATABASE_URL=...

可选:失败时发送Telegram告警

TELEGRAMBOTTOKEN= TELEGRAM

标签

skill ai

通过对话安装

以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 workflow-migrate-1776274937 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 workflow-migrate-1776274937 技能

通过命令行安装

skillhub install workflow-migrate-1776274937

下载

⬇ 下载 workflow-migrate v1.0.0(免费)

文件大小: 5.18 KB | 发布时间: 2026-4-16 16:55

v1.0.0 最新 2026-4-16 16:55
workflow-migrate 1.0.0

- Initial release of workflow-migrate.
- Converts N8N, Zapier, or Make workflows into production-ready Python or Node.js scripts.
- Adds retry, exponential backoff, logging, and self-healing (alerts, idempotency, dead-letter queue, heartbeats) to migrated scripts.
- Guides users interactively when workflow input is vague.
- Generated scripts are runnable, testable, and billable as deliverables.
返回顶部