
本文介绍如何使用 Python 解析 Telegram 导出的 result.json 文件,并精准查找包含指定文本的消息或按消息 ID 定位目标内容,涵盖结构校验、健壮搜索逻辑与常见错误规避。
本文介绍如何使用 python 解析 telegram 导出的 `result.json` 文件,并精准查找包含指定文本的消息或按消息 id 定位目标内容,涵盖结构校验、健壮搜索逻辑与常见错误规避。
Telegram 的官方导出功能(通过「Export Chat History」)生成的 result.json 通常是一个消息对象列表,每个对象为字典,包含 message_id、text(可能为 null 或缺失)、date、from 等字段。原始代码失败的根本原因在于:它错误地将 JSON 数据当作 {reply_to_message_id: text} 的键值对字典处理,而实际结构是 [{...}, {...}, ...] 的 list —— 这导致 for reply_to_message_id, text in msgs.items() 语法报错或逻辑失效。
✅ 正确做法是遍历消息列表,并安全访问字段:
import json
def search_telegram_export(json_path: str, keyword: str = None, message_id: int = None):
with open(json_path, encoding="utf-8") as f:
data = json.load(f)
# 确保顶层是列表(典型导出结构)
if not isinstance(data, list):
raise ValueError("Expected a list of messages. Check if result.json is exported correctly.")
results = []
for msg in data:
# 跳过非字典类型(如空消息、系统事件)
if not isinstance(msg, dict):
continue
msg_id = msg.get("message_id")
text = msg.get("text", "") or "" # 处理 None 或缺失字段
# 按关键词搜索(支持中文、英文、符号)
if keyword and keyword.lower() in str(text).lower():
results.append({
"message_id": msg_id,
"text": text,
"date": msg.get("date", "N/A"),
"from": msg.get("from", "N/A")
})
# 按 message_id 精确匹配
if message_id is not None and msg_id == message_id:
results.append({
"message_id": msg_id,
"text": text,
"date": msg.get("date", "N/A"),
"from": msg.get("from", "N/A")
})
return results
# 使用示例
if __name__ == "__main__":
# 查找包含 "Python" 的消息
matches = search_telegram_export("result.json", keyword="Python")
for m in matches:
print(f"[{m['date']}] ID {m['message_id']} | {m['text'][:100]}...")
# 查找特定 ID 的消息(例如 message_id = 12345)
target = search_telegram_export("result.json", message_id=12345)
if target:
print("Found:", target[0])
else:
print("Message not found.")⚠️ 关键注意事项:
-
结构验证优先:务必先用
print(type(data), len(data))和print(data[0].keys())检查 JSON 格式,避免因导出版本差异(如含messages嵌套字段)导致 KeyError; -
字段容错处理:永远使用
.get(key, default)而非直接索引(如msg["text"]),因为部分消息无text(如图片、语音、服务通知); -
编码统一:显式指定
encoding="utf-8"(而非"utf8",后者非标准写法),确保中文正常解析; -
大小写敏感可选:示例中采用
str(text).lower()实现不区分大小写的搜索,如需精确匹配,直接使用keyword in str(text)即可; -
性能提示:对于超大导出文件(>100MB),建议结合
ijson库流式解析,避免内存溢出。
掌握此方法后,你不仅能快速定位信息,还可进一步扩展为导出关键词统计、时间线分析或跨群组消息聚合工具——Telegram 数据挖掘的第一步,始于结构化读取与精准检索。
立即学习“Python免费学习笔记(深入)”;


















