Pyrogram无法提取超级群组指定主题文件名及日期查询问题
解决Pyrogram提取超级群组指定主题文件及日期范围筛选问题
问题分析
原代码存在以下核心问题:
- 未通过API参数指定主题,导致获取整个群组的消息而非目标主题内容
- 文件类型判断逻辑不完善,仅处理视频类文件,未覆盖文档、RAR等类型,且直接访问
message.document属性存在空指针风险 - 依赖消息链接判断所属主题,可靠性低且容易出错
修改后的完整代码
from pyrogram import Client from datetime import datetime app = Client( name="my_account", # 建议用自定义名称,而非用户名格式 api_id=27*******, api_hash="b5*******************", phone_number="+393*******", password="********" # 无密码可直接删除该参数 ) group_id = -1001867911973 topic_id = 692 msg_file_dict = {} # 指定日期范围(示例:2023年7月1日至8月1日) start_date = datetime(2023, 7, 1) end_date = datetime(2023, 8, 1) with app: # 直接指定topic_id获取对应主题的消息历史 for message in app.get_chat_history(group_id, topic_id=topic_id, limit=None): # 筛选日期范围内的消息 if start_date <= message.date <= end_date: msg_id = message.id file_name = None # 处理视频消息 if message.video: file_name = message.video.file_name or f"VID_{msg_id}_{message.video.file_unique_id}.{message.video.mime_type.split('/')[-1]}" # 处理文档消息(包含RAR、普通文档等) elif message.document: file_name = message.document.file_name or f"DOC_{msg_id}_{message.document.file_unique_id}.{message.document.mime_type.split('/')[-1]}" if file_name: msg_file_dict[msg_id] = file_name print(f"消息ID: {msg_id},文件名: {file_name}") print("\n提取到的消息ID列表:", list(msg_file_dict.keys())) print("提取到的文件名列表:", list(msg_file_dict.values()))
关键修改说明
- 指定主题获取消息:在
get_chat_history中添加topic_id=topic_id参数,直接从API层面获取目标主题的消息,无需通过链接判断 - 完善文件类型处理:
- 分别判断
message.video和message.document是否存在,避免空指针错误 - 覆盖文档、RAR等所有document类型文件,自动提取原文件名,若原文件名不存在则生成自定义名称
- 分别判断
- 日期范围筛选:
- 导入
datetime模块定义起止日期 - 遍历消息时判断
message.date是否在指定范围内,仅处理符合条件的消息
- 导入
- 客户端初始化优化:客户端名称建议用普通字符串,密码参数若无需验证可直接删除,避免冗余写法
额外说明
- 若需要获取更多历史消息,可调整
limit参数(设为None表示获取全部符合条件的消息) - 若群组消息量较大,建议添加分页处理或限制
limit值,避免内存占用过高
内容的提问来源于stack exchange,提问作者Peter Long
相关产品推荐
相关产品推荐

