文章摘要
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.js、handlers/callback_query.js 等)并调用其默认导出。该函数通过 SDK 与 Bot API 和数据库交互,然后返回。这就是整个循环。没有匹配处理器的更新会被忽略,因此您只需添加需要的处理器。
快速演示
这是一个完整可用的演示机器人。它会回复每条消息,并记住从每个聊天中看到了多少条消息。
schema.js 文件定义了数据库表 counters,包含 chatId 和 seen 字段。
handlers/message.js 文件是消息处理器。它从数据库获取或创建计数器,然后递增它,最后通过 Bot API 发送一条包含当前计数的回复消息。
部署命令:
npx tgcloud push # 上传模块
npx tgcloud migrate # 创建 `counters` 表
这就是一个具有持久状态且无需服务器的在线机器人。
无服务器是 Telegram 机器人和小程序的通用后端,适用于:
- 对话式 AI 机器人:需要在数据库中存储每个用户的状态。
- 小程序后端:存储用户数据并提供动态内容。
- 游戏和工具:包括排行榜、测验等。
- 自动化和集成:调用第三方 HTTP API 并将结果推送到聊天中。
快速入门
本指南将带您从一个空文件夹开始,创建一个能回复消息并存储数据的在线机器人。前提是您已安装 Node.js 18 或更高版本,并在 @BotFather 处注册了一个机器人。
首先,在 @BotFather 中为您的机器人开启“无服务器”功能。
- 创建项目:运行
npm create @tgcloud/bot example_bot并进入项目目录。这会为您搭建一个包含处理器、库和模式文件的项目结构。 - 关联机器人:运行
npx tgcloud login,输入从 @BotFather 获取的 CLI 访问令牌。 - 查看状态:运行
npx tgcloud status查看本地与云端相比的变化。 - 部署:运行
npx tgcloud push将模块上传到云端。您的机器人现在已上线。 - 添加数据库表:编辑
schema.js添加新表,然后运行npx tgcloud push和npx tgcloud migrate来应用数据库更改。 - 存储和读取数据:在处理器中导入并使用您定义的表来读写数据。再次
push后,机器人就能记住信息了。 - 无需部署即可测试:运行
npx tgcloud run handlers/message '{ chat: { id: 1 }, text: "hello" }'可以在不部署的情况下,使用本地文件在平台上测试处理器。 - 保持同步:使用
status、push、pull、fetch和reset等命令来保持本地项目与云端同步。如果多人部署到同一个机器人,平台会检测冲突并阻止push,要求您先pull。
使用 AI 构建
每个新项目都附带 AGENTS.md 和 docs/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.js、lib/和handlers/下的所有.js文件。云端有但本地没有的内容会被移除。
数据库
每个机器人都有自己的 SQLite 数据库,通过 db 对象访问。您在 schema.js 中使用类型化的 DSL 描述表,使用流畅的查询构建器读写数据,并通过审查过的迁移来演进模式。
- 声明表:使用
table()函数,指定表名、列定义和可选的索引/约束。支持text、integer、boolean、json等列类型。 - 无外键:运行时关闭了外键约束,DSL 也禁止声明外键。您应该在应用代码中维护数据完整性。
- 查询:
db是一个异步的流畅查询构建器。支持select、insert、update、delete等操作,以及where、orderBy、limit等链式方法。也支持使用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 会被拒绝,以防止覆盖他人的工作。您需要先 fetch 或 pull 来同步。
评论总结
根据评论内容,主要观点和论据如下:
正面评价: - 提供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集成),也有对定价、限制、安全性和术语定义的质疑。