Telegram中积累了无数重要的聊天记录,无论是工作群组的讨论还是与朋友的珍贵对话,都值得妥善保存。虽然Telegram官方提供了桌面端的导出功能,但如果你希望自动化、定期备份,或者将特定对话的数据用于分析,使用API直接获取并导出为CSV无疑是最灵活的方法。本文将带你从零开始,利用Telethon库调用Telegram API,轻松获取聊天历史并导出为CSV文件。
准备工作:基础环境与账号设置
在开始之前,你需要确保以下几点:
- 一个已经注册的Telegram账号。
- 能够访问my.telegram.org(可能需要科学上网)。
- Python 3.7或更高版本已安装。
- 可以使用pip安装第三方库。
获取API ID和API Hash
Telegram API的调用需要唯一凭证。前往my.telegram.org,使用你的手机号登录,然后点击“API development tools”。填写应用名称和描述后,系统会生成API ID和API Hash。请将它们保存好,注意不要泄露。
安装Telethon库
Telethon是Python中一个优秀的MTProto客户端库,它支持用户账号操作,可以轻松获取聊天历史。打开终端或命令提示符,运行以下命令安装:
pip install telethon
编写Python脚本获取聊天历史
我们将编写一个脚本,实现以下功能:
- 登录Telegram(首次运行会要求输入手机号和验证码)。
- 列出所有对话(群组、频道、用户)。
- 选择要导出的对话。
- 遍历消息,提取关键字段。
- 写入CSV文件。
以下是完整脚本示例:
from telethon.sync import TelegramClient
import csv
api_id = 12345 # 你的API ID
api_hash = 'your_api_hash' # 你的API Hash
client = TelegramClient('session_name', api_id, api_hash)
client.start()
# 列出所有对话
dialogs = client.get_dialogs()
print("可用的对话列表:")
for i, dialog in enumerate(dialogs):
print(f". {dialog.name} (ID: {dialog.id})")
# 让用户选择
choice = int(input("请输入要导出的对话序号: "))
chat = dialogs[choice].entity
# 设置CSV文件
csv_file = 'chat_history.csv'
with open(csv_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['date', 'sender_id', 'sender_name', 'message_text', 'message_type'])
# 遍历消息(按时间正序)
for message in client.iter_messages(chat, reverse=True):
sender = message.sender
sender_name = sender.username if sender else 'Unknown'
msg_text = message.text.replace('\n', ' ').strip()
msg_type = type(message.media).__name__ if message.media else 'text'
writer.writerow([message.date.isoformat(), message.sender_id, sender_name, msg_text, msg_type])
print(f"成功导出到 ")
运行脚本与验证导出结果
保存脚本为export_chat.py,在终端运行python export_chat.py。首次运行会提示输入手机号、登录验证码,如果是新设备可能还需要输入两步验证密码。成功登录后,按提示选择对话,脚本会开始遍历消息并写入CSV。导出完成后,你可以用Excel、Google Sheets或文本编辑器打开CSV文件,检查数据是否完整。
CSV中的字段包括:
- date:消息发送时间(ISO格式)
- sender_id:发送者的用户ID
- sender_name:发送者的用户名(若没有则为“Unknown”)
- message_text:消息文本,换行符已替换为空格
- message_type:消息类型(text、Photo、Document等)
进阶优化:应对大对话与特殊需求
对于消息量巨大的群组,遍历可能耗时较长且易触发频控。建议采用以下优化:
- 使用
limit参数限制每次拉取数量:iter_messages(chat, limit=1000),分批处理。 - 添加延时:在循环中使用
time.sleep(1)避免请求过快。 - 按日期范围过滤:使用
iter_messages(chat, offset_date=datetime(...))。 - 如果想同时导出媒体文件,可以检查
message.media并调用client.download_media(message)保存到本地。
注意事项与限制
使用用户API导出聊天记录时,需要注意:
- 账号安全:请使用正规的API凭证,不要将session文件泄露给他人。
- 频率限制:Telegram对API请求有频率限制,过快的请求可能导致暂时封禁。建议适当增加延时。
- 隐私合规:导出他人聊天记录时必须确保符合当地法律和Telegram服务条款,仅用于合法用途。
- 消息限制:对于超大群组,Telegram服务器可能只保留部分历史消息,API无法获取到更早的数据。
常见问题
为什么要用用户API而不是Bot API?
Bot API仅能获取机器人收到的更新,无法获取历史消息,而且无法主动拉取用户的聊天记录。使用用户账号(MTProto API)可以访问完整的聊天历史,因此适合做数据导出。
导出过程中断网了怎么办?
脚本不会自动断点续传,但你可以通过记录上次导出的消息ID来手动实现断点续传。每次遍历后保存最后一条消息的ID,下次从该ID继续。
可以导出媒体文件吗?
可以,在遍历消息时,如果message.media不为空,使用client.download_media(message)即可下载媒体,但不推荐全量下载,以免消耗大量存储和流量。
总结
通过Telethon,我们可以轻松调用Telegram API获取聊天历史并导出为CSV,为数据备份和分析提供了极大的便利。本文提供的脚本虽然基础,但已经能够应对绝大多数日常需求。根据实际场景进行适当优化,你就能打造一个属于自己的自动化导出工具。希望这篇文章对你有所帮助,快去试试吧!