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()
我正在尝试在 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()