首页 > 解决方案 > Python - 机器人、Asyncio、Javascript 和循环

问题描述

大家好,感谢您的宝贵时间。在过去的几天里,我一直在进行我的一个小项目,为 LINE 创建一个在线聊天机器人。我了解 API,但遇到了问题。我正在尝试让我的 chabot 使用对用户文本的在线回复。为此,我尝试在 python 和 JavaScript 之间使用 websocket。我使用的 API 在 python 中,因此 websocket 也必须用 Python 编写。我选择了 asyncio websockets。简而言之,我正在尝试从 Line 上的用户输入中获取响应-> 通过 websocket 将该响应发送到浏览器控制台中的我的 javascript --> javascript 将继续执行其逻辑并将响应发送回服务器--> 程序将继续执行。我的问题是 Websocket 编程和我的 Line 编程都使用循环。

https://github.com/fadhiilrachman/line-py/blob/master/examples/groupbot.py

正如您在代码末尾看到的那样,有一个 while 语句会一遍又一遍地跟踪每条消息的 READ_MESSAGE 函数。您可以忽略 NOTIFIED_LEAVE 之一。所以基本上我的代码在继续它自己的逻辑的同时执行如下操作:

else:
#ExternalBot code
ExtText = text[6:]

我现在希望通过我的 websocket 将这个 ExtText 发送到我的 javascript,这将从浏览器获取响应并将其发送回来。javascript会做这样的事情:

exampleSocket = new WebSocket("ws://192.168.1.9:8765/") 
exampleSocket.onmessage = function(e){
var server_message = e.data;
console.log(server_message);
(logic)
exampleSocket.send(response);

现在这是问题开始的地方,因为我根本不知道如何进行。python asyncio Websockets 需要一个循环来运行,如下所示:

async def Send(websocket, path):
    await websocket.send(ExtText)
    await Receive(websocket, path)

async def Receive(websocket, path):
    resposne = await websocket.recv()
    if response is None:
        await Recieve(websocket, path)
    else:
        print (Response)

    start_server = websockets.serve(Send,'192.168.1.9','8765')
    loop = asyncio.get_event_loop()
    loop.run_untill_complete(start_server)
    loop.run_forever()

   (continue to do a line.send() the response back to the client on Line.)

这是我目前拥有的代码。现在的问题是,如果我从不使用 loop.call_soon_threadsafe(loop.stop) 之类的东西关闭循环,它将继续运行,反过来消息将永远不会被发送回客户端(程序将不会继续它的 LINE逻辑)。如果我关闭循环,则服务器实际上是“关闭”。如果服务器关闭并为我必须通过 websocket 发送的每条消息重新打开,我现在面临的问题是让我的 JavaScript 不断尝试重新连接到服务器每条消息。我已经尝试过了,但从未成功让 Javascript 继续尝试建立连接。我曾尝试使用 Javascript websocket readyState 属性,但这也没有奏效。我来这里只是因为我不知道如何进行以及进一步做什么。你们建议我如何继续,关闭循环或以某种方式使其保持打开状态但继续我的程序逻辑。如果是这样,您将如何将其实现到我已经循环的代码中(LINE while true 语句)?我真的为这么长的问题道歉,但我完全被困住了。感谢您花时间阅读并帮助我的人,我真的很感激。

标签: javascriptpythonwebsocketbotspython-asyncio

解决方案


经过几天的研究,我通过将循环分成两个 python 脚本并在它们之间进行通信来解决了这个问题。如果这里有人有类似的问题并希望得到更深入的解释,请随时问我。


推荐阅读