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
相关产品推荐
相关产品推荐

