1. 背景与工作原理
1.1 数据流与通信模型
在 Telegram Web App 场景中,前端网页嵌入到 Bot 的对话界面,通过 Telegram 提供的 Web Apps API 与 Bot 进行数据交互。核心数据路径 是前端通过 Telegram 客户端调用 Web App API 将数据回传给 Bot,Telegraf.js 在服务器端会接收到一个 Update,进而触发相应的处理流程。
当用户在 Web App 内触发数据回传时,前端通常调用 Telegram.WebApp.sendData,Telegram 客户端将数据以 web_app_data 的形式回传给服务器端的 Bot。Telegraf.js 需要正确解析 Update 中的 callback_query 相关字段,例如 web_app_data,以提取实际的 payload。
1.2 Telegraf.js 的接收入口
Telegraf.js 提供对 Update 的完整封装,callback_query 中常见字段包括 data、web_app_data 等。要点在于从 Update 中定位到 web_app_data,并对其中的内容进行解析和校验。

本章节的目标是建立对数据回传过程的直观认知:前端触发发送、Telegram 客户端回传、Bot 端通过 Telegraf 读取 web_app_data,最终完成业务处理与响应。
2. 运行环境准备
2.1 安装 Telegraf
在 Node.js 项目中安装并使用 Telegraf,以便在服务器端接收并处理来自 Telegram 的各种 Update。
npm install telegraf
初始化示例中,請将 YOUR_BOT_TOKEN 替换为实际的机器人 token,确保 Bot 能够接收来自 Telegram 的 Update。
const { Telegraf } = require('telegraf');
const bot = new Telegraf('YOUR_BOT_TOKEN');2.2 初始化与中间件
为确保后续对 web_app_data 的访问方便,可以在中间件阶段统一提取并缓存,减少重复解析的成本。
bot.use((ctx, next) => {const cq = ctx.update?.callback_query;const raw = cq?.web_app_data?.data;if (raw) {try {ctx.state.webAppData = JSON.parse(raw);} catch {ctx.state.webAppData = { raw };}}return next();
});
通过这种方式,后续处理器就可以直接访问 ctx.state.webAppData,提升代码可维护性和鲁棒性。
3. Telegraf.js 如何接收 web_app_data
3.1 常规回调查询捕获
要获取前端回传的数据,最常见的方式是监听 callback_query,并读取 web_app_data 字段的内容。
bot.on('callback_query', async (ctx) => {const cq = ctx.update.callback_query;const webAppData = cq?.web_app_data?.data; // 可能是 JSON 字符串if (webAppData) {let payload;try {payload = JSON.parse(webAppData);} catch (e) {payload = { raw: webAppData }; // 不是 JSON 时的兜底处理}// 业务处理,例如保存、响应等await ctx.answerCbQuery();console.log('来自 Web App 的数据:', payload);} else {await ctx.answerCbQuery('未检测到 Web App 数据');}
});
注意事项:web_app_data.data 的内容可能是一个 JSON 字符串,也可能是自定义的 key=value 形式,接收后应进行恰当的解析与校验。
3.2 通过中间件解耦业务逻辑
为了避免在每个处理器中重复解析,可以用中间件将数据统一解析并挂载到 ctx.state,后续处理器据此读取。
bot.on('callback_query', async (ctx) => {const data = ctx.state.webAppData || {};// 根据 data 进行业务处理await ctx.answerCbQuery(`收到数据:${JSON.stringify(data)}`);
});
ctx.state 提供了一个简单而一致的上下文传递机制,确保不同处理流程之间数据可追踪。
3.3 处理回调按钮与确认
Web App 往往伴随一个回传按钮,务必在处理完成后调用 ctx.answerCbQuery() 或带消息的回答,以确保 Telegram 客户端 UI 的状态正确。
bot.action(/webapp.*/, (ctx) => {const data = ctx.state.webAppData;// 进行你的业务逻辑处理ctx.answerCbQuery(`收到数据:${JSON.stringify(data)}`);
});4. Web App 侧的数据发送示例
4.1 发送 JSON 数据
在前端 Web App 中,使用 Telegram.WebApp.sendData 将数据回传给 Bot,通常以 JSON 字符串形式传输。
// 在前端页面的 JS 中
const data = { userId: 123, orderId: 'A1B2C3', items: [1,2,3] };
Telegram.WebApp.sendData(JSON.stringify(data));
关键点:sendData 能把数据发送回 Bot,Bot 将在 Update 中看到 web_app_data 字段。
4.2 回传简单字符串的数据
如果数据结构较为简单,可以将数据序列化为 key=value 形式,降低前端复杂度,并在后端做相应解析。
const data = 'userId=123&orderId=A1B2C3';
Telegram.WebApp.sendData(data);5. 数据解析与校验策略
5.1 JSON 数据的解析与校验
对 JSON 数据应先执行 JSON.parse,再进行字段校验,确保字段存在且类型正确,避免异常与注入风险。
try {const obj = JSON.parse(payload);if (typeof obj.userId === 'number' && obj.orderId) {// 有效数据,执行后续业务逻辑}
} catch (e) {// 处理解析失败的情况
}5.2 安全性要点
为提升安全性,可以在 Web App 端附带签名、时间戳等信息,并在后端进行验签,确保数据来自受信任的前端。
6. 常见坑点与调试技巧
6.1 无法接收到 web_app_data
常见原因包括:Web App 未被授权使用、浏览器拦截数据回传、或时机不对。请确保在合适的时机调用 Telegram.WebApp.sendData,并在页面加载完成后再触发。
// 在前端确保页面加载完成
Telegram.WebApp.ready();6.2 日志与格式问题
在后端记录原始 Update,ctx.update 的结构可能随 Bot API 版本不同而变化,建议开启调试日志以观察实际字段。
bot.catch((err) => {console.error('Bot error', err);
});6.3 版本兼容性与最佳实践
推荐使用 Telegraf v4 及以上版本,以及 Telegram Web Apps 的最新 API,以获得对回传数据的原生支持与更稳定的回调处理。


