You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于CloudRail开发Telegram应用:如何监听用户消息回复?

监听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;

关键步骤补充

  1. 设置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之类的工具做内网穿透)。

  1. 理解消息结构:parseReceivedMessages返回的messages数组里,每个消息对象包含这些常用字段:
    • sender.id:发送消息的用户ID(用来回复的关键)
    • text:用户发送的文本消息内容
    • timestamp:消息发送的时间戳

最后检查

确保你的Bot Token(代码里的"botkey")是正确的,CloudRail的密钥也没问题,然后启动服务器,设置好Webhook,就能收到用户的消息并回复啦!

内容的提问来源于stack exchange,提问作者Werner Germán Busch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:37