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

如何在Telethon中捕获点击内联按钮后的更新或新消息?

如何在Telethon中捕获点击内联按钮后的更新或新消息?

我之前也碰到过一模一样的问题!你现在的核心问题在于:点击分页内联按钮后,第三方Bot是直接编辑原消息的内容,而不是发送一条全新的消息,但你用的conv.get_response()只会等待Bot发送的新消息,所以自然拿不到更新后的分页内容。

接下来我给你调整下代码逻辑,帮你正确捕获到编辑后的消息:

关键思路

  1. 拿到初始消息后,先提取当前页的内容
  2. 点击分页按钮后,不要调用conv.get_response(),而是监听这条消息的编辑事件
  3. 从编辑事件中获取更新后的消息文本,再循环处理直到最后一页

修改后的代码示例

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

几个要注意的细节

  1. 不要重复点击按钮:你原来的代码里写了两次await msg.click(2),这会导致连续跳两页,容易出错,只保留一次就好。
  2. 精准监听编辑事件:指定chats=msg.chat.id, ids=msg.id可以避免捕获到其他无关的消息编辑,保证只拿到当前分页消息的更新。
  3. 分页判断逻辑:通过中间按钮的1/7文本提取当前页和总页数,能准确判断什么时候停止循环,不用靠超时来终止。
  4. 更新msg变量:每次捕获到编辑事件后,把msg替换成最新的消息对象,下一次循环就能直接处理最新的按钮和内容。

如果遇到某些特殊Bot是发送新消息而非编辑原消息的情况,你可以用asyncio.wait同时监听MessageEdited和NewMessage事件,哪个先触发就处理对应的内容。

备注:内容来源于stack exchange,提问作者whitek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:48:07