telegram bot api 不支持获取群组聊天历史;必须使用 telegram 官方 mtproto api(即 telegram api),并通过用户账号登录后调用 messages.gethistory 方法实现。
telegram bot api 不支持获取群组聊天历史;必须使用 telegram 官方 mtproto api(即 telegram api),并通过用户账号登录后调用 messages.gethistory 方法实现。
在 Telegram 生态中,存在两套完全独立的 API 体系:
- Telegram Bot API(如 node-telegram-bot-api 所封装):面向机器人开发,权限受限,无法读取任意群组的历史消息(即使群组为公开),仅能接收自身被提及或拥有管理员权限时的有限事件。
- Telegram MTProto API(即 Telegram API):面向客户端开发,需以真实用户身份登录(即“用户端”),具备完整消息访问能力(前提是账号已加入目标群组且群组未禁用消息历史查看)。
因此,若需获取公开群组的完整聊天历史,你必须切换技术栈:
✅ 正确方案:使用 MTProto 客户端库(TypeScript/JavaScript)
推荐使用官方维护的 gramjs(TypeScript 原生、文档完善、活跃更新)或 telegram-client(轻量级)。
以下为 gramjs 的最小可行示例(需先注册应用获取 api_id 和 api_hash):
import { Api, TelegramClient } from "telegram";
import { StringSession } from "telegram/sessions";
// 1. 替换为你的 api_id 和 api_hash(从 https://my.telegram.org 获取)
const apiId = 1234567;
const apiHash = "your_api_hash_here";
const phoneNumber = "+8613800138000"; // 你的手机号(含国际区号)
// 2. 创建持久化 session(首次运行会发送验证码)
const session = new StringSession(""); // 空字符串表示新会话
const client = new TelegramClient(session, apiId, apiHash, {
connectionRetries: 5,
});
async function fetchGroupHistory() {
await client.start({
phoneNumber: () => phoneNumber,
password: () => "your_2fa_password", // 若启用双因素认证
phoneCode: () => "12345", // 验证码(控制台输入或短信获取)
onError: (err) => console.error(err),
});
console.log("已登录成功");
// 3. 解析群组标识符(可为 username、chat ID 或 invite link)
const entity = await client.getInputEntity("tme_example_group"); // 替换为实际群组 username
// 4. 分页拉取历史消息(最多 100 条/次,需循环)
const messages = await client.invoke(
new Api.messages.GetHistory({
peer: entity,
limit: 100,
offsetId: 0,
offsetDate: 0,
addOffset: 0,
maxId: 0,
minId: 0,
hash: 0,
})
);
console.log(`共获取 ${messages.messages.length} 条消息`);
messages.messages.forEach((msg) => {
if (msg instanceof Api.Message) {
console.log(`[${new Date(msg.date * 1000).toISOString()}] ${msg.message}`);
}
});
}
fetchGroupHistory();⚠️ 关键注意事项
- 账号要求:必须使用真实 Telegram 用户账号(非 Bot Token),且该账号已加入目标群组;
- 权限限制:即使群组公开,若群组设置中启用了「隐藏历史记录」(hide_history_from_new_members),新成员仍无法查看历史消息;
- 频率与限流:MTProto API 有严格调用频率限制(如每秒数次),生产环境需添加退避重试与分页逻辑;
- 合规性:请遵守 Telegram Terms of Service 及群组管理规则,避免自动化爬取引发封禁;
- Session 安全:StringSession 可序列化保存,但务必加密存储,切勿硬编码或提交至代码仓库。
✅ 总结
node-telegram-bot-api 本质是 Bot API 封装,无法满足历史消息读取需求。真正可行路径是:
✅ 注册 Telegram 应用获取 api_id/api_hash → ✅ 使用 gramjs 登录用户账号 → ✅ 调用 messages.getHistory 分页获取 → ✅ 合规处理数据与限流。
这是目前 JavaScript/TypeScript 生态下获取 Telegram 群组历史消息的唯一标准方案。

















