如何用Node.js的https包获取Telegram机器人Webhook数据?
核心结论
必须使用https.createServer,因为Telegram的Webhook需要向你的HTTPS服务器发起POST请求来推送数据;async不是强制要求,但用它处理异步读取请求体的逻辑会更简洁易读。
实现步骤与代码示例
1. 准备SSL证书
Telegram要求Webhook服务器必须使用HTTPS,你需要准备SSL证书(可以用免费的Let's Encrypt证书,或者自签证书用于本地测试),拿到cert.pem和key.pem文件。
2. 搭建HTTPS服务器并接收Webhook数据
const https = require('https'); const fs = require('fs'); // 加载SSL证书配置 const sslOptions = { key: fs.readFileSync('./key.pem'), cert: fs.readFileSync('./cert.pem') }; // 创建HTTPS服务器 https.createServer(sslOptions, async (req, res) => { // 仅处理匹配Webhook路径的POST请求 if (req.method === 'POST' && req.url === '/webhook') { try { // 异步读取请求体(等价于PHP的file_get_contents("php://input")) const requestBody = await new Promise((resolve, reject) => { let rawData = ''; req.on('data', chunk => rawData += chunk); req.on('end', () => resolve(rawData)); req.on('error', err => reject(err)); }); // 解析JSON数据,提取包含message的内容 const webhookPayload = JSON.parse(requestBody); if (webhookPayload.message) { console.log('收到Telegram消息:', webhookPayload.message); } // 返回200响应告知Telegram推送成功 res.writeHead(200); res.end('OK'); } catch (error) { console.error('处理Webhook请求出错:', error); res.writeHead(500); res.end('Server Error'); } } else { // 非Webhook请求返回404 res.writeHead(404); res.end('Not Found'); } }).listen(8443); // 监听Telegram允许的端口(可选443、80、88、8443)
关键细节说明
https.createServer:这是必须的,Telegram只接受HTTPS协议的Webhook地址,所以必须用HTTPS服务器接收推送。async/await:用来将读取请求体的流式异步操作封装成Promise,避免嵌套回调,让代码逻辑更直观。你也可以不用async,直接用回调处理,但可读性会下降。- 请求体读取:Node.js中HTTP请求是流式数据,需要通过
data事件收集所有数据块,在end事件中拼接成完整字符串,这就是PHP中file_get_contents("php://input")的Node.js实现方式。 - 响应要求:处理完请求后必须返回200状态码,否则Telegram会认为推送失败并重复尝试。
内容的提问来源于stack exchange,提问作者Fratagone
相关产品推荐
相关产品推荐

