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

如何同时运行两个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()

原代码问题说明

  1. 原代码给两个客户端都调用了run_until_disconnected(),该方法为阻塞调用,第一个启动的客户端会占满线程,导致第二个客户端永远无法接收消息。
  2. 原second函数中return语句在client2.disconnect()之前,导致断开客户端的代码永远不会执行。
  3. 用sleep属于盲等逻辑,要么等待时间不足漏消息,要么等待时间过长降低执行效率,Future是事件触发,收到消息立刻唤醒,无多余等待。
  4. 不需要反复启停client2,启动后保持后台运行即可,通过临时注册/移除监听器控制接收消息的时机,性能更稳定。

内容的提问来源于stack exchange,提问作者Uomolepre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:39:03