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 Неизвестный
相关产品推荐
相关产品推荐

