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

Python+Telethon获取全部回复消息失败,仅能获取单条消息

解决Telethon获取消息所有回复的问题

你当前代码的核心问题是混淆了两种回复关系:

  • message.get_reply_message()只能拿到当前消息所回复的那条父消息(即这条消息“回复了谁”);
  • 而你需要的是所有回复当前消息的子消息(即“谁回复了这条消息”),这需要用到Telethon的批量消息获取接口。

修复方案

1. 新增获取所有回复的方法

添加一个方法,通过指定消息ID批量获取所有回复它的消息,同时支持递归获取回复的子回复:

def __get_all_replies_to_message(self, channel, target_msg_id, channel_link):
    replies = []
    # 批量获取所有直接回复target_msg_id的消息
    reply_messages = self.client.get_messages(channel, reply_to_msg_id=target_msg_id)
    
    for reply_msg in reply_messages:
        converter = Converter()
        converted_msg = converter.convert_message(reply_msg)
        sender = reply_msg.get_sender()
        reply_data = {
            "message": converted_msg,
            "date": reply_msg.date.strftime("%b %d %Y %H:%M:%S"),
            "username": sender.username if sender and sender.username else None,
            "first_name": sender.first_name if sender and sender.first_name else None,
            "last_name": sender.last_name if sender and sender.last_name else None,
            "link": f"{channel_link}/{reply_msg.id}" if reply_msg.id else None,
            # 递归获取这条回复的子回复(不需要可删除该行)
            "replies": self.__get_all_replies_to_message(channel, reply_msg.id, channel_link)
        }
        replies.append(reply_data)
    return replies

2. 修改__add_message_with_reply方法

调整该方法,同时保留原有的“父消息链”逻辑,新增“子回复列表”字段:

def __add_message_with_reply(self, message, channel_link, message_base):
    try:
        # 保留原有逻辑:获取当前消息回复的父消息链
        parent_message = self.__get_replied_message(message.get_reply_message(), channel_link)
        # 新增逻辑:获取所有回复当前消息的子回复
        all_replies = self.__get_all_replies_to_message(self.search_data["channel_name"], message.id, channel_link)
        
        # 字段改名更清晰,区分“回复了谁”和“谁回复了我”
        message_base["replied_to"] = parent_message
        message_base["replies"] = all_replies
        self.message_data.append(message_base)
        print(f"Add message with replies. Message id: {message_base['id']}")

    except Exception as e:
        print(f"Error adding message with replies: {e}. Message id: {message_base['id']}")

3. 优化原__get_replied_message字段名(可选)

为了和新增字段统一,建议把原方法返回的字段replied_message改为replied_to:

def __get_replied_message(self, message, channel_link):
    if not message:
        return None

    converter = Converter()
    converted_message = converter.convert_message(message)
    repl_mess_sender = message.get_sender()
    replied_message_date = message.date.strftime("%b %d %Y %H:%M:%S")

    replied_message_data = {
        "message": converted_message,
        "date": replied_message_date,
        "username": repl_mess_sender.username if repl_mess_sender and repl_mess_sender.username else None,
        "first_name": repl_mess_sender.first_name if repl_mess_sender and repl_mess_sender.first_name else None,
        "last_name": repl_mess_sender.last_name if repl_mess_sender and repl_mess_sender.last_name else None,
        "link": f"{channel_link}/{message.id}" if message.id else None,
        # 同步修改字段名
        "replied_to": self.__get_replied_message(message.get_reply_message(), channel_link),
    }

    return replied_message_data

关键说明

  • client.get_messages(channel, reply_to_msg_id=target_msg_id)是Telethon官方提供的批量获取某条消息所有回复的接口;
  • 递归调用__get_all_replies_to_message可以构建完整的回复树,若只需要直接回复,删除递归逻辑即可;
  • 字段名区分replied_to(当前消息回复的父消息)和replies(所有回复当前消息的子消息),避免逻辑混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:05:02