如何通过Telegram API获取频道帖子讨论区消息?(Python Telethon实现)
用Telethon获取频道帖子讨论区消息文本
要获取机器人已加入频道中帖子讨论区的消息,核心是抓取帖子的回复线程,以下是具体实现方案:
方法1:批量获取已有帖子的讨论区消息
先获取频道内的主帖子,再针对每个帖子拉取其所有回复消息:
from telethon import TelegramClient import asyncio # 替换为你的API信息和机器人Token API_ID = 你的API_ID API_HASH = "你的API_HASH" BOT_TOKEN = "你的机器人Token" TARGET_CHANNEL = "目标频道的用户名/ID" async def fetch_discussion_messages(): async with TelegramClient("bot_session", API_ID, API_HASH).start(bot_token=BOT_TOKEN) as client: # 获取目标频道实体 channel = await client.get_entity(TARGET_CHANNEL) # 拉取频道内最新的10条主帖子(可调整limit参数) main_posts = await client.get_messages(channel, limit=10) for post in main_posts: # 仅处理有回复的帖子 if post.replies and post.replies.replies > 0: print(f"=== 帖子ID {post.id} 的讨论区 ===") # 获取该帖子的所有回复消息 replies = await client.get_message_replies(channel, post.id) for reply in replies: # 输出有文本内容的回复 if reply.text: print(f"- {reply.text}") if __name__ == "__main__": asyncio.run(fetch_discussion_messages())
方法2:实时监听新的讨论区消息
如果需要实时捕获新发布的讨论消息,可以通过监听NewMessage事件,判断消息是否是对主帖子的回复:
from telethon import TelegramClient, events import asyncio API_ID = 你的API_ID API_HASH = "你的API_HASH" BOT_TOKEN = "你的机器人Token" TARGET_CHANNEL = "目标频道的用户名/ID" async def listen_discussion(): client = TelegramClient("bot_session", API_ID, API_HASH) await client.start(bot_token=BOT_TOKEN) @client.on(events.NewMessage(chats=TARGET_CHANNEL)) async def handle_reply(event): # 检查当前消息是否是对某条主帖子的回复 if event.message.reply_to_msg_id: # 可选:获取被回复的主帖子信息 original_post = await event.get_reply_message() print(f"帖子ID {original_post.id} 新增讨论消息:{event.message.text}") await client.run_until_disconnected() if __name__ == "__main__": asyncio.run(listen_discussion())
注意事项
- 确保机器人已被添加到目标频道,且拥有读取消息的权限(私密频道需手动邀请并确认权限)
- 部分频道可能限制机器人访问讨论区,需确认频道设置是否允许机器人查看回复
- 若遇到权限问题,可尝试将机器人提升为频道管理员(仅必要时)
内容的提问来源于stack exchange,提问作者cmdFormatC
相关产品推荐
相关产品推荐

