You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何无需机器人使用Telegram API只读获取频道历史?

不用机器人账号调用Telegram API读取频道历史的方法

你完全可以不用机器人账号,直接通过Telegram的原生MTProto API来发起只读调用读取频道历史——Bot API只是Telegram提供的简化接口(专门给机器人用的),而MTProto API才是底层的、支持所有用户操作的协议。

下面是具体的实现步骤和细节:

1. 先获取API凭证

首先你需要去Telegram开发者平台申请api_idapi_hash(注意这不是机器人的Token,是普通应用的凭证):

  • 登录Telegram开发者后台,创建一个新的应用(随便选应用类型,比如Desktop App就行)
  • 创建后就能拿到api_id(数字)和api_hash(字符串),这是调用MTProto API的必备密钥

2. 选择非机器人专用的MTProto库

不用纠结机器人相关的库,很多语言都有专门针对普通用户账号的MTProto客户端库,比如:

  • Python:telethonpyrogram(这两个最常用,功能完整)
  • 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

火山引擎 最新活动