使用Telethon获取私人对话全部消息失败问题求助
解决Telethon获取私人对话全部消息的问题
原代码存在的问题
- 缩进错误:Python靠缩进区分代码块,
with语句内的所有代码必须缩进,你的代码里all_chats和for循环都没缩进,这会直接触发语法错误。 - 逻辑冗余:你用for循环遍历对话框,但循环内重复调用
get_dialogs(),还只执行一次就break,完全没必要用循环,直接通过索引取目标对话即可。 - 未实现消息获取:原代码仅打印了对话对象,根本没有编写获取该对话下全部消息的逻辑。
- 对话名称为空:私人对话(比如和单个用户的聊天)的
name字段通常是空的,应该用title属性,或者对方的first_name/username来确认目标对话。
修正后的代码
from telethon import TelegramClient # 替换成你自己的API信息 api_id = 你的api_id api_hash = '你的api_hash' with TelegramClient('session_name', api_id, api_hash) as client: # 一次性获取所有对话列表 dialogs = client.get_dialogs() # 取你确认的索引1对应的目标对话 target_dialog = dialogs[1] # 打印对话关键信息,确认是否为目标对话 print(f"对话标题: {target_dialog.title}") print(f"对话ID: {target_dialog.id}") # 获取该对话的全部历史消息(limit=None表示获取所有) messages = client.iter_messages(target_dialog, limit=None) # 遍历并打印消息内容 print("\n对话历史消息:") for msg in messages: # 区分文本消息和非文本消息(如图片、语音) if msg.text: sender_name = msg.sender.first_name if msg.sender else "未知发送者" print(f"[{msg.date}] {sender_name}: {msg.text}") else: sender_name = msg.sender.first_name if msg.sender else "未知发送者" print(f"[{msg.date}] {sender_name}: [非文本消息]")
关键说明
- 确认目标对话:如果不确定索引是否正确,可以先打印所有对话的索引、标题和ID,精准定位目标:
with TelegramClient('session_name', api_id, api_hash) as client: dialogs = client.get_dialogs() for idx, dialog in enumerate(dialogs): print(f"索引{idx}: 标题={dialog.title}, ID={dialog.id}")
- 消息获取逻辑:
client.iter_messages()返回迭代器,适合处理大量消息,避免一次性加载过多内容导致内存问题。 - 非文本消息处理:对话中可能包含图片、语音等非文本内容,需要通过判断
msg.text是否存在来区分。
内容的提问来源于stack exchange,提问作者Dinadina
相关产品推荐
相关产品推荐

