You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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}: [非文本消息]")

关键说明

  1. 确认目标对话:如果不确定索引是否正确,可以先打印所有对话的索引、标题和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}")
  1. 消息获取逻辑:client.iter_messages()返回迭代器,适合处理大量消息,避免一次性加载过多内容导致内存问题。
  2. 非文本消息处理:对话中可能包含图片、语音等非文本内容,需要通过判断msg.text是否存在来区分。

内容的提问来源于stack exchange,提问作者Dinadina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:35:24