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

Telegram机器人无法获取其他Bot消息,转用mtproto-core遇聊天获取问题

问题解决思路:获取Telegram超级群组中所有Bot发送的消息

问题背景

  • 开发Telegram机器人,已设为群组管理员、关闭隐私模式并加入目标超级群组
  • 需求:抓取群组内所有消息(包含其他Bot发送的内容)并存入网站数据库
  • 使用Bot API的getUpdates接口仅能获取普通用户消息,无法捕获其他Bot的消息,官方明确规则:

Bot之间交互可能陷入不受欢迎的循环。为避免这种情况,我们决定无论何种模式,Bot都无法看到其他Bot发送的消息。

mtproto-core调用问题分析与修正

你当前使用mtproto-core时无法找到目标聊天列表,核心问题是通过用户名解析对话的方式不适用于超级群组,同时代码逻辑存在可优化点:

1. 错误的对话解析逻辑

contacts.resolveUsername多用于解析普通用户或公开频道的用户名,对超级群组兼容性差。建议改用「获取全量对话列表后筛选」的方式定位目标群组:

2. 修正后的代码示例

const api = require("./api");

(async () => {
    // 获取所有对话列表
    const dialogsResult = await api.call('messages.getDialogs', {
        offset_date: 0,
        offset_id: 0,
        offset_peer: { _: 'inputPeerEmpty' },
        limit: 100 // 调整范围以覆盖目标群组
    });

    // 按标题或ID筛选目标超级群组
    const targetGroup = dialogsResult.chats.find(chat => 
        chat.title === "你的超级群组标题" || chat.id === 123456789 // 去掉-100前缀的群组ID
    );

    if (!targetGroup) {
        console.log("未找到目标超级群组");
        return;
    }

    // 构造合法的inputPeer
    const inputPeer = {
        _: 'inputPeerChannel',
        channel_id: targetGroup.id,
        access_hash: targetGroup.access_hash
    };

    // 分批拉取消息历史
    const LIMIT_COUNT = 10;
    const allMessages = [];
    const firstHistoryResult = await api.call('messages.getHistory', {
        peer: inputPeer,
        limit: LIMIT_COUNT,
    });
    const historyCount = firstHistoryResult.count;

    for (let offset = 0; offset < historyCount; offset += LIMIT_COUNT) {
        const history = await api.call('messages.getHistory', {
            peer: inputPeer,
            add_offset: offset,
            limit: LIMIT_COUNT,
        });
        allMessages.push(...history.messages);
    }

    console.log('所有消息(含Bot发送内容):', allMessages);
})();

3. 关键注意事项

  • mtproto-core需使用普通用户账号认证,Bot账号无法绕过「看不到其他Bot消息」的限制
  • 确保用户账号已加入目标超级群组,且具备消息查看权限
  • access_hash是调用API的必填参数,必须从对话列表中获取,不能省略
  • 控制API调用频率,避免触发Telegram的限流机制

实时消息捕获提示

若需要实时获取新消息(包括其他Bot发送的内容),可使用updates.getState配合updates.getDifference实现长轮询,替代定时拉取历史消息的方式

内容的提问来源于stack exchange,提问作者XAZG Неизвестный

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 23:31:05