Telethon:使用 telethon 以参数启动时从机器人获得响应

Telethon: Get response from bot when started with parameter using telethon

我想要实现的目标是发送一个命令(例如 /price)并从机器人那里获得响应(价格统计),然后退出以节省资源。该消息只能按需接收,因为机器人仅在发送命令时响应。

到目前为止,我只通过发送命令成功完成了一半,但收到响应一直是一个令人头疼的问题。 到目前为止,这是我的尝试,我愿意接受任何建议,请就实现接收部分的最简单方法提出建议。非常感谢!

with TelegramClient('Anon', tg_API_ID, tg_API_Hash) as client:
    client(functions.messages.StartBotRequest(bot = '@Bot', peer = '@myHandle', start_param = '/price'))
    client.start()
    session = os.environ.get('TG_SESSION', 'printer')
    @client.on(events.NewMessage(chats = '@Bot'))
    async def my_event_handler(event):
        text = event.raw_text
        print(text) 
    client.loop.run_until_complete(main())

如果有帮助,这里有一个很好的资源:https://tl.telethon.dev/methods/messages/index.html

在 Telethon V1 中,with client 也调用了 start,因此再次添加它是多余的。

在启动机器人之前定义处理程序可能是个好主意,以防消息“中间”到达。

您可以从处理程序调用 disconnect 来断开客户端连接,并且 run_until_disconnected 的行为类似于 loop.run_until_complete,但它运行事件循环直到断开连接发生。

假设导入了 telethon.sync,以下应该有效:

text_found = None

with TelegramClient('Anon', tg_API_ID, tg_API_Hash) as client:
    @client.on(events.NewMessage(chats = '@Bot'))
    async def my_event_handler(event):
        global text_found
        text_found = event.raw_text
        await client.disconnect()
    client(functions.messages.StartBotRequest(bot = '@Bot', peer = '@myHandle', start_param = '/price'))
    client.run_until_disconnected()

print(text_found)

如果 telethon.sync 不是 导入的,您必须使用 asyncioasyncawait:

import asyncio

async def main():
    text_found = None

    async with TelegramClient('Anon', tg_API_ID, tg_API_Hash) as client:
        @client.on(events.NewMessage(chats = '@Bot'))
        async def my_event_handler(event):
            nonlocal text_found
            text_found = event.raw_text
            await client.disconnect()
        await client(functions.messages.StartBotRequest(bot = '@Bot', peer = '@myHandle', start_param = '/price'))
        await client.run_until_disconnected()

    return text_found

text_found = asyncio.run(main())
print(text_found)