【问题标题】:How to have two client Telethon running concurrently如何让两个客户端 Telethon 同时运行
【发布时间】:2021-09-30 14:17:20
【问题描述】:

我有两个不同的 Telegram 聊天。当第一个收到消息时,它应该等待来自另一个聊天的消息。第二次聊天收到消息后,应该停止运行并重新开始第一次聊天。

示例:每次第一次聊天收到消息时都应该重复

  1. 第一次聊天:接收消息
  2. 第一次聊天:停止并等待第二次聊天
  3. 第二次聊天:开始
  4. 第二次聊天:只收到一条消息
  5. 第二次聊天:停止
  6. 第一次聊天:从第二次聊天中检索消息并继续。

这是我的代码。我正在使用 python 3.9、Telethon 和 asyncio

client = TelegramClient('1', api_id, api_hash)
client2 = TelegramClient('2', api_id, api_hash)

@client.on(events.NewMessage(chats=yyyyyyy))
async def my_event_handler(event):
    first_message = event.raw_text
    print(first_message)
    second_message = await second()
    print(second_message)
client.start()
client.run_until_disconnected()
@client2.on(events.NewMessage(chats=xxxxxxx))
async def second(event):
    print("I'm in")
    second_m= event.raw_text
    return second_m
    await client2.disconnect()
client2.start()
client2.run_until_disconnected()

它永远不会在控制台中打印“我在”。我想创建一个全局共享变量,但这样一来,Client1 永远不知道它什么时候更新。

更新

我尝试过只使用任务,之后我尝试过使用 asyncio.gather,但我再也没有回到第一个循环客户端。在控制台中总是只打印第二条消息 1 次(因为它停留在 client2 事件中)。我不会回到 client1 并且 continue 是循环。

client = TelegramClient('1', api_id, api_hash)
client2 = TelegramClient('2', api_id, api_hash)

@client.on(events.NewMessage(chats=yyyyyyy))
async def my_event_handler(event):
    first_message = event.raw_text
    print(first_message)
    second_message = await asyncio.gather(task)
    print(second_message)
client.start()
client.run_until_disconnected()
@client2.on(events.NewMessage(chats=xxxxxxx))
async def second(event):
    print("I'm in")
    second_m= event.raw_text
    return second_m
    await client2.disconnect()
client2.start()
client2.run_until_disconnected()

task = client2.loop.create_task(second(events.client2))

更新 2

我没有找到任何解决这个问题的方法。实际上,我只用 async.sleep() 函数和全局变量解决了它。 这样,我就改变了msg的值。 我想做的是避免 asyncio.sleep() 并在 CLIENT2 断开连接后找到一种“唤醒” CLIENT1 的方法,并继续执行其指令(在本例中:打印 msg),直到新事件到来。

msg = ""
@client.on(events.NewMessage(chats=xxxxxxxxx))
async def my_event_handler(event):
    first_message = event.raw_text
    print(first_message)
    global client2
    await client2.start()
    await asyncio.sleep(5) #NOW IS SLEEPING FOR 5 SECONDS

    print("Time ended")
    print(msg)


@client2.on(events.NewMessage(chats=xxxxxx))
async def second(event):
    print("I'm in")
    global msg
    msg = event.raw_text
    await client2.disconnect()

client.start()

【问题讨论】:

标签: python-3.x python-asyncio telethon


【解决方案1】:

client.run_until_disconnected运行 asyncio 事件循环直到客户端断开连接。只要循环正在运行,您就不需要使用此方法。这是满足您需要的最简单方法:

client = TelegramClient('1', api_id, api_hash)
client2 = TelegramClient('2', api_id, api_hash)

@client.on(events.NewMessage(chats=yyyyyyy))
async def my_event_handler(event):
    first_message = event.raw_text
    print(first_message)
client.start()

@client2.on(events.NewMessage(chats=xxxxxxx))
async def second(event):
    second_message = event.raw_text
    print(second_message)
client2.start()

client.loop.run_forever()

read the asyncio documentation 了解管理async 代码的不同方式,包括asyncio.gather 等概念,这也适用于此。

【讨论】:

  • 您好,我尝试使用您的代码,但它不起作用。我检查了 asyncio 文档,并尝试过执行任务但没有返回任何内容。所以我尝试了 asyncio.gather,但它没有用。最后一件事,你是如何制作 asyncio 和 asyncio.gather 点赞标签的?
  • 我需要您提供更多信息,以便我诊断“它不起作用”的原因。我已经编辑了代码以删除一些奇怪的部分(我只是从您的代码中复制了它们),这应该可以正常工作(也就是说,只要聊天存在并且客户可以访问)。
【解决方案2】:

嘿,我试图运行一个机器人和一个客户端,所以这对我来说很有效, 希望对你有用

import asyncio
client = TelegramClient('1', api_id, api_hash)
client2 = TelegramClient('2', api_id, api_hash)


loop = asyncio.get_event_loop()
client1.start()
client2.start()
loop.run_forever()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多