Telethon机器人开发:如何将用户输入赋值给变量messaggio?
Telethon 回调事件后捕获用户输入实现方案
你原有写法的核心问题是:不应该在CallbackQuery事件处理函数内部嵌套注册NewMessage事件,每次触发b"9"回调时都会重复注册消息监听,后续会出现重复响应的异常。
推荐使用 Telethon 内置的Conversation(对话)功能实现等待用户输入的需求,实现代码如下:
from telethon import events # 单用户场景可直接用全局变量存储,多用户场景建议替换为以用户ID为key的字典 messaggio = "" @bot.on(events.CallbackQuery) async def handler(event): if event.data == b"3": await event.respond("x", buttons=x) if event.data == b"7": await event.respond("x", buttons=x) if event.data == b"9": await event.respond("insert x") # 开启和当前触发回调用户的对话,设置超时时间为60秒,无超时需求可填None async with bot.conversation(event.sender_id, timeout=60) as conv: # 阻塞等待用户发送新消息 user_reply = await conv.get_response() # 为变量赋值 global messaggio messaggio = user_reply.text # 可选:给用户发送接收成功的反馈 await conv.send_message(f"已录入内容:{messaggio}")
注意事项
- 多用户同时使用的场景下,不要用全局单变量存储输入内容,建议用字典做用户级隔离,示例:
# 初始化存储容器 user_input_map = {} # 赋值逻辑修改为 user_input_map[event.sender_id] = user_reply.text
- 若不需要使用
Conversation组件,也可以通过全局状态标记实现:给触发了b"9回调的用户标记「等待输入」状态,在全局注册的NewMessage事件中判断用户状态,存在等待标记则捕获消息内容赋值、再清除标记即可。
内容的提问来源于stack exchange,提问作者kekkoilmedikit
相关产品推荐
相关产品推荐

