javascript - 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 语句)?我真的为这么长的问题道歉,但我完全被困住了。感谢您花时间阅读并帮助我的人,我真的很感激。
解决方案
经过几天的研究,我通过将循环分成两个 python 脚本并在它们之间进行通信来解决了这个问题。如果这里有人有类似的问题并希望得到更深入的解释,请随时问我。
推荐阅读
- javascript - 如何使用 Phaser 3 中的函数绘制精灵?
- ruby-on-rails - 我无法在 Ruby on Rails 的模板中使用 foreach 循环
- scala - 如何用actor模式组织代码
- java - 无法将 HSDIS 与 OpenJDK 11 一起使用
- python - 如何在分组后获得模式的计数?
- azure - 在单个 Azure 存储脚本中为各种环境传递多个参数
- c - 为什么这两种情况下的输出不同
- sed - 使用 SED 从结果中删除以 http 开头的域名
- android - 同时使用 ProGuard 和 R8
- wolfram-mathematica - 在 Wolfram Mathematica 中使用命令 Print 和 Manipulate 打印表达式