Hacker News 中文摘要

RSS订阅

Telegram 无服务器 -- Telegram Serverless

文章摘要

Telegram Serverless允许开发者直接在Telegram基础设施上运行机器人和小程序的后端代码,无需管理服务器或考虑扩展。只需编写JavaScript模块,一键部署,Telegram会在V8沙箱中快速运行,内置数据库支持。

文章总结

好的,这是根据您的要求,对原文主要内容进行的中文重述,保留了关键细节,并删减了与主题无关的冗余内容。


Telegram 无服务器平台

Telegram 无服务器平台允许您直接在 Telegram 的基础设施上运行机器人和小程序的后端代码,无需配置服务器、维护容器或考虑扩展问题。您只需编写普通的 JavaScript 模块,通过一条命令部署,Telegram 就会在一个快速、隔离的 V8 沙箱中运行它们,该沙箱紧邻 Bot API 和内置数据库。

如果您曾为了响应一个 /start 命令而不得不将机器人连接到 VPS、云函数或托管面板,那么现在您不再需要这样做了。

为什么选择无服务器?

Telegram 机器人本质上是一个响应更新的程序。传统上,您需要将程序托管在一个始终在线、可访问且安全的地方,并持续维护。Telegram 无服务器平台完全移除了这一层:

  • 无需基础设施:无需租用、修补或监控机器。您的代码按需运行,并随机器人自动扩展。
  • 开箱即用:Telegram Bot API、基于 SQLite 的数据库和出站 HTTP 请求对每个模块都立即可用,无需安装任何东西或配置凭证。
  • 快速、隔离的执行:每次调用都在一个轻量级的 V8 隔离环境中运行,靠近 Telegram 自身系统,因此对 Bot API 和数据库的调用快速可靠。
  • 真正的开发者工作流:项目在您机器上的一个文件夹中,受版本控制。您可以编辑文件,查看具体更改,原子化部署,并通过审查过的迁移来推进数据库模式——就像您处理其他项目一样。

核心概念

您的工作涉及三个地方,它们之间清晰对应:

| 位置 | 内容 | | :--- | :--- | | 您的项目文件夹 | JavaScript 模块——模式、共享代码、更新处理器 | | 云端 | 这些模块的已部署副本,以及您机器人的数据库 | | tgcloud CLI | 桥梁——显示差异并同步它们 |

您永远不需要 SSH 到任何东西。在本地编辑文件,运行 npx tgcloud push,平台就会接管后续工作。机器人的流量由已部署的模块处理;数据库在多次调用之间持久存在。

一个项目只有三种代码:

handlers/ # 入口点——每个 Telegram 更新类型一个文件 lib/ # 您可以从任何地方导入的共享代码 schema.js # 您的数据库表

当更新到达时(一条消息、一个按钮点击、一个内联查询),Telegram 会将其路由到匹配的处理器(handlers/message.jshandlers/callback_query.js 等)并调用其默认导出。该函数通过 SDK 与 Bot API 和数据库交互,然后返回。这就是整个循环。没有匹配处理器的更新会被忽略,因此您只需添加需要的处理器。

快速演示

这是一个完整可用的演示机器人。它会回复每条消息,并记住从每个聊天中看到了多少条消息。

schema.js 文件定义了数据库表 counters,包含 chatIdseen 字段。

handlers/message.js 文件是消息处理器。它从数据库获取或创建计数器,然后递增它,最后通过 Bot API 发送一条包含当前计数的回复消息。

部署命令: npx tgcloud push # 上传模块 npx tgcloud migrate # 创建 `counters` 表

这就是一个具有持久状态且无需服务器的在线机器人。

无服务器是 Telegram 机器人和小程序的通用后端,适用于:

  • 对话式 AI 机器人:需要在数据库中存储每个用户的状态。
  • 小程序后端:存储用户数据并提供动态内容。
  • 游戏和工具:包括排行榜、测验等。
  • 自动化和集成:调用第三方 HTTP API 并将结果推送到聊天中。

快速入门

本指南将带您从一个空文件夹开始,创建一个能回复消息并存储数据的在线机器人。前提是您已安装 Node.js 18 或更高版本,并在 @BotFather 处注册了一个机器人。

首先,在 @BotFather 中为您的机器人开启“无服务器”功能。

  1. 创建项目:运行 npm create @tgcloud/bot example_bot 并进入项目目录。这会为您搭建一个包含处理器、库和模式文件的项目结构。
  2. 关联机器人:运行 npx tgcloud login,输入从 @BotFather 获取的 CLI 访问令牌。
  3. 查看状态:运行 npx tgcloud status 查看本地与云端相比的变化。
  4. 部署:运行 npx tgcloud push 将模块上传到云端。您的机器人现在已上线。
  5. 添加数据库表:编辑 schema.js 添加新表,然后运行 npx tgcloud pushnpx tgcloud migrate 来应用数据库更改。
  6. 存储和读取数据:在处理器中导入并使用您定义的表来读写数据。再次 push 后,机器人就能记住信息了。
  7. 无需部署即可测试:运行 npx tgcloud run handlers/message '{ chat: { id: 1 }, text: "hello" }' 可以在不部署的情况下,使用本地文件在平台上测试处理器。
  8. 保持同步:使用 statuspushpullfetchreset 等命令来保持本地项目与云端同步。如果多人部署到同一个机器人,平台会检测冲突并阻止 push,要求您先 pull

使用 AI 构建

每个新项目都附带 AGENTS.mddocs/tgcloud-sdk.md 文件,AI 编码工具可以自动读取这些文件,从而快速了解项目约定。您可以像这样使用 AI 助手来构建机器人。

通过 BotFather 移动端操作

整个项目也可以在 @BotFather 中管理。您可以创建、编辑和测试处理器,管理库模块,编辑数据库模式并应用更改,以及获取 CLI 访问令牌。在手机上开始的工作,可以稍后在电脑上通过 npx tgcloud pull 拉取。

项目和模块

一个无服务器项目是一个普通的、受版本控制的文件夹。它只包含 JavaScript 模块和一些本地状态,没有构建步骤,运行时没有 node_modules,也没有服务器入口点。

  • 项目结构handlers/(更新处理器,扁平结构)、lib/(共享代码,允许子目录)、schema.js(数据库模式)、.tgcloud/(CLI 状态,被 git 忽略)。
  • 模块系统:运行时,模块只能看到平台 SDK 和项目中的其他模块。没有 npm 包,没有文件系统,除了通过 SDK 的 fetch 外没有网络。导入模块必须使用其名称(从项目根目录开始的路径,不带 .js 扩展名),不能使用相对路径或文件扩展名。
  • 处理器handlers/ 下的模块,其默认导出函数会在匹配的更新到达时被平台调用。处理器接收更新负载作为第一个参数,一个包含原始 Update 对象的上下文对象 ctx 作为第二个参数。
  • 部署内容npx tgcloud push 会部署 schema.jslib/handlers/ 下的所有 .js 文件。云端有但本地没有的内容会被移除。

数据库

每个机器人都有自己的 SQLite 数据库,通过 db 对象访问。您在 schema.js 中使用类型化的 DSL 描述表,使用流畅的查询构建器读写数据,并通过审查过的迁移来演进模式。

  • 声明表:使用 table() 函数,指定表名、列定义和可选的索引/约束。支持 textintegerbooleanjson 等列类型。
  • 无外键:运行时关闭了外键约束,DSL 也禁止声明外键。您应该在应用代码中维护数据完整性。
  • 查询db 是一个异步的流畅查询构建器。支持 selectinsertupdatedelete 等操作,以及 whereorderBylimit 等链式方法。也支持使用 sql 标签进行原始 SQL 查询。
  • 迁移npx tgcloud push 只部署代码,不会更改数据库。npx tgcloud migrate 会计算模式差异并引导您应用更改。更改按风险分类:安全(新增)可批量确认,警告(删除等破坏性操作)需逐个确认,手动(如更改列类型)需您手动执行 SQL。删除表或列需先标记为 deprecated

SDK

运行时,模块可以导入 sdk,它包含了数据库 (db)、Telegram Bot API (api) 和出站 HTTP (fetch)。

  • Bot API (api):调用 api.<方法名>(参数) 即可使用所有 Bot API 方法。响应结果会被解包,失败时会抛出 BotApiError 异常。目前不支持从处理器上传或下载文件。
  • HTTP (fetch):一个类似标准 fetch 的客户端,用于调用外部 API。支持 JSON、表单和文本请求体。响应内容限制为文本,总响应大小上限为 32 MB。
  • 日志 (console):标准的 console 全局对象可用,其输出会被 npx tgcloud run 捕获,是开发时的主要调试工具。

命令行界面 (CLI)

tgcloud CLI 是连接项目文件夹和云端的桥梁。主要命令包括:

  • init:在当前目录搭建新项目。
  • add:搭建新的处理器或库模块。
  • login:将项目与机器人关联。
  • status / diff:查看本地与云端的差异。
  • push:部署更改。
  • migrate:应用数据库模式更改。
  • run:在平台上执行模块(不部署)。
  • fetch / pull / reset:从云端同步或重置本地状态。
  • webhook:查看和同步平台管理的 webhook。
  • completion:生成 shell 自动补全脚本。

认证:项目通过令牌与机器人绑定。令牌按 TGCLOUD_TOKEN 环境变量、.tgcloud/credentials 文件的顺序解析。CLI 不会在命令执行中途提示输入令牌。

保持同步:每个项目在云端都有一个单调递增的修订版本。如果云端版本比本地高(例如其他人部署了),push 会被拒绝,以防止覆盖他人的工作。您需要先 fetchpull 来同步。

评论总结

根据评论内容,主要观点和论据如下:

正面评价: - 提供SQLite数据库是亮点(评论2:"Providing a SQLite db out of the box is a nice touch") - 对Telegram Bot生态的补充(评论8:"BotFather is quite a linchpin in the AI ecosystem") - 概念有趣,但需完善(评论12:"Clever idea! Although... I see a need for secrets storage"

质疑与批评: - 对AI生成文档的信任问题(评论9:"Why should I trust it to work correctly... when having an AI vibe-code it?") - 缺乏定价信息(评论5:"I don't see anything about pricing") - 对"serverless"术语的讽刺(评论14:"serverless on HN has to mean 'run code on someone else's servers'") - 对Telegram Bot泛滥的担忧(评论6:"telegram is full of bots and spam"

技术疑问: - 存储和执行时间限制(评论3:"What are the quotas like execution time, storage etc?") - SQLite数据库的分布式处理(评论7:"how does it handle an SQLite DB? Is that also replicated?") - 互联网访问和带宽限制(评论10:"can access the internet? If so: bandwidth limits?"

其他观点: - 对JavaScript生态的无奈(评论11:"We're never getting away from Javascript, are we") - 希望Signal有类似API(评论4:"I wish Signal had a bot API like telegram's") - 对Matrix的期待(评论13:"we should be using Matrix but it doesn't have half of the features"

总体来看,评论者对Telegram的serverless Bot功能既有兴趣(尤其是SQLite集成),也有对定价、限制、安全性和术语定义的质疑。