如何在Telethon中捕获点击内联按钮后的更新或新消息?
如何在Telethon中捕获点击内联按钮后的更新或新消息?
我之前也碰到过一模一样的问题!你现在的核心问题在于:点击分页内联按钮后,第三方Bot是直接编辑原消息的内容,而不是发送一条全新的消息,但你用的conv.get_response()只会等待Bot发送的新消息,所以自然拿不到更新后的分页内容。
接下来我给你调整下代码逻辑,帮你正确捕获到编辑后的消息:
关键思路
- 拿到初始消息后,先提取当前页的内容
- 点击分页按钮后,不要调用
conv.get_response(),而是监听这条消息的编辑事件 - 从编辑事件中获取更新后的消息文本,再循环处理直到最后一页
修改后的代码示例
while True: try: # 拿到初始消息(或者第一次的分页消息) msg = await conv.get_response(timeout=3) all_bot_replies.append(msg.text) print(f"当前页内容: {msg.text}") # 检查是否有分页按钮 if not msg.reply_markup: break # 没有按钮就结束 # 解析分页按钮(对应你的按钮结构:[⬅, 1/7, ➡]) has_next_page = False next_btn = None current_page_info = None for row in msg.reply_markup.rows: if len(row.buttons) >=3: current_page_info = row.buttons[1].text # 比如"1/7" next_btn = row.buttons[2] # 右边的➡按钮 has_next_page = True break if not has_next_page: break # 没有下一页按钮,结束循环 # 提取当前页和总页数,判断是否还有下一页 current_page = int(current_page_info.split('/')[0]) total_pages = int(current_page_info.split('/')[1]) if current_page >= total_pages: break # 点击下一页按钮 await msg.click(2) # 这里的2是按钮在该行的索引(从0开始,第三个按钮索引是2) # 等待这条消息被编辑的事件,精准监听当前聊天+当前消息ID edit_event = await conv.wait_event( events.MessageEdited(chats=msg.chat.id, ids=msg.id) ) # 从事件中获取更新后的消息对象,替换原msg用于下一次循环 msg = edit_event.message except asyncio.TimeoutError: print("超时,没有更多消息/更新了") break # 最后存储所有抓取到的内容 results[email] = all_bot_replies
几个要注意的细节
- 不要重复点击按钮:你原来的代码里写了两次
await msg.click(2),这会导致连续跳两页,容易出错,只保留一次就好。 - 精准监听编辑事件:指定
chats=msg.chat.id, ids=msg.id可以避免捕获到其他无关的消息编辑,保证只拿到当前分页消息的更新。 - 分页判断逻辑:通过中间按钮的
1/7文本提取当前页和总页数,能准确判断什么时候停止循环,不用靠超时来终止。 - 更新msg变量:每次捕获到编辑事件后,把
msg替换成最新的消息对象,下一次循环就能直接处理最新的按钮和内容。
如果遇到某些特殊Bot是发送新消息而非编辑原消息的情况,你可以用asyncio.wait同时监听MessageEdited和NewMessage事件,哪个先触发就处理对应的内容。
备注:内容来源于stack exchange,提问作者whitek
相关产品推荐
相关产品推荐

