【发布时间】:2021-09-30 14:17:20
【问题描述】:
我有两个不同的 Telegram 聊天。当第一个收到消息时,它应该等待来自另一个聊天的消息。第二次聊天收到消息后,应该停止运行并重新开始第一次聊天。
示例:每次第一次聊天收到消息时都应该重复
- 第一次聊天:接收消息
- 第一次聊天:停止并等待第二次聊天
- 第二次聊天:开始
- 第二次聊天:只收到一条消息
- 第二次聊天:停止
- 第一次聊天:从第二次聊天中检索消息并继续。
这是我的代码。我正在使用 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()
【问题讨论】:
-
已经回答了! stackoverflow.com/q/69393821
-
@AliMoradi 你能把正确的链接和答案放在一起吗?
标签: python-3.x python-asyncio telethon