每次向通道发送消息时,都会因为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就会收到更新。