你在Telegram聊天窗口中看到过那些可以直接打开、无需跳转浏览器的互动小程序吗?这些内嵌式应用就是基于Telegram Web App API开发的。许多开发者希望利用这个API为自己的Bot添加丰富的交互界面,但初次接触时往往不知道从何处入手,不清楚如何配置环境、如何与Telegram交换数据,以及如何调试和发布。本文将手把手带你完成从环境准备到功能验证的完整流程。
检查开发环境与前置条件
在开始编写任何代码之前,需要确认你的机器上已经安装了必要的工具,并且拥有一个可用的Telegram Bot Token。
具体操作说明:
首先,打开你的电脑终端(Windows用户请打开命令提示符或PowerShell,Mac/Linux用户打开终端)。输入 node -v并回车,如果看到类似 v18.12.0的版本号,说明Node.js已安装。接着输入 npm -v确认npm包管理器可用。如果未安装,请前往Node.js官网下载并安装LTS版本。然后,在Telegram中搜索 @BotFather,发送 /newbot按照提示创建一个新的机器人,记下返回的 Bot Token(形如 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11)。
注意事项/小提示:
- 确保Node.js版本不低于16,部分Web App API特性依赖较新版本的JavaScript引擎。
- Bot Token是敏感信息,不要上传到公开的代码仓库中。
- 创建Bot后,建议立即在BotFather中发送
/setdomain命令,为你的Web App设置允许的域名(开发阶段可先设为你的本地IP或localhost)。
备用方案:
- 如果无法安装Node.js,可以使用Python的Flask或Django替代,但本教程以Node.js为例。
- 若没有公网服务器,可使用 ngrok或 localtunnel将本地服务暴露到公网,用于Telegram回调验证。
初始化项目并安装依赖
创建一个新的项目文件夹,初始化npm并安装必要的库,这是搭建Web App后端与前端通信的基础。
具体操作说明:
在你的工作目录中,打开终端执行 mkdir telegram-webapp-demo && cd telegram-webapp-demo。接着运行 npm init -y快速生成 package.json文件。然后执行 npm install express node-telegram-bot-api,其中 express用于搭建HTTP服务器,node-telegram-bot-api是官方推荐的Node.js Telegram Bot库。安装完成后,在项目根目录创建两个文件夹:public(存放前端静态文件)和 server(存放后端代码)。
注意事项/小提示:
- 如果安装速度慢,可以设置npm镜像源:
npm config set registry https://registry.npmmirror.com。 - 建议同时安装
dotenv库,用于管理环境变量:npm install dotenv,并在项目根目录创建.env文件存放Bot Token。 - 不要忘记在
.gitignore文件中添加node_modules和.env文件。
备用方案:
- 如果你更熟悉Python,可以安装
python-telegram-bot库配合Flask实现相同功能。 - 对于纯前端演示,也可以使用GitHub Pages或Vercel部署静态页面,但后端通信需要额外处理。
编写后端服务器代码
后端负责接收Telegram的Webhook请求,并返回Web App的启动链接,同时处理来自前端的用户数据。
具体操作说明:
在 server文件夹下新建 index.js文件,写入以下核心代码:首先引入 express、node-telegram-bot-api和 dotenv。使用 dotenv.config()加载环境变量。创建一个 express实例,并设置静态文件目录为 public。接着初始化Telegram Bot:const bot = new TelegramBot(process.env.BOT_TOKEN, {polling: true})。监听 /start命令,当用户发送 /start时,使用 bot.sendMessage方法发送一条包含 Inline Keyboard的消息,键盘按钮的 web_app属性指向你的Web App URL(例如 https://yourdomain.com/app)。最后,启动express服务器监听3000端口。
注意事项/小提示:
- 如果使用ngrok,你的Web App URL应为
https://xxxx.ngrok.io/app,并且需要在BotFather中将该域名设置为允许的域名。 - 务必在
bot.on('message')回调中处理用户点击按钮后返回的数据,通过ctx.webAppData获取。 - 生产环境中建议使用Webhook模式代替polling,以避免频繁轮询消耗资源。
备用方案:
- 如果不想自己搭建服务器,可以使用Cloudflare Workers或AWS Lambda实现无服务器架构。
- 对于简单的测试,可以直接使用
bot.onText(/\/start/)配合bot.sendWebApp方法(该方法在部分库中已支持)。
编写前端Web App页面
前端页面是用户实际交互的界面,需要引入Telegram Web App SDK并完成初始化。
具体操作说明:
在 public文件夹下创建 app.html文件。在 标签内引入Telegram Web App SDK:。在 中创建一个简单的表单或按钮。在 标签中编写初始化代码:首先检查 window.Telegram.WebApp是否存在,然后调用 Telegram.WebApp.ready()通知Telegram页面已加载完毕。接着,你可以读取 Telegram.WebApp.initDataUnsafe对象获取用户信息(如 user.id、user.first_name)。当用户完成操作(例如点击提交按钮)时,调用 Telegram.WebApp.sendData(JSON.stringify({key: 'value'}))将数据发送回Bot。
注意事项/小提示:
- 必须在页面加载完成后调用
Telegram.WebApp.ready(),否则Telegram可能无法正确识别Web App状态。 initDataUnsafe中的数据未经服务器端验证,敏感操作必须在后端通过initData进行HMAC签名验证。- 界面设计建议遵循Telegram的 Human Interface Guidelines,使用系统字体和适配深色模式。
备用方案:
- 如果使用React或Vue框架,可以在组件挂载后调用
Telegram.WebApp.ready()。 - 对于需要复杂UI的场景,可以引入UI组件库如 Ant Design Mobile或 Vant,但注意保持轻量。
验证Web App功能与数据交互
完成前后端代码后,需要实际在Telegram中测试整个流程是否正常。
具体操作说明:
首先,在终端中运行 node server/index.js启动服务器。确保你的服务器(或ngrok隧道)处于运行状态。打开Telegram,找到你的Bot,发送 /start命令。你应该会收到一条带有 Launch Web App按钮的消息。点击该按钮,Telegram会以内嵌方式打开你的Web App页面。在页面中完成一次交互(如点击提交),然后查看终端输出,后端应该能接收到 web_app_data事件并打印出用户发送的数据。
注意事项/小提示:
- 如果点击按钮后页面空白,请检查浏览器控制台是否有跨域或资源加载错误,并确认域名已在BotFather中设置。
- 数据发送后,Bot可能不会立即回复,需要确保后端正确监听了
web_app_data事件。 - 测试时建议使用真实手机或桌面版Telegram客户端,网页版Telegram可能不支持所有Web App特性。
备用方案:
- 可以使用Telegram提供的 Web App测试模式:在BotFather中发送
/testwebapp命令,输入你的Web App URL进行快速测试。 - 如果无法获取用户数据,尝试在
initDataUnsafe中打印整个对象,检查是否包含query_id字段,该字段是数据验证的关键。
常见问题补充
问:Web App在iOS上无法正常显示怎么办?
答:确保你的页面使用了 viewport标签,并且所有资源都通过HTTPS加载。iOS Safari对WebGL和部分CSS特性有限制,建议避免使用复杂动画。
问:如何确保用户提交的数据是安全的?
答:后端必须使用 Telegram.WebApp.initData中的原始数据,结合Bot Token进行HMAC-SHA256签名验证。具体方法为:将 initData按 &分割,排除 hash字段后按字典序排序,拼接成字符串,然后使用Bot Token作为密钥计算HMAC,比对结果与 hash字段是否一致。
问:Web App可以访问用户的手机摄像头或地理位置吗?
答:可以,但需要用户授权。通过 navigator.mediaDevices.getUserMedia或 navigator.geolocation.getCurrentPosition标准Web API实现,Telegram不会额外干预,但建议在需要时明确提示用户。
总结:通过配置Node.js后端、引入Telegram Web App SDK、设置正确的域名白名单并验证数据签名,即可构建一个完整的Telegram内嵌小程序。