客服系统即时通讯IM开发(四)网站实现实时在线访客列表【唯一客服】网站在线客服系统
在使用我的客服系统时,如果引入了我的js ,就可以实时看到网站上的所有访客了
-
使用 WebSocket 技术来实现实时通信。
-
在访客登录或退出时,向指定客服的 WebSocket 客户端发送消息。例如,你可以在访客登录时,向指定客服的 WebSocket 客户端发送一条消息,告诉客户端有一个新的访客登录。在客户端收到消息后,更新访客列表。例如,你可以在客户端收到新访客登录的消息后,在访客列表中新增一个访客。退出时也给客服发送消息,告诉访客已经退出,这样就会实时的获取到在线的访客了
-
利用全局变量存储访客信息
用Go语言Gin框架实现的一个客服系统的WebSocket服务端。它允许客户端使用WebSocket协议连接到服务器并实时交换消息。
服务器根据消息的“type”字段处理消息并根据需要执行不同的操作。
例如,如果消息类型为“monitorOnline”,服务器将发送访客上线的信息给客服。访客离线的时候,发送monitorOffline离线信息给客服
使用“MonitorList”的全局变量map,用于存储访客正在访问的标题、地址、时间等相关信息。
//网站监控 engine.GET("/ws_monitor", ws.NewMonitorServer)
package ws import ( "encoding/json" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/tidwall/gjson" "kefu/tools" "log" "net/http" "time" ) type MonitorConnection struct { KefuName string UinqId string Title string Url string Refer string StartTime string ClientIp string } var MonitorList = make(map[*websocket.Conn]*MonitorConnection) /** 网站监控 */ func NewMonitorServer(c *gin.Context) { conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { http.NotFound(c.Writer, c.Request) log.Println("upgrade error:", err) return } //获取GET参数 kefuName := c.Query("kefu_name") if kefuName == "" { conn.Close() return } connection := &MonitorConnection{ UinqId: tools.Uuid(), ClientIp: c.ClientIP(), KefuName: kefuName, StartTime: tools.DateDefault(time.Now()), } MonitorList[conn] = connection conn.WriteMessage(websocket.TextMessage, []byte("ok")) for { //接受消息 var receive []byte _, receive, err := conn.ReadMessage() if err != nil { msg := TypeMessage{ Type: "monitorOffline", Data: connection, } str, _ := json.Marshal(msg) OneKefuMessage(kefuName, str) delete(MonitorList, conn) return } msgType := gjson.Get(string(receive), "type").String() switch msgType { case "monitorOnline": title := gjson.Get(string(receive), "data.title").String() url := gjson.Get(string(receive), "data.url").String() refer := gjson.Get(string(receive), "data.refer").String() connection.Title = title connection.Url = url connection.Refer = refer msg := TypeMessage{ Type: "monitorOnline", Data: connection, } str, _ := json.Marshal(msg) OneKefuMessage(kefuName, str) case "cursor": } } }
javascript客户端的代码
它使用WebSocket连接到服务器。当连接关闭时,会尝试重新连接。当收到服务器的“ok”时,会把当前访问的标题、网址、来源等信息发送给服务端
/** * 连接websocket */ KEFU.connect=function () { var _this=this; var domain=getDomainFromUrl(_this.KEFU_URL); var protocol=getProtocolFromUrl(_this.KEFU_URL); var wsProtocol="ws://"; if(protocol=="https"){ wsProtocol="wss://"; } let ws = new WebSocket(wsProtocol+domain+"/ws_monitor?kefu_name="+this.KEFU_KEFU_ID); ws.onopen = function () { console.log('WebSocket 连接已打开'); _this.reconnectTimes = 0; }; ws.onclose = function () { console.log('WebSocket 连接已关闭'); // 尝试重连 _this.reconnect(); }; ws.onmessage = function (event) { console.log(`收到服务器的消息:${event.data}`); let data=event.data; let message={ "type":"monitorOnline", "data":{ "url":window.location.href, "title":document.title, "refer":document.referrer } } if(data=="ok"){ ws.send(JSON.stringify(message)) } // // 解析消息 // const message = JSON.parse(event.data); // if (message.type === 'message') { // console.log(`收到消息:${message.data}`); // } }; _this.ws=ws; } // 尝试重连 KEFU.reconnect=function(){ var _this=this; if (_this.reconnectTimes >= _this.MAX_RECONNECT_TIMES) { console.log('重连失败'); return; } _this.reconnectTimes++; console.log(`正在尝试重连(第 ${_this.reconnectTimes} 次)`); setTimeout(function () { _this.connect(); }, _this.RECONNECT_INTERVAL); }
十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》
一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网