Automatisch 集成 Telegram BotNew Message Webhook 触发器的实现原理与配置指南【免费下载链接】automatischThe open source Zapier alternative. Build workflow automation without spending time and money.项目地址: https://gitcode.com/GitHub_Trending/au/automatisch本指南以 Telegram Bot 触发器文档 为骨架深入解析 Automatisch 中 Telegram Bot 应用提供的New message触发器它如何在消息到达机器人时被触发、如何通过setWebhook注册回调、如何配置允许接收的更新类型以及如何将触发数据流转到后续动作。读完本文你将能独立完成 Telegram Bot 的连接配置、触发器创建、更新类型筛选与消息内容解析并理解其底层 Webhook 工作机制。一、触发器总览New message在 Automatisch 的文档体系中每个应用都通过triggers.md页面以列表形式声明其可用触发器。Telegram Bot 的 triggers.md 声明了当前应用唯一的一个触发器触发器名称触发时机New message当有新消息发送给机器人时触发Triggers when a new message is sent to the bot从源码结构看该触发器的注册入口在 triggers/index.js它导出一个触发器数组其中包含new-message这一唯一成员同时 index.js 中通过defineApp({ key: telegram-bot, triggers, actions, ... })将触发器挂载到 Telegram 应用上供流程编辑器按telegram-bot 触发器 key 检索使用。二、前置条件通过 BotFather 创建机器人并建立连接在使用 New message 触发器之前需要先在 Automatisch 中建立一个 Telegram 连接。官方连接文档 connection.md 给出了完整的接入步骤核心流程如下在 Telegram 中与 BotFather 开始对话发送/newbot指令输入你的机器人的显示名称name输入机器人的用户名username从 BotFather 返回的结果中复制token值填入 Automatisch 的Bot token字段点击 Automatisch 上的Submit按钮提交连接建立成功即可在流程中开始使用该 Telegram 连接。从实现细节看token 会被存储为连接的认证数据$.auth.data.token并在每次 HTTP 请求前由 add-auth-header.js 注入const addAuthHeader ($, requestConfig) { if ($.auth.data?.token) { const token $.auth.data.token; requestConfig.baseURL new URL( /bot${token}, requestConfig.baseURL ).toString(); } return requestConfig; };也就是说应用的apiBaseUrlhttps://api.telegram.org见 index.js会被自动拼接为https://api.telegram.org/bot你的token形式这正是 Telegram Bot API 的标准鉴权路径格式。这一步无需用户手动处理属于 Automatisch 对 Bot API 鉴权约定的内置封装。三、New message 触发器核心定义New message 触发器的完整定义位于 new-message/index.js其元数据如下字段值说明nameNew message在流程编辑器中展示的名称keynewMessage程序内部使用的唯一标识typewebhook触发器类型为 Webhook由 Telegram 服务端主动回调descriptionTriggers when a new message is sent to the bot.触发语义说明关键点在于type: webhook这意味着该触发器不是轮询式polling触发而是依赖 Automatisch 注册到 Telegram 的 Webhook 地址由 Telegram 在事件发生时实时推送更新。这是理解本触发器整个生命周期的主线。3.1 允许接收的更新类型Allowed Update Types触发器接受一个可选的allowedUpdates下拉参数源码见 new-message/index.js用于筛选你希望接收的 Telegram Update 类型。参数描述明确指出留空则接收除chat_member、message_reaction、message_reaction_count之外的所有更新类型。该下拉菜单共提供 22 个选项完整映射如下界面标签Label提交值ValueMessagemessageEdited Messageedited_messageChannel Postchannel_postEdited Channel Postedited_channel_postBusiness Connectionbusiness_connectionBusiness Messagebusiness_messageEdited Business Messageedited_business_messageDeleted Business Messagesdeleted_business_messagesMessage Reactionmessage_reactionMessage Reaction Countmessage_reaction_countInline Queryinline_queryChosen Inline Resultchosen_inline_resultCallback Querycallback_queryShipping Queryshipping_queryPre-checkout Querypre_checkout_queryPurchased Paid Mediapurchased_paid_mediaPollpollPoll Answerpoll_answerMy Chat Membermy_chat_memberChat Memberchat_memberChat Join Requestchat_join_requestChat Boostchat_boostRemoved Chat Boostremoved_chat_boost该参数类型为dropdown、required: false、variables: false意味着它是一个固定的枚举选择不支持在参数中使用流程变量动态取值但你可以根据业务需要只勾选感兴趣的事件类型从而减少无关回调对流程的触发。四、Webhook 注册与注销触发器的底层生命周期触发器通过registerHook与unregisterHook两个钩子管理 Webhook 的生命周期源码见 new-message/index.js。4.1 注册调用 setWebhookasync registerHook($) { const webhookPayload { url: $.webhookUrl, secret_token: appConfig.webhookSecretKey, allowed_updates: $.step.parameters.allowedUpdates ? [$.step.parameters.allowedUpdates] : [], }; await $.http.post(/setWebhook, webhookPayload); }注册阶段做三件事回传回调地址将 Automatisch 为该流程步骤生成的$.webhookUrl作为url参数提交给 Telegram 的/setWebhook接口告诉 Telegram 之后把更新推送到哪里设置 secret_token携带appConfig.webhookSecretKey来自后端 config/app.js 的 Webhook 密钥配置作为安全令牌用于回调时的验签下发更新过滤规则把用户选择的allowedUpdates以数组形式传给 Telegram。注意源码中的实现是[$.step.parameters.allowedUpdates]即把单个下拉值包装为单元素数组这对应的是 Bot API 中allowed_updates的数组语义。4.2 注销调用 deleteWebhookasync unregisterHook($) { await $.http.post(/deleteWebhook); }当流程被删除、停用或该步骤被移除时Automatisch 会调用/deleteWebhook清除 Telegram 侧的回调注册避免遗留僵尸 Webhook 继续向已不存在的地址推送数据。五、收到更新后的数据流转run 与 internalId当 Telegram 向 Webhook 地址推送一条更新时触发器的run函数被调用源码见 new-message/index.jsasync run($) { const dataItem { raw: $.request.body, meta: { internalId: $.request.body.update_id?.toString() || Crypto.randomUUID(), }, }; $.pushTriggerItem(dataItem); }这里有两个值得注意的实现细节raw 数据Telegram 推送的整个更新对象JSON被原样保存在raw字段中后续流程步骤可以直接通过$.step.parameters之外的方式引用其中的字段例如message.text、message.chat.id等internalId 去重机制update_id是 Telegram 为每次更新分配的自增标识源码将其字符串化后作为internalIdAutomatisch 用它做去重判断避免同一条更新被重复执行当请求体中缺少update_id时则回退为Crypto.randomUUID()生成的随机 ID见 import 的Crypto模块。这种设计保证了每收到一条新消息只执行一次流程的语义是 Webhook 类触发器可靠性的关键。六、测试运行testRun 与示例数据在流程编辑器中点击测试该触发器时执行的是testRun函数源码见 new-message/index.js。其逻辑分为两步优先复用上一次真实执行的结果通过$.getLastExecutionStep()获取最近一次执行步骤的输出dataOut如果存在则直接将其作为触发数据重新推入保证测试数据与真实数据形态一致首次测试时提供示例数据如果没有任何历史执行记录则推送一段内置的sampleData模拟真实更新其结构如下节选{ update_id: 123456789, message: { message_id: 42, from: { id: 987654321, is_bot: false, first_name: John, last_name: Doe, username: johndoe, language_code: en }, chat: { id: 987654321, first_name: John, last_name: Doe, username: johndoe, type: private }, date: 1720000000, text: Hello, bot! } }这份示例数据完整覆盖了update_id、发送者from、会话chat、时间戳date与消息正文text等核心字段开发者可以据此直接在流程后续步骤中绑定字段例如将message.text作为下游动作的输入。七、触发器与动作联动一个完整的消息回执场景New message 触发器通常与 Telegram 的Send message动作搭配使用构成收到消息 → 自动回复的闭环。Send message 动作定义在 send-message/index.js需要以下参数参数是否必填说明Chat ID是目标会话的唯一标识或目标频道的用户名channelusername格式Message text是要发送的文本1–4096 字符Disable notification否是否静默发送有通知但无提示音默认falseParse Mode否文本格式None、Markdown、MarkdownV2、HTML实现上动作会构造{ chat_id, text, disable_notification }载荷并仅在设置了parseMode时附加parse_mode字段然后请求POST /sendMessage把 Telegram 的响应存为动作输出const response await $.http.post(/sendMessage, payload); $.setActionItem({ raw: response.data });因此一个典型的自动应答流程可以这样设计触发器Telegram Bot → New message可选勾选message更新类型避免收到edited_message等干扰动作Telegram Bot → Send message其中Chat ID绑定触发器输出中的message.chat.idMessage text绑定message.text或拼接自定义回复文案。由于触发器、动作共用同一个telegram-bot应用index.js连接鉴权由add-auth-header中间件统一处理用户只需在流程中复用同一个 Telegram 连接即可。八、小结与排查建议围绕New message触发器可以总结出以下要点它是 Automatisch 中 Telegram Bot 应用唯一的触发器类型为webhook基于 Telegram Bot API 的setWebhook/deleteWebhook机制实现实时推送通过Allowed Update Types参数可在 22 种 Telegram 更新类型中筛选留空时默认排除chat_member、message_reaction、message_reaction_count三类每条更新以update_id作为internalId实现幂等去重缺失时回退为随机 UUID首次测试时使用内置示例数据之后优先复用上一次真实执行的输出。如果在实际使用中遇到触发器没有触发的问题可以按以下顺序排查确认连接是否成功建立Bot token 是否有效参见 connection.md 的 BotFather 步骤确认Allowed Update Types是否误选、导致实际发生的事件类型被过滤例如只选message却期望捕获channel_post确认 Webhook 是否成功注册——若流程创建后 Telegram 侧仍返回 404可检查后端的appConfig.webhookSecretKey与回调地址配置检查该流程步骤是否处于启用状态以及执行历史中是否因internalId去重而跳过了重复更新。【免费下载链接】automatischThe open source Zapier alternative. Build workflow automation without spending time and money.项目地址: https://gitcode.com/GitHub_Trending/au/automatisch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考