Python - 机器人、Asyncio、Javascript 和循环

Python - Bots, Asyncio, Javascript, and Loops

大家好,感谢您的宝贵时间。在前几天,我一直在进行我的一个小项目,为 LINE 创建一个在线聊天机器人。我理解的API 但是运行 有问题。我正在尝试让我的聊天机器人使用对用户文本的在线回复。为此,我尝试在 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) 之类的东西关闭循环,它将保持 运行ning 并且消息将永远不会被发送回客户端(程序不会继续执行它的 LINE 逻辑)。如果我关闭循环,则服务器 "shutdown" 有效。如果服务器关闭并为我必须通过 websocket 发送的每条消息重新打开,我现在面临的问题是让我的 JavaScript 不断尝试重新连接到服务器的每条消息。我已经尝试过了,但从未成功让 Javascript 继续尝试建立连接。我曾尝试使用 Javascript websocket readyState 属性,但这也没有用。我来这里只是因为我不知道如何进行以及进一步做什么。你们建议我如何继续,关闭循环或以某种方式让它打开但继续我的程序逻辑。如果是这样,您将如何在我已经循环的代码( LINE while true 语句)中实现它?对于这么长的问题,我真的很抱歉,但我完全被困住了。感谢您花时间阅读并帮助我的人们,我真的很感激。

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