如何无需机器人使用Telegram API只读获取频道历史?
不用机器人账号调用Telegram API读取频道历史的方法
你完全可以不用机器人账号,直接通过Telegram的原生MTProto API来发起只读调用读取频道历史——Bot API只是Telegram提供的简化接口(专门给机器人用的),而MTProto API才是底层的、支持所有用户操作的协议。
下面是具体的实现步骤和细节:
1. 先获取API凭证
首先你需要去Telegram开发者平台申请api_id和api_hash(注意这不是机器人的Token,是普通应用的凭证):
- 登录Telegram开发者后台,创建一个新的应用(随便选应用类型,比如Desktop App就行)
- 创建后就能拿到
api_id(数字)和api_hash(字符串),这是调用MTProto API的必备密钥
2. 选择非机器人专用的MTProto库
不用纠结机器人相关的库,很多语言都有专门针对普通用户账号的MTProto客户端库,比如:
- Python:
telethon或pyrogram(这两个最常用,功能完整) - JavaScript:
mtproto-js - Ruby:
telegram-mtproto(不是你提到的那个机器人库)
这里用Python的telethon举个简单的例子,直接调用messages.getHistory:
首先安装库:
pip install telethon
然后写代码:
from telethon import TelegramClient from telethon.tl.functions.messages import GetHistoryRequest # 替换成你自己的api_id、api_hash API_ID = 123456 API_HASH = "你的api_hash字符串" # 会话文件名,会自动保存登录状态 SESSION_NAME = "my_readonly_session" async def fetch_channel_history(): # 初始化客户端 async with TelegramClient(SESSION_NAME, API_ID, API_HASH) as client: # 第一次运行会提示输入手机号和验证码登录,之后直接复用会话 await client.start() # 获取目标频道的实体:可以是频道用户名(@xxx)、ID或者链接 target_channel = await client.get_entity("@your_channel_username") # 调用messages.getHistory方法 history_response = await client(GetHistoryRequest( peer=target_channel, offset_id=0, # 从最新的消息开始 limit=100, # 每次最多获取100条消息 offset_date=None, add_offset=0, max_id=0, min_id=0, hash=0 )) # 遍历并处理消息 for msg in history_response.messages: print(f"[{msg.date}] {msg.message}") # 执行函数 import asyncio asyncio.run(fetch_channel_history())
3. 关于messages.getHistory的调用技巧
- 如果要获取超过100条消息,可以循环调用:每次把
offset_id设为上一次返回的最后一条消息的id,直到返回的消息列表为空 - 对于公开频道,普通用户账号登录后就能读取;如果是私有频道,你的账号必须是该频道的成员
- 注意Telegram的API速率限制,不要短时间内频繁调用,否则会被临时限制访问
4. 为什么不用Bot API?
Bot API确实更简单,但它有局限性:机器人账号无法读取所有频道的历史(比如很多公开频道不允许机器人读取,或者需要频道管理员授权),而普通用户账号的权限和你在Telegram客户端里的权限完全一致,只要你能在客户端看到频道内容,就能通过MTProto API读取。
内容的提问来源于stack exchange,提问作者Nakilon




