如何同时运行两个Telethon客户端实现双Telegram聊天消息协同
解决方案
核心思路
用asyncio.Future实现事件驱动的同步逻辑,无需轮询全局变量、无需固定时长sleep等待,第二个聊天收到消息后会自动唤醒第一个聊天的等待逻辑,完全符合你需要的触发流程。
完整实现代码
from telethon import TelegramClient, events import asyncio # 替换为你自己的参数 api_id = 123456 api_hash = "你的api_hash字符串" first_chat_id = yyyyyyy # 第一个监听的聊天ID second_chat_id = xxxxxxx # 第二个监听的聊天ID client = TelegramClient('session1', api_id, api_hash) client2 = TelegramClient('session2', api_id, api_hash) # 用于同步消息的Future对象 wait_future: asyncio.Future | None = None @client.on(events.NewMessage(chats=first_chat_id)) async def handle_first_msg(event): global wait_future # 收到第一个聊天消息,打印原始内容 first_msg = event.raw_text print(f"第一个聊天收到消息:{first_msg}") # 创建Future对象,用于等待第二个聊天的消息 wait_future = asyncio.get_running_loop().create_future() # 临时注册第二个聊天的消息监听器 @client2.on(events.NewMessage(chats=second_chat_id)) async def handle_second_msg(evt): # 收到第二个聊天的消息后,给Future赋值 if not wait_future.done(): wait_future.set_result(evt.raw_text) # 移除当前临时监听器,避免后续收到多余消息触发 client2.remove_event_handler(handle_second_msg) # 无阻塞等待第二个聊天的消息,收到后自动继续执行 second_msg = await wait_future print(f"获取到第二个聊天的消息:{second_msg}") # 这里可以写第一个聊天后续的业务逻辑 wait_future = None if __name__ == "__main__": # 启动两个客户端,共用同一个事件循环,不需要给client2单独跑run_until_disconnected client.start() client2.start() # 运行主事件循环 client.run_until_disconnected()
原代码问题说明
- 原代码给两个客户端都调用了
run_until_disconnected(),该方法为阻塞调用,第一个启动的客户端会占满线程,导致第二个客户端永远无法接收消息。 - 原
second函数中return语句在client2.disconnect()之前,导致断开客户端的代码永远不会执行。 - 用sleep属于盲等逻辑,要么等待时间不足漏消息,要么等待时间过长降低执行效率,Future是事件触发,收到消息立刻唤醒,无多余等待。
- 不需要反复启停client2,启动后保持后台运行即可,通过临时注册/移除监听器控制接收消息的时机,性能更稳定。
内容的提问来源于stack exchange,提问作者Uomolepre
相关产品推荐
相关产品推荐

