使用Telethon的异步事件侦听器中的python装饰器



每次向通道发送消息时,都会因为python装饰器而调用处理程序函数。我既想接收信息又想打印出来。这就是我想象中的程序应该是什么样子。

但它不起作用,因为事件没有传递给main中的处理程序函数。当@client装饰器控制消息并阻止我在其他函数中使用handler函数时,我如何异步地完成这项工作,并传递tokenData

from telethon import TelegramClient, events
client = TelegramClient(username, api_id, api_hash)
client.start()
channel = 'https://t.me/DEXTNewPairsBotBSC'

@client.on(events.NewMessage(chats=channel))
async def handler(event):
# tokenData = event
tokenData = event.message.message
msg.append(tokenData)
await asyncio.sleep(2)
return tokenData

async def dumpIt():
await asyncio.sleep(2)
return msg[0]
async def main():
task1 = asyncio.create_task(handler(event))
task2 = asyncio.create_task(dumpIt())
await asyncio.wait([task1,task2])

client.loop.run_until_complete(main())

使用asyncio.Queue:

import asyncio
from telethon import TelegramClient, events
client = ...
queue = asyncio.Queue()
@client.on(events.NewMessage(chats=channel))
async def handler(event):
queue.put_nowait(event.message.message)

async def dumpIt():
msg = await queue.get()
return msg
async def main():
await dumpIt()
client.loop.run_until_complete(main())

只要asyncio事件循环正在运行(当它在queue.get()中被"阻止"时(,Telethon就会收到更新。