基于CloudRail开发Telegram应用:如何监听用户消息回复?
嘿,我来帮你搞定这个问题!你的现有代码已经有了发送消息的基础,但在监听用户回复这块儿还有些地方需要调整,我一步步给你讲清楚:
首先,先理清楚核心逻辑
当用户给你的Bot发消息时,Telegram会把这条消息以POST请求的形式推送到你设置的Webhook URL上。所以你的Node.js服务器需要正确接收并解析这个请求,CloudRail的parseReceivedMessages方法就是干这个的——它会帮你把Telegram的原始请求转换成易于处理的消息格式。
修正你的代码问题
我先把你的代码里的错误和需要调整的地方指出来,再给你完整的修改版本:
1. 必须添加JSON解析中间件
Telegram发送的POST请求是JSON格式的,所以你需要在Express应用里添加express.json()中间件来解析请求体,否则req.body会是空的(记得在你的主app.js里加上app.use(express.json());)。
2. 正确使用parseReceivedMessages
你现在的代码里parseReceivedMessages的参数写法不对,应该直接传入Express的req对象,而不是httpRequest: stream.Readable。而且处理收到的消息的逻辑应该放在这个方法的回调里,因为解析完成后才能拿到用户的消息内容。
3. 调整POST路由的逻辑
原来的req.body.kind=="postMessage"判断是不对的,Telegram的Webhook请求不会带这个字段,我们要从parseReceivedMessages返回的结果里获取用户消息。
修改后的完整代码
var express = require('express'); var router = express.Router(); const cloudrail = require("cloudrail-si"); // 配置CloudRail密钥 cloudrail.Settings.setKey("pass"); // 初始化Telegram服务 const service = new cloudrail.services.Telegram( null, "botkey", "webhook" // 这里要确保你的Webhook URL已经正确设置,后面会说 ); // 发送消息的函数(保留你的逻辑,稍作优化) function sendMessage(userId, message) { service.sendMessage(userId, message, (error, result) => { if (error) { console.error("发送消息出错:", error); } else { console.log("消息发送成功:", result); } }); } router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); // 处理Telegram的Webhook请求(核心修改部分) router.post("/", function(req, res, next) { // 用CloudRail解析收到的Telegram消息 service.parseReceivedMessages(req, (error, messages) => { if (error) { console.error("解析消息出错:", error); res.sendStatus(500); return; } // 遍历所有收到的消息(可能有多条) messages.forEach(message => { // 获取发送消息的用户ID和消息内容 const userId = message.sender.id; const userMessage = message.text; console.log(`收到用户${userId}的消息:${userMessage}`); // 这里可以添加你的业务逻辑,比如根据用户消息内容回复 sendMessage(userId, `我收到你的消息啦:${userMessage}`); }); // 给Telegram返回200状态,表示已接收消息 res.sendStatus(200); }); }); module.exports = router;
关键步骤补充
- 设置Webhook URL:你需要告诉Telegram把消息推送到你的服务器地址,在服务器启动时调用一次即可(可以写在单独的脚本里,或者路由初始化时):
// 示例:设置Webhook,替换成你的实际域名 service.setWebhook("https://your-public-domain.com/", (error) => { if (error) { console.error("设置Webhook失败:", error); } else { console.log("Webhook设置成功"); } });
注意:你的服务器必须有公网HTTPS地址,Telegram要求Webhook必须是HTTPS的(本地开发可以用ngrok之类的工具做内网穿透)。
- 理解消息结构:
parseReceivedMessages返回的messages数组里,每个消息对象包含这些常用字段:sender.id:发送消息的用户ID(用来回复的关键)text:用户发送的文本消息内容timestamp:消息发送的时间戳
最后检查
确保你的Bot Token(代码里的"botkey")是正确的,CloudRail的密钥也没问题,然后启动服务器,设置好Webhook,就能收到用户的消息并回复啦!
内容的提问来源于stack exchange,提问作者Werner Germán Busch

