
使用 Telethon 与 Telegram 机器人交互时,点击 inline 按钮(如翻页箭头)不会自动触发新消息事件;需主动拉取被编辑后的消息或监听 MessageEdited 事件,才能获取更新后的文本内容。
使用 telethon 与 telegram 机器人交互时,点击 inline 按钮(如翻页箭头)不会自动触发新消息事件;需主动拉取被编辑后的消息或监听 `messageedited` 事件,才能获取更新后的文本内容。
在 Telethon 中,调用 msg.click() 或 GetBotCallbackAnswerRequest 仅向 Bot 发送回调请求,并不阻塞等待响应,也不会自动刷新当前 Message 对象的内容。原始消息对象(msg)仍保留点击前的状态,其 .text、.reply_markup 等字段不会自动更新——这是初学者最常见的误区。
✅ 正确做法一:轮询获取最新消息(简洁可靠)
每次点击后,显式调用 client.get_messages() 重新拉取该消息 ID 的最新版本:
all_bot_replies = []
# 获取初始消息
msg = await conv.get_response(timeout=5)
all_bot_replies.append(msg.text)
print("Page 1:", msg.text)
# 循环点击右箭头(假设按钮索引为 2),并刷新消息
while True:
# 检查是否存在右箭头按钮(例如 "➡" 或 "2/7" 后还有下一页)
if not msg.reply_markup or not msg.reply_markup.rows:
break
row = msg.reply_markup.rows[0]
if len(row.buttons) <blockquote>
<p>⚠️ 注意事项:</p>
<ul>
<li>
<code>client.get_messages(..., ids=msg.id)</code> 是同步刷新消息的最直接方式,适用于大多数 Bot 场景;</li>
<li>不要依赖 <code>conv.get_response()</code> 多次调用——它只响应你<strong>主动发送的消息</strong>的回复,而非 Bot 对 callback 的异步编辑;</li>
<li>添加 <code>await asyncio.sleep(1–1.5)</code> 可避免因 Bot 响应延迟导致拉取到旧状态(部分 Bot 编辑有轻微延迟);</li>
<li>若 Bot 使用 <code>answer()</code> 并附带 <code>alert=True</code>,则不会触发 <code>MessageEdited</code>,此时轮询是唯一可靠方式。</li>
</ul>
</blockquote><h3>✅ 正确做法二:监听 <code>events.MessageEdited</code>(高效进阶)</h3><p>若需更高实时性或处理大量翻页,可脱离 <code>Conversation</code>,改用全局事件监听:</p><pre class="brush:php;toolbar:false;">from telethon import events
@client.on(events.MessageEdited(chats=bot_username)) # 替换为 bot 的 username 或 ID
async def handle_edit(event):
# 过滤:仅处理目标消息(可加 msg.id / chat_id 校验)
if event.id != target_msg_id or event.chat_id != target_chat_id:
return
print("✅ Message edited:", event.text)
all_bot_replies.append(event.text)
# 触发点击后,无需轮询,事件自动捕获更新
await msg.click(2)
# 后续所有编辑将由 handler 处理(注意:需保持 client 运行)? 提示:此方式需提前注册 handler,并确保
target_msg_id和target_chat_id准确;适合长期监控场景,但调试复杂度略高。
✅ 总结
- ❌ 错误认知:
msg.click()会自动更新msg.text或触发get_response()返回新内容; - ✅ 正确路径:要么主动拉取(
get_messages(ids=msg.id)),要么监听编辑事件(MessageEdited); - ?️ 生产建议:优先使用轮询方案(稳定、易调试、兼容所有 Bot 行为),配合按钮文本解析实现智能翻页终止逻辑;
- ? 调试技巧:打印
msg.date和msg.edit_date可确认是否真被编辑(edit_date非空即表示 Bot 已更新该消息)。
通过以上任一方式,你就能完整捕获翻页过程中每一页的文本内容,真正实现 Telegram inline 导航的自动化闭环。










