首页 > 其他分享 >使用websocket开发智能聊天机器人

使用websocket开发智能聊天机器人

时间:2023-11-03 10:38:12浏览次数:46  
标签:websocket 机器人 WebSocket 聊天 chat sanic msg import ws

前面我们学习了异步web框架(sanic)和http异步调用库httpx,今天我们学习websocket技术。

websocket简介

我们知道HTTP协议是:请求->响应,如果没有响应就一直等着,直到超时;但是有时候后台的处理需要很长时间才能给到结果,比如30分钟,那HTTP的请求不可能等这么久,所以,可以通过 Ajax 轮询来解决。那就是每间隔一段时间就请求一次。

使用websocket开发智能聊天机器人_HTTP

这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

使用websocket开发智能聊天机器人_json_02

浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。

好了,WebSocket就是为了解决这个问题的,感兴趣去看其他资料!

智能聊天机器人

我一开始只是为了学习WebSocket找个例子,不少例子使用了聊天功能。我稍加改进就变成了智能聊天功能了。

使用websocket开发智能聊天机器人_HTTP_03

通过异步sanic异步框架实现Web功能。官方文档里面给个WebSocket使用的例子。

https://sanic.readthedocs.io/en/latest/sanic/websocket.html

snaic部分核心代码如下:

import sanic
import httpx
from sanic import Sanic
from sanic.response import json
from sanic.websocket import WebSocketProtocol
from sanic.exceptions import NotFound
from sanic.response import html
from jinja2 import Environment, PackageLoader


env = Environment(loader=PackageLoader('app', 'templates'))

app = Sanic(__name__)


@app.route('/')
async def index(request):
    """
    聊天页面
    """
    template = env.get_template('index.html')
    html_content = template.render(title='聊天机器人')
    return html(html_content)


@app.websocket('/chat')
async def chat(request, ws):
    """
    处理聊天信息,并返回消息
    """
    while True:
        user_msg = await ws.recv()
        print('Received: ' + user_msg)
        intelligence_data = {"key": "free", "appid": 0, "msg": user_msg}
        r = httpx.get("http://api.qingyunke.com/api.php", params=intelligence_data)
        chat_msg = r.json()["content"]
        print('Sending: ' + chat_msg)
        await ws.send(chat_msg)


if __name__ == "__main__":
    app.error_handler.add(
        NotFound,
        lambda r, e: sanic.response.empty(status=404)
    )
    app.run(host="192.168.0.7", port=8000, protocol=WebSocketProtocol, debug=True)
  • index() 函数,返回聊天页面。这里用到了jinja2 模板渲染库。
  • chat() 函数,通过webSocket实现消息的接收、处理和返回。

智能聊天是怎么做到的,这里要感谢 青云客网络,他们提供了免费的接口。(我当时也只是抱着试试看的态度,没想到,duang~! )

user_msg = "你好!"
intelligence_data = {"key": "free", "appid": 0, "msg": user_msg}
r = httpx.get("http://api.qingyunke.com/api.php", params=intelligence_data)
chat_msg = r.json()["content"]
print(chat_msg)

是不是超简单。

再来看前端代码,主要部分:

<div class="container theme-showcase" role="main" style="margin-top: 80px;">
      <div id="contents" style="height: 600px; background-color:#eee;"></div>
      <div>
          <textarea class="form-control" id="msg"></textarea>
          <button class="btn btn-lg btn-info" onclick="sendMsg()" style="float: right;">发送</button>
      </div>
  </div>

  <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
  <script type="text/javascript">

          var ws = new WebSocket("ws://192.168.0.7:8000/chat");
          ws.onmessage = function(e) {
              $("#contents").append('<div class="alert alert-info" role="alert" style="float: left;">' + "机器人: " + e.data + "</div><br><br><br><br>");
          }
          function sendMsg() {
              var msg = $("#msg").val();
              $("#contents").append('<div class="alert alert-info" role="alert" style="float:right">' + msg + "</div><br><br><br><br>");
              ws.send(msg);
              $("#msg").val("");
          }

  </script>

这里使用到了 bootstrap 前端框架,主要 调用部分在:

var Socket = new WebSocket(url, [protocol] );
  • Socket.send(msg): 使用连接发送数据。
  • Socket.onmessage: 客户端接收服务端数据时触发。

我知道,你迫不及待想要完整的代码了:

https://github.com/defnngj/learning-API-test

标签:websocket,机器人,WebSocket,聊天,chat,sanic,msg,import,ws
From: https://blog.51cto.com/fnngj/8162015

相关文章

  • 使用 Appilot 部署 Llama2,会聊天就行!
    Walrus是一款基于平台工程理念的应用管理平台,致力于解决应用交付领域的深切痛点。借助Walrus将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设施的复杂度,为研发和运维团队提供易用、一致的应用管理和部署体验,进而构建无缝协作的软件交......
  • 【专题】2023中国工业机器人应用与趋势研究报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34132自18世纪中期工业革命以来,人类进入工业社会。在历次工业革命中,人类通过发明创造和管理革新,改进生产方式、降低成本、提高效率,随之而来的是生活、物质、文化、教育等各方面的变化,人际关系和社会结构也得以重塑。如今,数字化技术的发展为工业注入......
  • 微信聚合聊天系统的便捷功能:自动发圈,跟圈
    很多商家和自媒体、运营人都在发圈做私域运营,所以现在发圈的频率也会比以往的多一些,但事情一多就会担心今天的朋友圈忘记发、漏发或者错过发圈的时间导致错过私域里的好友、客户会错过活动时间。其实这些都是可以不用担心,在微信聚合聊天系统里可以提前设置朋友圈,定时发送,轻松一键多......
  • 【专题】2023年中国仿生机器人产业全景报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34144原文出处:拓端数据部落公众号仿生机器人作为一类结合了仿生学原理的机器人,具备自主决策和规划行动的能力,正逐渐进入大众视野。它们的核心技术要素包括感知与认知技术、运动与控制技术、人机交互技术和自主决策技术。阅读原文,获取专题报告合集......
  • 得物自研客服IM中收发聊天消息背后的技术逻辑和思考实现
    本文由得物技术WWQ分享,原题“客服发送一条消息背后的技术和思”,本文有修订和改动。1、引言在企业IM客服场景中,客服发送一条消息的背后,需要考虑网络通信、前端展示、后端存储以及安全性等多个方面的技术支持。单从前端层面来说,就需要考虑到消息的显示、状态更新、稳定传输以及......
  • Golang语言快速上手到综合实战-高并发聊天室、豆瓣电影爬虫
    Golang语言快速上手到综合实战-高并发聊天室、豆瓣电影爬虫我们公司需要快速迭代一款产品,当时,我们团队的后端框架是springmvc,该框架结构清晰,上手快,但是由于我们的产品迭代速度快,底层数据库操作接口变动频繁,导致service层工作量巨大,不胜其烦。另外,随着项目的成长,代码......
  • 【Python微信机器人】第三篇:使用ctypes调用进程函数和读取内存结构体
    目录修整目前的系列目录(后面会根据实际情况变动):在windows11上编译python将python注入到其他进程并运行注入Python并使用ctypes主动调用进程内的函数和读取内存结构体使用汇编引擎调用进程内的任意函数利用beaengine反汇编引擎的c接口写一个pyd库,用于实现inlinehook利用......
  • 喜讯!东舟“实车测试机器人”发明专利通过国家知识产权局正式授权,创新成果获专利保护
    近日,东舟技术申报的《用于实车人机交互功能测试中的执行机构、PC上位机及测试方法》知识成果获得国家知识产权局授予发明专利!实车测试机器人是东舟技术在技术创新和研发方面取得的重要突破,该专利技术的应用将有效助力主机厂智能座舱实车测试工作效能提升。这项专利的授权不仅......
  • 【ROS2机器人入门到实战】通过JointStates控制RVIZ2关节
    8.4控制移动机器人轮子运动写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn我是小鱼,本节我们来看看如何手动的发送joint_s......
  • 【ROS2机器人入门到实战】动手创建一个移动机器人
    8.3动手创建一个移动机器人写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn大家好,我是小鱼,本节课我们来一起动手创建一个两......