从 Pipedream 迁出
更新于 2026年10月20日
Pipedream Workflows 将于 2027年3月31日关停,所有 …m.pipedream.net URL 也会随之失效。如果你的工作流由 Webhook、定时任务或邮件触发,AnyHook 会给每个工作流一个可以一直保留的 URL,并运行你的 Node.js 代码步骤,其中大部分不用改。你只需在每个平台上改一次 URL,每个工作流都会变成一个普通的 JavaScript 文件:你能读懂它,放进 git,也能随时带走。
Pipedream 要关停什么
- Workflows 和 String 将于 2027年3月31日停止运行。Pipedream 已不再接受新注册和新订阅。
- 所有 Workflows 数据会在 2027年4月30日前删除,包括已连接账号的凭据和 OAuth 令牌。
- Pipedream Connect(包括它的 API、MCP 服务器和 API 代理)会继续运营。
- 导出工具会把工作流的结构下载为 JSON,一次导出一个项目。
- requestbin.com 现在会重定向到 Pipedream 的首页。
出处:Pipedream 的公告。
可以迁到 AnyHook 的部分
在 Pipedream
在 AnyHook
- HTTP 触发器
- App 的 URL,in.anyhook.net/you/app。它约 1 秒应答发送方,保存每个事件;在 Pro 套餐上,投递失败后会分别在 5分钟、30分钟、3小时和18小时后重试(共 5 次尝试);Free 套餐在 3 次尝试后停止,Scale 套餐会继续每天重试,直到第 10 次。重命名 App 不会改变这个 URL。
- Node.js 代码步骤
- App 的代码,每个事件都会在沙箱里运行它。defineComponent、$.export 和 $.flow.exit 可以原样使用,steps.trigger.event 带有请求的 body 和 headers。代码导入的 npm 包会在你保存时安装,包括 "axios@1.7.9" 这样的固定版本。
- 预置动作
- 代码编辑器里的模板:Slack message, Discord message, Telegram message, Email through Resend, Google Sheets row, Airtable record, Notion page, Ask Claude, Any HTTP API。每个模板只有几行,你能读懂,也能修改。调用失败时它会抛出异常,于是 AnyHook 会重试这个事件;邮件模板会把每次发送绑定到对应的事件,所以同一天内的重试不会把邮件发两次。
- 定时触发器
- 同一份代码上的 cron 定时任务,可用 UTC 或任意时区;它放在一个单独的 App 上,来源设为 generic 或 auto,且不设签名密钥。每次触发都会以一个 anyhook.schedule 事件到达,既算一次运行,也算一个事件,并且只在代码开启时才会触发。
- 邮件触发器
- 每个 App 都有一个邮箱地址:you.app@anyhook.net。邮件会以 email.received 事件到达,带有发件人、主题和原始 MIME 邮件,由你的代码解析。App 的来源必须是 generic 或 auto,且不设签名密钥;超过套餐请求体上限(Free 512 KB,Pro 2 MB,Scale 4 MB)的邮件(附件也算在内)会被退回。
- 环境变量和 props
- 密钥,用 env.NAME 读取,在步骤里也可以用 process.env.NAME。步骤的 props 不用改就能读到它们:this.channelId 就是密钥 CHANNEL_ID。
- 已连接的账号
- this.slack.$auth.oauth_access_token 读取的是密钥 SLACK_OAUTH_ACCESS_TOKEN:添加这个令牌,步骤就能原样运行。没有任何机制会刷新它,$auth 也从不读取存储,所以会过期的令牌(Google 的令牌只有一小时有效期)需要你写代码:用保存为密钥的刷新令牌获取新令牌,并把最新的那个存进存储。
- 数据存储
- App 的存储。步骤里的每个 data_store prop 都是这同一个存储,支持 get、set(可带以秒为单位的 TTL)、has、delete、keys、entries 和 clear;普通代码通过 store 使用它。它最多存 1,000 个键,每个值转成 JSON 后最多 64,000 字节;原来由多个工作流共享的 Pipedream 存储,会在每个 App 里各变成一个独立的存储。Pipedream 的导出不包含数据存储,所以导入要你自己做:向 /api/v1/apps/{slug}/store 发一个 POST,请求体为 {"entries": {key: value}},它会写入这些键,但不带 TTL。
- 事件历史和重放
- 事件日志:每个事件及其每次投递尝试、作为响应的代码日志,以及一个重放按钮;Free 套餐保留 3 天,Pro 套餐保留 30 天。之后 Pro 套餐还会以只读方式继续保存收到的内容 1 年。
无法迁移的部分
AnyHook 在事件到来时运行你的代码。它不是工作流编排工具,所以下面这些需要重写,或者另找去处:
- Python、Go 和 Bash 步骤。暂不支持。
- require()。代码是 ES 模块,所以用 require 加载包的步骤要改成 import。
- 请求体和请求头以外的触发器字段。AnyHook 不保留查询字符串、路径和调用方 IP,请求方法始终是 POST,定时任务和邮件则以 AnyHook 自己的请求体到达。所以读取 steps.trigger.event.query、path、url 或 client_ip 的步骤,以及读取定时或邮件触发器字段的步骤,都需要改掉这几行。
- $.send、$.flow.delay、$.flow.rerun、$.flow.suspend 和 $.context。$ 上,步骤只有 $.export 和 $.flow.exit 可用。
- 数据存储的 setTtl 和 for await 循环。用 set 设置 TTL,用 keys 或 entries 读取全部内容。
- 用 GET 或 POST 以外的任何方法调用的 HTTP 触发器:这个 URL 会拒收这类请求,Meta 的验证 GET 请求除外。
- $.respond()。AnyHook 自己应答发送方,所以必须自己返回 HTTP 响应的工作流(比如 Slack 斜杠命令)需要一台能及时应答的服务器。Meta 的验证握手由 AnyHook 替你应答。
- 轮询某个应用的触发器,比如 Google Sheet 里新增了一行。
这些情况可以交给 n8n、Make 或 Zapier,它们有现成的集成。AnyHook 的 URL 仍然可以放在它们的 Webhook URL 前面,这样下次再迁移,也只是改一下转发目标。
迁移步骤:一次迁一个工作流
- 创建一个 App,把你的 Pipedream 端点添加为它的转发目标。这时什么都没变:Pipedream 仍在运行工作流,AnyHook 在途中保存每个事件。从第 2 步起有一处不同:AnyHook 转发每个请求时,只以 POST 发送它的请求头和请求体,不带查询字符串、App 之后的路径和调用方 IP,所以读取这些信息的工作流会读不到。
- 到每个平台上,把 Pipedream 的 URL 换成 App 的 URL。这是你最后一次在那里修改它。
- 把工作流放进 App 的 Code,并添加它需要的密钥。代码步骤粘贴进来后按上面列出的几处修改即可,预置动作从模板开始写,多个步骤按顺序合并成一个函数,这部分最值得交给智能体去做。编辑器保存的新代码默认处于关闭状态;通过 API 或 MCP 保存时要传 "enabled": false,因为不带它的首次保存会直接上线。用最近一个已保存的事件运行它,然后查看日志。测试运行会真的执行代码所做的一切,所以如果代码会往某处写数据,先把它指向测试频道或测试表。
- 删除 Pipedream 这个转发目标,再开启代码。每次改动最多需要一分钟才能同步到所有边缘节点,所以这段时间内的事件仍可能发往 Pipedream,或者被记录下来但没有转发目标;代码开启后,重放这些已记录的事件,代码就会处理它们。
- 重复以上步骤,在 2027年3月31日之前完成。以后再迁到 n8n 或你自己的服务器,只需改转发目标;各平台上的 URL 保持不变。
借助智能体
Pipedream 的导出(项目的 Settings,然后 Export Workflows)是一个 ZIP 包,里面有每个工作流的触发器、代码步骤的代码,以及预置动作的设置。凭据和环境变量不在其中,密钥类 prop 的值显示为 <redacted>;这些都要变成由你添加的密钥。这些信息足够让智能体完成重写。把 Claude Code、Codex 或其他智能体连接到 AnyHook 的 MCP 服务器 https://anyhook.net/mcp,把导出包解压到它能读取的位置,然后粘贴这段话:
把我的 Pipedream 工作流迁移到 AnyHook。解压后的导出文件在 ./pipedream-export。 对每个由 HTTP、定时或邮件触发的工作流: 1. 使用已经把这个工作流的 URL 转发到 Pipedream 的那个 AnyHook App;只有在没有的情况下才新建一个,定时或邮件触发的工作流把来源设为 generic。定时触发器的 cron 保留为代码的定时任务。 2. 按顺序把它的步骤写成一个代码处理程序。代码步骤可以原样运行,https://anyhook.net/zh-cn/migrate/pipedream 中“无法迁移的部分”下列出的内容除外。把每个预置动作改写成对相应服务 API 的调用,从 https://anyhook.net/code-templates.md 开始写,调用失败时抛出异常。 3. 以 enabled: false 部署,不填任何密钥的值。列出它需要的密钥,以及每个密钥从哪里获取。 4. 用一个示例事件测试它,把结果给我看。 不要改动 Pipedream 上的任何东西。我会自己添加密钥、删除 Pipedream 转发目标,然后开启代码。
它会调用 anyhook_apps_create、anyhook_code_deploy 和 anyhook_code_test,每个动作都从和编辑器相同的模板 code-templates.md 开始写。它部署的每个处理程序都处于关闭状态;由你添加密钥、删除 Pipedream 转发目标,再开启代码。如果保存时要安装新的包,可能需要几分钟。用 API 密钥运行 npm 包的智能体(Cursor、Windsurf 和 Claude Desktop 都是这样)需要 anyhook-mcp 0.4.0 或更高版本才有这些工具,npx -y 会获取这个版本。连接智能体。
费用
- Free,$0:1 个 App,每月 10,000 个事件,不能运行代码。足够在 Pipedream 或 n8n 前面挂一个 URL。
- Pro,$20/月:10 个 App,50,000 个事件,3,000 次代码运行,每次最长 105 秒。
- Scale,$90/月:50 个 App,250,000 个事件,12,000 次代码运行,每次最长 285 秒。
一个 App 就是一个 URL 加上它的代码,所以 Pro 套餐的 App 数量能装下 10 个使用 HTTP 触发器的工作流。运行次数是另一项限额:一次重试、一次测试运行、一次重放和一次定时触发都各算一次;每 15 分钟触发一次的定时任务,每月大约触发 2,880 次。运行次数没有超额:当月次数用完后,投递给代码的请求会被拒绝并暂存,不重试;等到下个月或套餐升级后,你可以重放它。处理程序的其他限制见文档。价格。
常见问题
- Pipedream Workflows 什么时候关停?
- 2027年3月31日。Pipedream 会在 2027年4月30日前删除所有 Workflows 数据,包括已连接账号的凭据和 OAuth 令牌。Pipedream Connect 不受影响。
- 我的 *.m.pipedream.net Webhook URL 还能继续用吗?
- 能用到 2027年3月31日。现在就把每个平台指向一个 AnyHook URL,在代码迁完之前先把它转发到你的 Pipedream 端点,之后平台就再也不用换 URL 了。
- 我的 Node.js 代码步骤能在 AnyHook 上运行吗?
- 在 Pro 和 Scale 套餐上,大部分可以原样运行:defineComponent、$.export、$.flow.exit、props 和数据存储都能用,步骤导入的 npm 包会在你保存时安装,已连接账号的 $auth 会读取你添加的密钥。steps.trigger.event 带有请求的请求体和请求头,所以读取查询字符串、path、url 或 client_ip 的步骤,以及读取定时或邮件触发器字段的步骤,需要改掉这几行。Python、Go 和 Bash 步骤,以及 require()、$.respond、$.send、$.flow.delay 和 $.flow.rerun,都需要重写。
- “Slack: send a message”这类预置动作怎么办?
- 它们会变成几行你能读懂、也能修改的代码。代码编辑器为这些动作提供了模板:Slack message, Discord message, Telegram message, Email through Resend, Google Sheets row, Airtable record, Notion page, Ask Claude, Any HTTP API。其余的可以交给智能体,根据你的 Pipedream 导出来改写,导出里列出了每个动作及其设置。
- 我的代码会被 AnyHook 绑定吗?
- 不会。处理程序就是一个 JavaScript 函数,接收事件和你的密钥。你可以从编辑器复制它,或者通过 API 读取它,放进 git;如果你离开 AnyHook,就在自己的服务器上调用它。
- 我可以改为把工作流迁到 n8n、Make 或 Zapier 吗?
- 可以。在它们的 Webhook URL 前面放一个 AnyHook URL:你会留下每个事件及其重试的日志,以后再迁移时只需改转发目标,不用在每个平台上换新 URL。AnyHook 转发每个请求时只以 POST 发送请求头和请求体,所以那边读取查询字符串的工作流会读不到它。