You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GramJS中Telegram大型超级群的NewMessage事件处理器无法触发的问题

GramJS中Telegram大型超级群的NewMessage事件处理器无法触发的问题

我之前在使用GramJS监听Telegram大型超级群时也碰到过完全一样的问题——小群和私聊的消息能正常触发NewMessage事件,但30k+成员的超级群完全没反应,手动拉取消息却一切正常。下面是我总结的几个排查方向和解决方案,亲测有效:

1. 重新生成Session String(最常见的解决方法)

当你加入大型超级群后,旧的Session String可能没有包含该群的更新订阅信息。Telegram需要明确订阅群的消息推送,而旧Session是在你加入群之前生成的,所以不会自动同步这个订阅关系。

解决步骤:

暂时修改代码重新生成Session:

const { TelegramClient } = require("telegram");
const { StringSession } = require("telegram/sessions");

const apiId = parseInt(process.env.API_ID);
const apiHash = process.env.API_HASH;
const stringSession = new StringSession(""); // 空Session触发重新登录流程

(async () => {
  const client = new TelegramClient(stringSession, apiId, apiHash, {
    connectionRetries: 5,
  });

  await client.start({
    phoneNumber: async () => await prompt("请输入你的手机号:"),
    password: async () => await prompt("请输入你的账号密码(如果有):"),
    phoneCode: async () => await prompt("请输入收到的验证码:"),
    onError: (err) => console.log(err),
  });

  console.log("新的Session String:", client.session.save()); // 复制这个新Session替换环境变量
})();

把新生成的Session String替换到环境变量SESSION_STRING中,重启服务即可。

2. 显式指定监听目标大型群

全局监听NewMessage({})有时会因为Telegram的推送优先级策略漏过大型群的消息,显式指定要监听的群Entity可以强制客户端订阅该群的更新:

修改后的代码示例:

(async () => {
  const client = new TelegramClient(stringSession, apiId, apiHash, {
    connectionRetries: 5,
  });

  await client.start({
    onError: (err) => console.log(err),
  });

  console.log("✅ Connected!");

  // 先获取大型群的Entity(支持群链接、ID、用户名)
  const largeGroupEntity = await client.getEntity("https://t.me/your_large_group_link");

  // 仅监听该大型群的消息
  client.addEventHandler(async (event) => {
    console.log("📨 大型群新消息:", event.message.text);
    // 消息处理逻辑...
  }, new NewMessage({ chats: [largeGroupEntity] }));

  console.log("👂 已开始监听大型群...");
})();

3. 检查并更新GramJS版本

旧版本的GramJS可能对大型超级群的消息推送处理存在bug,更新到最新版本往往能解决这类兼容性问题:

npm install telegram@latest

4. 监听原始更新,排查推送是否到达客户端

如果以上方法都无效,可以先监听所有原始更新,确认Telegram是否真的把大型群的消息推送给了客户端:

// 替换原有的NewMessage事件处理器
client.addEventHandler(async (update) => {
  // 打印所有更新,过滤过大字段避免输出混乱
  console.log("🔄 原始更新内容:", JSON.stringify(update, (key, value) => {
    if (key === "bytes" || key === "media") return "[内容已隐藏]";
    return value;
  }, 2));
});
  • 如果能看到来自大型群的更新(比如updateNewChannelMessage类型),说明需要调整NewMessage的配置,比如添加includeChannels: true(超级群本质是特殊的频道):
    client.addEventHandler(async (event) => {
      console.log("📨 新消息:", event.message.text);
    }, new NewMessage({ includeChannels: true }));
    
  • 如果看不到任何来自大型群的更新,可能是账号在Telegram端的订阅异常,尝试退出再重新加入大型群,或者用官方Telegram客户端打开群并保持在线一段时间后,再重启GramJS服务。

5. 调整客户端连接配置

大型群消息量较大,默认TCP连接可能出现丢包或隐性断开,尝试切换到WebSocket连接提升稳定性:

const client = new TelegramClient(stringSession, apiId, apiHash, {
  connectionRetries: 5,
  useWSS: true, // 启用WebSocket连接
});

我当时的问题就是旧Session没有包含大型群的订阅,重新生成Session后就正常触发事件了。如果你的情况不同,可以按上面的步骤逐一排查,一般都能解决问题。

火山引擎 最新活动