精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

可插拔的跨域聊天機器人實現方案復盤(postMessage版)

開發 前端
由于筆者之前的項目中接觸過聊天機器人的項目,主要實現機器人客服模塊,以及支持跨多平臺使用的目的,所以特地總結一下,希望有所收獲。

[[373659]]

由于筆者之前的項目中接觸過聊天機器人的項目,主要實現機器人客服模塊,以及支持跨多平臺使用的目的,所以特地總結一下,希望有所收獲。

你將學到

  • 跨域技術常用方案介紹
  • postMessage實現跨域通信
  • 如何實現聊天機器人
  • node搭建本地服務器來實現渲染頁面和跨域
  • 回答語料庫設計思路

效果預覽


正文

1. 跨域技術常用方案介紹

首先要強調的是跨域的安全限制都是對瀏覽器端來說的,服務器端是不存在跨域安全限制的。我們常用的跨域技術主要有如下幾種:

  • JSONP跨域
  • iframe+domain跨域
  • nginx反向代理跨域
  • cors跨域
  • postMessage跨域

JSONP實現跨域請求的原理就是動態創建script標簽,然后利用script的src 不受同源策略約束來跨域獲取數據。JSONP 主要由回調函數和數據兩部分組成。回調函數的名字一般是在請求中指定的。而數據就是傳入回調函數中的 JSON 數據。我們一般可以在全局定義一個回調函數,然后在script標簽里傳入回調函數即可:

  1. window.handleData = function(data){ 
  2.     // ... 
  3. let script = document.createElement("script"); 
  4. script.src = "https://xxxx.com/v0/search?q=xuxi&callback=handleData"
  5. 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,基本使用形式如下:

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

參數介紹:

  • someWindow 窗口的一個引用,比如iframe的contentWindow屬性、執行window.open返回的窗口對象、或者是命名過或數值索引的window.frames
  • message 將要發送到其他 window的數據。意味著你可以不受什么限制的將數據對象安全的傳送給目標窗口而無需自己序列化
  • targetOrigin 通過窗口的origin屬性來指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示無限制)。不提供確切的目標將導致數據泄露等安全問題
  • transfer 是一串和message 同時傳遞的 Transferable 對象. 這些對象的所有權將被轉移給消息的接收方,而發送一方將不再保有所有權

我們可以通過如下方式來監聽message:

  1. window.addEventListener("message", receiveMessage, false); 
  2.  
  3. function receiveMessage(event){ 
  4.   let origin = event.origin || event.originalEvent.origin;  
  5.   if (origin !== "http://aaa:8080"
  6.     return
  7.  
  8.   // ... 
  9.   console.log(event.data) 
  10.  
  11. // 派發消息的頁面 
  12. winB.postMessage(_({text: '休息休息'}), origin) 

我們的event里有如下幾個核心的屬性:

  • data 從其他 window 中傳遞過來的對象
  • origin 調用 postMessage 時消息發送方窗口的 origin . 這個字符串由 協議、“://“、域名、“ : 端口號”拼接而成
  • source 對發送消息的窗口對象的引用; 您可以使用此來在具有不同origin的兩個窗口之間建立雙向通信

3. 實現聊天機器人

在熟悉以上知識點之后,我們開始來寫我們聊天機器人的demo。首先我們寫兩個html,分別為a.html和b.html,然后用node分別代理兩個不同頁面,設置不同端口:

  1. // a.js 
  2. //依賴一個http模塊,相當于java中的import,與C#中的using 
  3. var http = require('http'); 
  4. var fs = require('fs'); 
  5. var { resolve } = require('path'); 
  6.  
  7. //創建一個服務器對象 
  8. server = http.createServer(function (req, res) { 
  9. //設置請求成功時響應頭部的MIME為純文本 
  10. res.writeHeader(200, {"Content-Type""text/html"}); 
  11. //向客戶端輸出字符 
  12. let data = fs.readFileSync(resolve(__dirname, './a.html')) 
  13. res.end(data); 
  14. }); 
  15. //讓服務器監聽本地8000端口開始運行 
  16. server.listen(8000,'127.0.0.1'); 
  17. console.log('http://127.0.0.1:8000'
  18.  
  19. // b.js 
  20. // ... 
  21. server.listen(8001,'127.0.0.1'); 

由上可知我們a.html代理在8000端口下,b.html代理在8001端口下,由瀏覽器的同源策略可知他們存在跨域問題。

跨域實現之后我們可以開始搭建頁面層級了,我們這里將b頁面以iframe的形式嵌入到a頁面,具體結構如下:


這樣我們就可以愉快的搭建postMessage體系了。首先我們在a頁面通過發送按鈕和輸入框將消息發送給b頁面,大致結構如下:

  1. <body> 
  2.     <div class="wrap"
  3.         <iframe src="http://127.0.0.1:8001" frameborder="0" id="b"></iframe> 
  4.         <div class="control"
  5.             <input type="text" placeholder="請輸入內容" id="ipt"
  6.             <span id="send">發送</span> 
  7.         </div> 
  8.     </div> 
  9.     <script> 
  10.         window.onload = function() { 
  11.             let origin = 'http://127.0.0.1:8001'
  12.             let _ = (data) => JSON.stringify(data); 
  13.             let winB = document.querySelector('#b').contentWindow; 
  14.             let sendBtn = document.querySelector('#send'); 
  15.             sendBtn.addEventListener('click', (e) => { 
  16.                 let text = document.querySelector('#ipt'); 
  17.                 winB.postMessage(_({text: text.value}), origin) 
  18.                 text.value = ''
  19.             }, false
  20.             winB.postMessage(_({text: ''}), origin) 
  21.         } 
  22.     </script> 
  23. </body> 

 我們可以通過iframe的contentWindow來拿到b頁面窗體的引用,然后在發送按鈕的點擊事件中觸發postMessage將數據發送給B。B頁面結構如下:

  1. <body> 
  2.     <div class="content"
  3.             <h4>Lab智能機器人</h4> 
  4.             <div class="content-inner"></div> 
  5.     </div> 
  6.     <script> 
  7.         // 語料庫 
  8.         const pool = []; 
  9.         window.addEventListener("message", receiveMessage, false); 
  10.         let content = document.querySelector('.content-inner'); 
  11.         let initContentH = content.scrollHeight; 
  12.         let _ = (data) => JSON.stringify(data); 
  13.         function createChat(type, mes) { 
  14.             let dialog = document.createElement('div'); 
  15.             dialog.className = type === 0 ? 'dialog robot' : 'dialog user'
  16.             let content =  type === 0 ? ` 
  17.                 <span class="tx">${type === 0 ? 'lab' : 'user'}</span> 
  18.                 <span class="mes">${mes}</span> 
  19.             ` : ` 
  20.                 <span class="mes">${mes}</span> 
  21.                 <span class="tx">${type === 0 ? 'lab' : 'user'}</span>  
  22.             `; 
  23.             dialog.innerHTML = content; 
  24.             return dialog 
  25.         } 
  26.  
  27.         function scrollTop(el, h) { 
  28.             if(el.scrollHeight !== h) { 
  29.                 el.scrollTop = h + 100; 
  30.             } 
  31.         } 
  32.  
  33.         function receiveMessage(event){ 
  34.             // 兼容其他瀏覽器 
  35.             let origin = event.origin || event.originalEvent.origin;  
  36.             if(origin === 'http://127.0.0.1:8000') { 
  37.                 let data = JSON.parse(event.data); 
  38.                 if(data && !data.text) { 
  39.                     mes = { text: '你好,我是機器人Lab,請問有什么可以幫到您的嗎?' }; 
  40.                     event.source.postMessage(_(mes), event.origin) 
  41.                     content.appendChild(createChat(0, mes.text)) 
  42.                      
  43.                 }else { 
  44.                     content.appendChild(createChat(1, data.text)) 
  45.                     scrollTop(content, initContentH) 
  46.                      
  47.                     setTimeout(() => { 
  48.                          
  49.                         content.appendChild(createChat(0, '正在解決')) 
  50.                         scrollTop(content, initContentH) 
  51.                     }, 2000); 
  52.                 }  
  53.             } 
  54.         } 
  55.     </script> 
  56. </body> 
 我們在b頁面中去解析a頁面的數據并做出相應的回答。這樣,我們的基本聊天機器人就實現了。

4. 回答語料庫設計思路

至于當我們在a頁面發送了一個消息,b頁面如何解析并回答,可以有如下幾種思路:

  • 通過后端接口實現,即我們可以將a的數據作為參數傳遞給某個后端接口,讓后端來實現返回需要的數據,這種在AI機器人中應用的很廣泛。
  • 純前端實現。前端定義回答的語料庫,通過關鍵詞匹配來拿到實現應答,這種一般用于普通的預設問題的回答。

5.實現可插拔式

可插拔式就是一個頁面可以放在不同平臺使用。這種我們可以設置origin白名單,只需要將b頁面封裝,其他系統可以使用類于a頁面的方式,只提供發送信息的接口,這樣我們就可以在不同平使用了。


在 H5-dooring 項目中也使用了客服機器人 chatbot-antd, 感興趣可以了解一下.

 

責任編輯:姜華 來源: 趣談前端
相關推薦

2022-07-05 06:42:01

聊天機器人人工智能

2023-10-29 21:20:04

谷歌Bard聊天機器人

2017-03-28 12:21:21

機器人定義

2020-02-02 09:19:14

聊天機器人機器人智能

2016-02-16 14:46:33

聊天機器人機器學習自然語言

2019-12-19 16:08:40

人工智能機器人數據

2022-07-03 10:23:06

機器人場景個性化

2025-06-04 08:21:28

2023-06-29 15:04:21

微軟ChatGPT

2025-11-04 07:00:00

AI聊天工具影子AI安全

2023-12-18 19:05:34

2017-08-21 13:31:44

AI聊天機器人facebook

2019-06-04 08:00:00

機器人聊天機器人人工智能

2020-02-20 09:00:00

網絡應用數據技術

2019-07-03 10:02:47

聊天機器人平臺機器人

2023-04-27 08:00:00

2019-07-30 07:53:08

機器人人工智能系統

2023-05-18 10:06:00

聊天機器人醫療保健

2024-11-01 07:30:00

點贊
收藏

51CTO技術棧公眾號

亚洲欧洲日韩av| 一个色综合网| 91久久线看在观草草青青| 天堂资源在线亚洲视频| 怡春院在线视频| 在线一区电影| 日韩成人中文电影| 日日干夜夜操s8| 日韩影视在线| 久久久国际精品| 7777精品伊久久久大香线蕉语言| 国产精品suv一区二区三区| 国产一区二区三区四区大秀| 欧美肥妇毛茸茸| 水蜜桃色314在线观看| lutube成人福利在线观看| 国产一区二区免费在线| 欧美性受xxxx黑人猛交| 正在播放国产对白害羞| aiss精品大尺度系列| 一本大道综合伊人精品热热| 2021国产视频| 经典三级在线| 成人免费看黄yyy456| 国产精品视频自在线| 久久综合综合久久| 婷婷亚洲五月| 亚洲视频国产视频| 日本三级日本三级日本三级极| 日韩免费在线电影| 日韩欧美在线看| 国产一线二线三线女| av一本在线| 91美女片黄在线观看91美女| 7777精品伊久久久大香线蕉语言 | 小嫩嫩12欧美| 日韩一区二区影院| 国产福利在线免费| 人人鲁人人莫人人爱精品| 亚洲一区二区三区国产| 亚洲欧美日本国产有色| 青青青手机在线视频观看| 国产成人福利片| 亚洲一区二区三区视频| 中文字幕日本视频| 羞羞视频在线观看欧美| 久久久久久国产精品三级玉女聊斋| 精品视频第一页| 加勒比久久综合| 亚洲精品国产综合区久久久久久久 | 欧美一区二区三区成人精品| 亚洲无线观看| 欧美一级久久久| 91亚洲精品久久久蜜桃借种| 2019年精品视频自拍| 日韩人体视频一二区| 亚洲熟女乱色一区二区三区| 蜜桃视频动漫在线播放| 天天色天天爱天天射综合| a天堂资源在线观看| 日本在线视频网址| 亚洲国产你懂的| 91精品国产91久久久久麻豆 主演| 日本在线视频中文有码| 亚洲高清在线精品| 国产精品入口芒果| 黄视频免费在线看| 精品动漫一区二区| 欧美精品色婷婷五月综合| 伊人久久国产| 色婷婷久久久久swag精品| 好男人www社区| jizz欧美| 在线不卡中文字幕播放| 老女人性生活视频| 在线综合色站| 日韩电影中文 亚洲精品乱码| 欧美成人午夜精品免费| 教室别恋欧美无删减版| 精品国产一区二区三区久久狼黑人 | 国产精品va视频| 日韩一级片网站| av电影中文字幕| 色橹橹欧美在线观看视频高清 | 一区二区高清不卡| 亚洲激情第一区| 国产精品久久中文字幕| 成人欧美一区二区三区的电影| 欧美午夜精品一区二区蜜桃| 天天色天天综合网| 精品亚洲自拍| 国产香蕉97碰碰久久人人| 国精产品久拍自产在线网站| 欧美日本一区二区视频在线观看| 久久免费在线观看| 国产一级片一区二区| 精品一区二区三区影院在线午夜 | 久久久亚洲精品石原莉奈| 午夜精品亚洲一区二区三区嫩草 | 久久欧美在线电影| 国产精品xxxxxx| 国产麻豆午夜三级精品| 免费成人深夜夜行视频| 色开心亚洲综合| 亚洲va中文字幕| 国产高潮免费视频| 精品一区二区男人吃奶| www.午夜精品| 亚洲精品午夜国产va久久成人| 蜜桃在线一区二区三区| 国产精品视频入口| 9191在线观看| 亚洲国产精品嫩草影院| 天天干天天爽天天射| 国产精品流白浆在线观看| 中文字幕一区二区精品| 日韩激情一区二区三区| 免费高清在线视频一区·| 国产三区精品| 久做在线视频免费观看| 91国在线观看| www国产视频| 一个色综合网| 国产精品一区二区三区久久| 亚洲日本中文字幕在线| 亚洲精品福利视频网站| 第四色婷婷基地| 宅男在线一区| 91国内精品久久| 午夜久久久久久噜噜噜噜| 国产精品少妇自拍| 北条麻妃在线观看| 国产精品对白| 欧美成人免费大片| 伊人精品在线视频| 国产色婷婷亚洲99精品小说| 亚洲午夜精品久久久久久人妖| 日韩成人视屏| 精品国产一区二区三区久久狼黑人 | 欧美最猛性xxxxx亚洲精品| а√天堂资源在线| 亚洲日本欧美天堂| 国产九九在线观看| 国内精品久久久久久99蜜桃| 热99在线视频| 香蕉久久一区二区三区| 亚洲第一福利视频在线| 午夜诱惑痒痒网| 天天色综合色| 91免费国产网站| av毛片在线免费| 日韩欧美在线网站| 欧美国产日韩在线观看成人| 国产一区二区三区精品视频| 午夜啪啪福利视频| 精品视频一区二区三区| 久久国产精品久久精品| 国产内射老熟女aaaa∵| 亚洲免费伊人电影| 日韩a一级欧美一级| 牛牛国产精品| 国产98在线|日韩| mm视频在线视频| 亚洲成av人影院在线观看| 日韩污视频在线观看| 99re6这里只有精品视频在线观看| 男人日女人逼逼| 亚洲素人在线| 国产精品久久久久久超碰| 在线观看a视频| 69av一区二区三区| 国产无套在线观看| 久久夜色精品国产欧美乱极品| 成人免费无码av| 日韩激情在线| 国产欧美一区二区三区久久人妖 | 久久久久久久av| 亚洲aⅴ乱码精品成人区| 色婷婷亚洲婷婷| 97精品在线播放| 懂色一区二区三区免费观看| 国产精品无码av在线播放| 国产一区二区观看| 亚洲一区二区三区在线视频| 国产精品186在线观看在线播放| 亚洲国产精品国自产拍av秋霞| 欧美国产成人精品一区二区三区| 久久精品一区四区| 尤物网站在线看| 亚洲一区中文| 91制片厂免费观看| 欧美在线导航| 成人xxxx视频| 擼擼色在线看观看免费| 在线精品视频视频中文字幕| 精品人妻一区二区三区浪潮在线| 黄色成人在线免费| 中文字幕美女视频| av亚洲精华国产精华| 一区二区成人网| 国产一区二区三区四区老人| 欧美一区二区高清在线观看| 欧美经典一区| 国产精品男人爽免费视频1| 韩国成人免费视频| 在线视频国产日韩| 人人妻人人澡人人爽人人欧美一区| 色又黄又爽网站www久久| 成年人午夜剧场| 久久久久久久综合色一本| 99999精品| 青草国产精品久久久久久| 久久男人资源站| 欧美亚洲精品在线| 久久国产精品 国产精品| 91麻豆精品国产综合久久久 | 精品在线亚洲视频| 91精品91久久久中77777老牛| 91成人观看| 奇米888一区二区三区| 大奶在线精品| 91久久精品一区| 91福利精品在线观看| 欧洲成人午夜免费大片| 国产色婷婷在线| 久久综合伊人77777蜜臀| yw在线观看| 精品小视频在线| 国产成人手机在线| 678五月天丁香亚洲综合网| 精品久久久久久久久久久国产字幕| 亚洲成人第一页| 校园春色 亚洲| 国产精品传媒在线| 精品国产aaa| 久久久久久久久久久99999| 亚洲制服丝袜在线播放| 粉嫩蜜臀av国产精品网站| 制服下的诱惑暮生| 国产精品一卡二| 午夜视频在线网站| 久久99精品国产.久久久久久 | 韩国欧美国产1区| 手机视频在线观看| 日本视频免费一区| 天堂在线资源视频| 日本中文字幕一区| 亚洲精品怡红院| 三级精品在线观看| 国产福利一区视频| 日一区二区三区| 麻豆一区二区三区视频| 日韩电影在线免费观看| 日韩一级片播放| 奇米影视一区二区三区小说| 国产无套粉嫩白浆内谢的出处| 老妇喷水一区二区三区| 日韩视频免费在线播放| 日av在线不卡| 中文字幕66页| 国产美女精品人人做人人爽| 中文字幕乱妇无码av在线| 国产精品 欧美精品| 麻豆av免费看| 成人一区二区三区| 性色av蜜臀av色欲av| 久久久99久久精品欧美| 久久久久无码精品国产sm果冻| 国产视频一区在线观看| 波多野结衣欲乱| 亚洲男人天堂av| 国产污片在线观看| 日韩欧美在线视频免费观看| 黄色污污视频软件| 欧美精品高清视频| 亚洲男人天堂久久| 亚洲欧美成人精品| 伊人免费在线| 久久久久久中文| 在线观看v片| 国产欧美va欧美va香蕉在线| 免费看日产一区二区三区| 精品国产免费人成电影在线观...| 日韩深夜福利| 中文字幕日韩一区二区三区| 欧美色综合网| 91淫黄看大片| 国产成人精品免费一区二区| 成人免费看aa片| 自拍偷拍亚洲欧美日韩| 国产 日韩 欧美 成人| 日本久久精品电影| 国产视频在线观看免费| 日韩精品有码在线观看| 网友自拍视频在线| 国自产精品手机在线观看视频| 国产精品久久亚洲不卡| 999国产视频| 国产成人三级| 欧美中日韩在线| 麻豆高清免费国产一区| xxxwww国产| 中文字幕日韩一区二区| 自拍偷拍欧美亚洲| 在线不卡欧美精品一区二区三区| 六月丁香色婷婷| 中日韩午夜理伦电影免费| 国产在线xxx| 国产精品自产拍在线观看| 欧美顶级毛片在线播放| 免费观看黄色的网站| 国产亚洲在线| www.欧美com| 国产精品午夜免费| 亚洲黄色小说图片| 精品久久国产老人久久综合| 最新电影电视剧在线观看免费观看| 久久久亚洲国产天美传媒修理工| 欧美理论影院| 成人在线观看网址| 99久久婷婷| 欧美精品久久久久久久久25p| 91日韩在线专区| 日本在线小视频| 欧美一区二区精品在线| av在线播放av| 国产精品第2页| 亚洲欧美成人vr| 欧美 日韩 国产在线观看| 国产精品一区2区| 国产极品美女在线| 欧美性生活影院| 国产专区在线播放| 青青在线视频一区二区三区| 麻豆国产欧美一区二区三区r| 日本丰满少妇黄大片在线观看| 蜜臀av性久久久久蜜臀aⅴ| 醉酒壮男gay强迫野外xx| 亚洲不卡av一区二区三区| 丰满人妻一区二区三区无码av| 久久精品国产一区| 9999精品视频| a级黄色片网站| 九一久久久久久| 亚洲综合第一区| 欧美日韩卡一卡二| 2019中文字幕在线视频| 国产精品视频网| 欧美三级情趣内衣| 欧美一级裸体视频| 国产精品免费久久| 伊人免费在线观看高清版| 在线视频日本亚洲性| 外国电影一区二区| 性欧美.com| 精品一区二区三区免费视频| 国产人与禽zoz0性伦| 91精品国产综合久久福利软件| 黄色国产网站在线播放| 亚洲综合日韩中文字幕v在线| 一区二区电影在线观看| 欧美老女人bb| 五月天婷婷综合| 欧洲天堂在线观看| 国产91精品网站| 日韩免费视频| 亚洲欧美日韩中文字幕在线观看| 亚洲大片一区二区三区| 日韩a级作爱片一二三区免费观看| 欧美亚洲伦理www| 不卡一区2区| 欧美一级免费在线| 午夜a成v人精品| 国内精品在线视频| 国产色视频一区| 午夜精品av| 日韩一级视频在线观看| 欧美色视频一区| 色呦呦在线看| 久久综合久久综合这里只有精品| 日韩av中文在线观看| 久久国产美女视频| 亚洲国产精品福利| 欧美视频精品| 国产精品国三级国产av| www国产成人| 亚洲影视一区二区| 久久久久久久国产| 国产91久久精品一区二区| 国内av一区二区| 精品国产乱码久久久久久虫虫漫画| 欧洲亚洲精品视频| 91亚色免费| 久久激情网站| 久久国产在线视频| 亚洲欧美色婷婷| 一区二区网站| 欧美自拍小视频| 亚洲一二三区不卡| 五月天婷婷在线视频|