Pyrogram/Telethon无法捕获指定Telegram频道消息事件的问题
处理Telegram加密内容频道无法触发实时消息事件的问题
问题核心
- 目标频道ID
-100123456的has_protected_content属性为true,这是导致实时事件失效的根本原因 - 无论是Pyrogram的
@app.on_message()还是Telethon的client.on(events.NewMessage()),都无法捕获该频道的新消息推送,但普通频道、群组、私聊的消息事件正常工作 - 主动调用
get_chat_history()/get_messages()可以正常拉取该频道的消息内容
原因分析
Telegram的has_protected_content=true是频道管理员开启的内容保护权限,该权限会限制第三方客户端通过实时事件订阅的方式获取新消息推送,仅允许通过主动拉取历史消息的方式获取内容。这是官方层面的权限控制,目的是防止频道内容被自动抓取、批量转发。
可行方案
目前没有合法的方式绕过这个限制,你采用的循环主动拉取是当前唯一可行的方案。实现时可以优化以下几点:
- 根据频道的更新频率设置合理的拉取间隔(比如更新频繁的频道设为1分钟一次,低频频道设为5-10分钟一次),避免触发API限流
- 每次拉取时记录最后处理的消息ID,通过
offset_id参数只拉取该ID之后的新消息,减少数据处理量 - 添加异常捕获和重试机制,处理网络波动、API限流等情况
示例代码(Pyrogram)
from pyrogram import Client import time app = Client("your_session_name") TARGET_CHANNEL = -100123456 last_processed_id = 0 def process_new_messages(): global last_processed_id # 拉取offset_id之后的最新20条消息,可根据需求调整limit值 messages = app.get_messages(TARGET_CHANNEL, offset_id=last_processed_id, limit=20) # 反转消息列表,按时间顺序从旧到新处理 for msg in reversed(messages): if msg.id > last_processed_id: # 这里替换成你的消息解析逻辑 print(f"解析新消息:ID {msg.id},内容:{msg.text}") last_processed_id = msg.id with app: # 初始化时获取当前最新消息ID,避免重复处理历史消息 latest_msg = app.get_messages(TARGET_CHANNEL, limit=1) if latest_msg: last_processed_id = latest_msg[0].id while True: try: process_new_messages() except Exception as e: print(f"拉取消息出错:{str(e)}") time.sleep(300) # 5分钟间隔,可根据频道更新频率调整
内容的提问来源于stack exchange,提问作者Daniel Salama
相关产品推荐
相关产品推荐

