
本文详解为何无法使用 node-telegram-bot-api 获取群组消息历史,并指导开发者正确选用 telegram 官方 mtproto api(配合 gramjs 等库)实现合法、合规的群组历史拉取。
本文详解为何无法使用 node-telegram-bot-api 获取群组消息历史,并指导开发者正确选用 telegram 官方 mtproto api(配合 gramjs 等库)实现合法、合规的群组历史拉取。
Telegram 提供两套完全独立的 API 体系:Bot API 和 MTProto API,二者权限、用途与接入方式截然不同。你当前使用的 node-telegram-bot-api 是基于 Bot API 的封装库,而获取完整群组聊天历史(如 messages.getHistory)属于 MTProto API 的能力范畴——Bot API 明确不支持该操作。
❌ 为什么 node-telegram-bot-api 无法获取群组历史?
- Bot API 设计初衷是让机器人响应用户指令、处理命令和简单交互,不具备读取非私聊消息历史的权限;
- 即使是公开群组,Bot 也仅能接收其被 @ 或作为管理员收到的少量新消息(需开启 group_admins 权限且群组设置允许),无法回溯历史消息;
- messages.getHistory 属于 MTProto API 的核心方法,仅对已登录的「用户账户」(User Account)开放,Bot Token 无法调用。
✅ 正确方案:使用 MTProto API(推荐 GramJS)
你需要以「真实 Telegram 用户身份」登录(即模拟客户端),而非使用 Bot Token。推荐 TypeScript 友好的 GramJS 库:
npm install gramjs
基础示例(获取指定群组前 100 条消息):
import { Api, TelegramClient } from "gramjs";
import { StringSession } from "gramjs/sessions";
// 替换为你的 API ID 和 Hash(从 https://my.telegram.org 获取)
const apiId = 1234567;
const apiHash = "abcdef1234567890abcdef1234567890";
// 首次运行需扫码或输入手机号+验证码登录(会生成 session 字符串)
const session = new StringSession(""); // 初次留空,后续可持久化保存
const client = new TelegramClient(session, apiId, apiHash, {
connectionRetries: 5,
});
async function fetchGroupHistory() {
await client.start({
phoneNumber: async () => await input("Please enter your phone number: "),
password: async () => await input("Please enter your password: "),
phoneCode: async () => await input("Please enter the code you received: "),
onError: (err) => console.error(err),
});
// 通过群组 username 或 chat ID 查找实体
const entity = await client.getInputEntity("your_public_group_username"); // 如 "texample"
const messages = await client.invoke(
new Api.messages.GetHistory({
peer: entity,
limit: 100,
offsetId: 0,
addOffset: 0,
maxId: 0,
minId: 0,
})
);
console.log(`Fetched ${messages.messages.length} messages`);
messages.messages.forEach((msg) => {
if (msg instanceof Api.Message && msg.message) {
console.log(`[${new Date(msg.date * 1000).toISOString()}] ${msg.message}`);
}
});
}
fetchGroupHistory();⚠️ 注意事项:
- 你必须拥有该群组的 访问权限(已加入且群组未设为“仅管理员可见”);
- 首次登录需人工验证(短信/Telegram 登录码),后续可用 StringSession.save() 持久化会话;
- 遵守 Telegram API 调用频率限制(如每秒最多 20 个请求);
- 公开群组(public supergroup)可直接通过 username 访问;私密群组需先通过 client.getDialogs() 获取 InputPeer。
总结
- ✅ 可行路径:使用 GramJS / Telethon(Python)等 MTProto 客户端库,以用户身份登录并调用 messages.getHistory;
- ❌ 不可行路径:任何 Bot API 封装库(包括 node-telegram-bot-api)均无法绕过权限限制获取历史消息;
- ? 合规前提:确保你拥有群组访问权,且行为符合 Telegram Terms of Service ——禁止用于爬取敏感信息或大规模数据采集。
选择正确的 API 层级,是 Telegram 开发的第一道关键门槛。理解 Bot 与 User 的本质区别,才能避免在权限设计上走弯路。

















