Python 异步函数循环 + return 参数

Python async function loop + return argument

我正在尝试在 Python 中创建一个小脚本来获取电报通知,然后根据消息采取行动。

我正在努力创建一个循环来监听 Telegram 和 return 我需要的已解析文本。

import re
import asyncio
from telethon import TelegramClient, events


def extract_trigger(new_message):
    return re.findall(r'$(.+?)\b', new_message)

#@client.on(events.NewMessage(chats=user_input_channel))
async def new_message_listener(event):
    #Get Message Text
    new_message = event
    print(extract_coin(str(new_message)))
    if str(new_message).find(message_filter) != -1 :
        trigger = extract_trigger(str(new_message))
        print('Found! ' + trigger[0])
        await client.disconnect()
        return trigger[0]


async def main():
    coro = await new_message_listener(events.NewMessage(chats=user_input_channel))
    trigger = coro
    print(trigger)


api_id = xxxxxx
api_hash = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
client = TelegramClient('session_read', api_id, api_hash)
user_input_channel = 'https://t.me/mychan'
message_filter = 'Trigger $'

client.start()

if __name__ ==  '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

我对 Python 很陌生,在使用异步功能时遇到了一些困难。此时,脚本循环并仅在主函数中打印“none”变量。

如果我使用这个小脚本,我就能收到消息,但它不会在侦听器上“循环”。

from telethon import TelegramClient, events


api_id = xxxxxxx
api_hash = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
client = TelegramClient('session_read', api_id, api_hash)

user_input_channel = 'https://t.me/mychan'

message_filter = 'Trigger $'

client.start()

@client.on(events.NewMessage(chats=user_input_channel))
async def newMessageListener(event):
    #Get Message Text
    newMessage = event.message.message
    if newMessage.find(message_filter) != -1 :
        print('Found! ' + newMessage)
    else:
        print('Not found!')


with client:
    client.run_until_disconnected()

有人可以帮我解决这个问题吗?

第二个片段是正确的,但它坚持要 运行 使用 run_until_disconnected 为您设置事件循环。不过,这只是一种方便 API,您可以自己 运行 事件循环。您的顶级函数可以启动机器人并等待事件回调为其提供所需的信息,例如使用 asyncio.Future:

from telethon import TelegramClient, events

api_id = xxxxxxx
api_hash = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'

async def get_msg_async():
    client = TelegramClient('session_read', api_id, api_hash)
    user_input_channel = 'https://t.me/mychan'
    message_filter = 'Trigger $'

    found = asyncio.get_event_loop().create_future()

    @client.on(events.NewMessage(chats=user_input_channel))
    async def newMessageListener(event):
        newMessage = event.message.message
        if newMessage.find(message_filter) != -1 :
            print('Found! ' + newMessage)
            found.set_result(newMessage)
        else:
            print('Not found!')

    # start the client
    await client.start()
    # allow the client to run in the background and wait for
    # newMessageListener to provide the message
    return await found

def get_msg():
    return asyncio.run(get_msg_async())

# now in your sync code you should be able to use:
msg = get_msg()