返回顶部
首页 > 资讯 > 前端开发 > html >怎么实现可插拔的跨域聊天机器人
  • 445
分享到

怎么实现可插拔的跨域聊天机器人

2024-04-02 19:04:59 445人浏览 独家记忆
摘要

这篇文章主要讲解了“怎么实现可插拔的跨域聊天机器人”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现可插拔的跨域聊天机器人”吧!你将学到跨域技术常用方案

这篇文章主要讲解了“怎么实现可插拔的跨域聊天机器人”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现可插拔的跨域聊天机器人”吧!

你将学到

  • 跨域技术常用方案介绍

  • postMessage实现跨域通信

  • 如何实现聊天机器人

  • node搭建本地服务器来实现渲染页面和跨域

  • 回答语料库设计思路

效果预览怎么实现可插拔的跨域聊天机器人

正文

1. 跨域技术常用方案介绍

首先要强调的是跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的。我们常用的跨域技术主要有如下几种:

  • JSONP跨域

  • iframe+domain跨域

  • Nginx反向代理跨域

  • cors跨域

  • postMessage跨域

JSONP实现跨域请求的原理就是动态创建script标签,然后利用script的src 不受同源策略约束来跨域获取数据。jsONP  主要由回调函数和数据两部分组成。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON  数据。我们一般可以在全局定义一个回调函数,然后在script标签里传入回调函数即可:

window.handleData = function(data){     // ... } let script = document.createElement("script"); script.src = "https://xxxx.com/v0/search?q=xuxi&callback=handleData"; document.body.insertBefore(script, document.body.firstChild);

这样我们就能在回调函数handleData中拿到服务器接口返回的数据了。

虽然jsonp实现跨域方式很简单,但是只支持get请求,对传输的数据量有一定限制。cors跨域是目前我们用的比较多的本地调试方式,原理就是在服务端设置响应头header的Access-Control-Allow-Origin字段,这样浏览器检测到header中的Access-Control-Allow-Origin,这样就可以跨域了。

至于我们设置了cors之后在network中出现了两次请求的问题,其实涉及到cors跨域的请求预检,分为简单请求和非简单请求两种,这块知识可以单独抽离出一篇文章,感兴趣的可以自己学习了解一下。

2. postMessage实现跨域通信

  • window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议,端口号以及主机  (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage()  方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

本质上说postMessage()是基于消息事件机制来实现跨域通信,它隶属于消息窗体本身,比如window以及window内嵌的frame的window,基本使用形式如下:

someWindow.postMessage(message, targetOrigin, [transfer]);

参数介绍:

  • someWindow  窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames

  • message 将要发送到其他 window的数据。意味着你可以不受什么限制的将数据对象安全的传送给目标窗口而无需自己序列化

  • targetOrigin  通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示无限制)。不提供确切的目标将导致数据泄露等安全问题

  • transfer 是一串和message 同时传递的 Transferable 对象.  这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权

我们可以通过如下方式来监听message:

window.addEventListener("message", receiveMessage, false);  function receiveMessage(event){   let origin = event.origin || event.originalEvent.origin;    if (origin !== "Http://aaa:8080")     return;    // ...   console.log(event.data) }  // 派发消息的页面 winB.postMessage(_({text: '休息休息'}), origin)

我们的event里有如下几个核心的属性:

  • data 从其他 window 中传递过来的对象

  • origin 调用 postMessage 时消息发送方窗口的 origin . 这个字符串由 协议、“://“、域名、“ : 端口号”拼接而成

  • source 对发送消息的窗口对象的引用; 您可以使用此来在具有不同origin的两个窗口之间建立双向通信

3. 实现聊天机器人

在熟悉以上知识点之后,我们开始来写我们聊天机器人的demo。首先我们写两个html,分别为a.html和b.html,然后用node分别代理两个不同页面,设置不同端口:

// a.js //依赖一个http模块,相当于java中的import,与C#中的using var http = require('http'); var fs = require('fs'); var { resolve } = require('path');  //创建一个服务器对象 server = http.createServer(function (req, res) { //设置请求成功时响应头部的MIME为纯文本 res.writeHeader(200, {"Content-Type": "text/html"}); //向客户端输出字符 let data = fs.readFileSync(resolve(__dirname, './a.html')) res.end(data); }); //让服务器监听本地8000端口开始运行 server.listen(8000,'127.0.0.1'); console.log('http://127.0.0.1:8000')  // b.js // ... server.listen(8001,'127.0.0.1');

由上可知我们a.html代理在8000端口下,b.html代理在8001端口下,由浏览器的同源策略可知他们存在跨域问题。

跨域实现之后我们可以开始搭建页面层级了,我们这里将b页面以iframe的形式嵌入到a页面,具体结构如下:

怎么实现可插拔的跨域聊天机器人

这样我们就可以愉快的搭建postMessage体系了。首先我们在a页面通过发送按钮和输入框将消息发送给b页面,大致结构如下:

<body>     <div class="wrap">         <iframe src="http://127.0.0.1:8001" frameborder="0" id="b"></iframe>         <div class="control">             <input type="text" placeholder="请输入内容" id="ipt">             <span id="send">发送</span>         </div>     </div>     <script>         window.onload = function() {             let origin = 'http://127.0.0.1:8001';             let _ = (data) => JSON.stringify(data);             let winB = document.querySelector('#b').contentWindow;             let sendBtn = document.querySelector('#send');             sendBtn.addEventListener('click', (e) => {                 let text = document.querySelector('#ipt');                 winB.postMessage(_({text: text.value}), origin)                 text.value = '';             }, false)             winB.postMessage(_({text: ''}), origin)         }     </script> </body>

我们可以通过iframe的contentWindow来拿到b页面窗体的引用,然后在发送按钮的点击事件中触发postMessage将数据发送给B。B页面结构如下:

<body>     <div class="content">             <h5>Lab智能机器人</h5>             <div class="content-inner"></div>     </div>     <script>         // 语料库         const pool = [];         window.addEventListener("message", receiveMessage, false);         let content = document.querySelector('.content-inner');         let initContentH = content.scrollHeight;         let _ = (data) => JSON.stringify(data);         function createChat(type, mes) {             let dialog = document.createElement('div');             dialog.className = type === 0 ? 'dialog robot' : 'dialog user';             let content =  type === 0 ? `                 <span class="tx">${type === 0 ? 'lab' : 'user'}</span>                 <span class="mes">${mes}</span>             ` : `                 <span class="mes">${mes}</span>                 <span class="tx">${type === 0 ? 'lab' : 'user'}</span>              `;             dialog.innerHTML = content;             return dialog         }          function scrollTop(el, h) {             if(el.scrollHeight !== h) {                 el.scrollTop = h + 100;             }         }          function receiveMessage(event){             // 兼容其他浏览器             let origin = event.origin || event.originalEvent.origin;              if(origin === 'http://127.0.0.1:8000') {                 let data = JSON.parse(event.data);                 if(data && !data.text) {                     mes = { text: '你好,我是机器人Lab,请问有什么可以帮到您的吗?' };                     event.source.postMessage(_(mes), event.origin)                     content.appendChild(createChat(0, mes.text))                                      }else {                     content.appendChild(createChat(1, data.text))                     scrollTop(content, initContentH)                                          setTimeout(() => {                                                  content.appendChild(createChat(0, '正在解决'))                         scrollTop(content, initContentH)                     }, 2000);                 }              }         }     </script> </body>

 我们在b页面中去解析a页面的数据并做出相应的回答。这样,我们的基本聊天机器人就实现了。

4. 回答语料库设计思路

至于当我们在a页面发送了一个消息,b页面如何解析并回答,可以有如下几种思路:

  • 通过后端接口实现,即我们可以将a的数据作为参数传递给某个后端接口,让后端来实现返回需要的数据,这种在AI机器人中应用的很广泛。

  • 前端实现。前端定义回答的语料库,通过关键词匹配来拿到实现应答,这种一般用于普通的预设问题的回答。

5.实现可插拔式

可插拔式就是一个页面可以放在不同平台使用。这种我们可以设置origin白名单,只需要将b页面封装,其他系统可以使用类于a页面的方式,只提供发送信息的接口,这样我们就可以在不同平使用了。


感谢各位的阅读,以上就是“怎么实现可插拔的跨域聊天机器人”的内容了,经过本文的学习后,相信大家对怎么实现可插拔的跨域聊天机器人这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么实现可插拔的跨域聊天机器人

本文链接: https://lsjlt.com/news/84098.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么实现可插拔的跨域聊天机器人
    这篇文章主要讲解了“怎么实现可插拔的跨域聊天机器人”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现可插拔的跨域聊天机器人”吧!你将学到跨域技术常用方案...
    99+
    2024-04-02
  • Java怎么实现聊天机器人
    小编给大家分享一下Java怎么实现聊天机器人,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下Client代码:package GUISocke...
    99+
    2023-06-20
  • Java中怎么实现聊天机器人
    小编给大家分享一下Java中怎么实现聊天机器人,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下服务器的代码:package Day02;imp...
    99+
    2023-06-20
  • 怎么用Ajax实现聊天机器人
    本篇内容介绍了“怎么用Ajax实现聊天机器人”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 功能实现:点击发送按钮事件将用户输入的...
    99+
    2023-06-25
  • Django实现聊天机器人
    目录实现原理第一步 安装环境依赖第二步 配置Celery第三步 编写机器人聊天主页面第四步 编写后台websocket路由及处理方法第五步 编写Celery异步任务第六步 运行看效果...
    99+
    2024-04-02
  • Java实现聊天机器人
    本文实例为大家分享了Java实现聊天机器人的具体代码,供大家参考,具体内容如下 服务器的代码: package Day02; import java.io.*; import j...
    99+
    2024-04-02
  • Java怎么实现简单聊天机器人
    这篇文章主要为大家展示了“Java怎么实现简单聊天机器人”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java怎么实现简单聊天机器人”这篇文章吧。具体内容如下整个小案例:整合了Java sock...
    99+
    2023-06-20
  • python怎么实现语音聊天机器人
    要实现一个语音聊天机器人,你可以使用Python中的语音识别和语音合成库来实现。首先,你需要一个能够将语音转换为文字的语音识别库。其...
    99+
    2023-08-31
    python
  • Python中怎么实现一个聊天机器人
    Python中怎么实现一个聊天机器人,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 创建虚拟环境pipenv是一个轻松创建虚拟环境的python库。pip ins...
    99+
    2023-06-16
  • 怎么用Python实现聊天机器人项目
    本篇内容主要讲解“怎么用Python实现聊天机器人项目”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python实现聊天机器人项目”吧!先决条件为了实现聊天机器人,将使用一个深度学习库Ke...
    99+
    2023-06-16
  • Java实现简单聊天机器人
    本文实例为大家分享了Java实现简单聊天机器人的具体代码,供大家参考,具体内容如下 整个小案例:整合了Java socket编程、jdbc知识(ORM/DAO) 创建数据库和表,准备...
    99+
    2024-04-02
  • 案例:python实现聊天机器人
    import pickle data = {"你有女朋友吗":"没有","我们可以交往吗":"可以","今晚约不约":"约","去哪家餐厅":"麦当劳"} with open("db.pkl",'wb') as f: f.wr...
    99+
    2023-01-31
    机器人 案例 python
  • Java实现聊天机器人完善版
    本文实例为大家分享了Java实现聊天机器人完善版的具体代码,供大家参考,具体内容如下 Client代码: package GUISocket.chat.Client; impo...
    99+
    2024-04-02
  • jQuery如何实现Ajax聊天机器人
    小编给大家分享一下jQuery如何实现Ajax聊天机器人,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:'实现步骤:1.梳理案例的代码结构a.梳理页面的UI布局b.将业务代码抽离到chat.js中c.了解r...
    99+
    2023-06-25
  • 怎么使用python+Word2Vec实现中文聊天机器人
    本篇内容主要讲解“怎么使用python+Word2Vec实现中文聊天机器人”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用python+Word2Vec实现中文聊天机器人”吧! ...
    99+
    2023-07-05
  • Python 实现简单智能聊天机器人
    简要说明: 最近两天需要做一个python的小程序, 就是实现人与智能机器人(智能对话接口)的对话功能,目前刚刚测试了一下可以实现, 就是能够实现个人与机器的智能对话(语音交流)。 ...
    99+
    2024-04-02
  • 使用python实现机器人聊天功能
    利用python实现一个机器人聊天功能,具体方法如下:import aimlimport sysimport osdef get_module_dir(name):print("module", sys.modules[name])path...
    99+
    2024-04-02
  • 如何在PHP中实现聊天机器人
    随着人工智能技术的不断发展和应用,聊天机器人正在越来越广泛地应用于各种应用场景。现在,很多网站和社交平台都会使用聊天机器人来实现自动回复等功能,这大大减轻了工作人员的工作压力,提升了用户的体验感。在本文中,我们将探讨如何在PHP中实现一个简...
    99+
    2023-05-22
    自然语言处理 PHP聊天机器人 消息推送机制
  • Python NLP开发之实现聊天机器人
    目录1、简介2、代码测试2.1 open.drea.cc2.2 api.ruyi.ai2.3 route.showapi.com2.4 api.binstd.com2.5 api.j...
    99+
    2023-05-19
    Python实现聊天机器人 Python聊天机器人 Python聊天 Python 机器人
  • 基于Ajax的聊天机器人功能的实现
    🤖️ 哈喽!大家好呀。如果无聊就和机器人聊聊天吧 在初步进入Ajax学习 就忍不住给大家分享今天的劳动成果啦 先来看看效果图: 功能实现: ...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作