如何获取Telegram用户ID并在会话结束后移除以保障Telethon机器人并发正常运行
解决方案
你可以通过全局集合存储处于人工会话状态的用户ID,实现多用户隔离,互不影响,具体实现逻辑如下:
- 全局定义集合存储人工会话用户ID,查询/增删效率远高于普通数组
- 收到用户消息时先判断用户是否在人工会话集合中,在则跳过自动回复、转发给人工;不在则走正常自动回复逻辑
- 人工会话结束时从集合中移除对应用户ID即可恢复自动回复
完整代码示例
首先定义全局变量:
# 全局集合:存储正在人工服务中的用户ID in_human_support = set()
主消息处理逻辑:
@client.on(events.NewMessage(incoming=True)) async def _(event): # 仅处理私聊消息 if not event.is_private: return # 直接获取用户ID,无需额外调用get_entity(性能更高) user_id = event.from_id.user_id # 判断用户是否处于人工服务状态 if user_id in in_human_support: # 此处补充你的消息转发逻辑:把用户消息转发给人工客服账号/客服群 # await client.forward_messages(客服账号ID, event.message) return # 跳过后续自动回复逻辑 # 以下为正常自动回复逻辑 msg_text = event.message.message.strip() if msg_text == '1': await event.reply('XXXXXXXXXXXXXXXXXXXX') elif msg_text == '联系人工客服': # 用户触发人工服务,ID加入集合 in_human_support.add(user_id) await event.reply('已为您转接人工客服,请稍候~') # 其他自动回复规则可自行补充
人工会话结束移除用户ID的逻辑:
你可以给客服账号配置结束会话指令,示例如下:
# 仅允许你的客服账号调用该指令,把下面的ID换成你实际的客服账号ID @client.on(events.NewMessage(from_users=['你的客服账号ID'])) async def end_human_session(event): cmd = event.message.message.strip() if cmd.startswith('/end'): try: # 指令格式:/end 待结束会话的用户ID target_user_id = int(cmd.split()[1]) if target_user_id in in_human_support: in_human_support.remove(target_user_id) await event.reply(f'已结束用户{target_user_id}的人工会话,用户将恢复自动响应') # 可选:给用户发会话结束通知 await client.send_message(target_user_id, '本次人工服务已结束,后续将为您自动回复') except (IndexError, ValueError): await event.reply('指令格式错误,正确格式为:/end 对应用户ID')
注意事项
- 上述示例用的是内存级集合,机器人重启后数据会清空,需要持久化的话可以替换为redis、sqlite等存储,启动时读取正在人工服务的用户ID写入集合即可
- 若机器人多进程部署,不要用内存集合,换成共享存储(如redis)即可实现多进程状态同步
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

