前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >客服系统即时通讯IM开发(四)网站实现实时在线访客列表【唯一客服】网站在线客服系统

客服系统即时通讯IM开发(四)网站实现实时在线访客列表【唯一客服】网站在线客服系统

作者头像
唯一Chat
发布2023-01-09 15:03:13
1.2K0
发布2023-01-09 15:03:13
举报
文章被收录于专栏:陶士涵的菜地

在使用我的客服系统时,如果引入了我的js ,就可以实时看到网站上的所有访客了

  1. 使用 WebSocket 技术来实现实时通信。
  2. 在访客登录或退出时,向指定客服的 WebSocket 客户端发送消息。例如,你可以在访客登录时,向指定客服的 WebSocket 客户端发送一条消息,告诉客户端有一个新的访客登录。在客户端收到消息后,更新访客列表。例如,你可以在客户端收到新访客登录的消息后,在访客列表中新增一个访客。退出时也给客服发送消息,告诉访客已经退出,这样就会实时的获取到在线的访客了
  3. 利用全局变量存储访客信息

用Go语言Gin框架实现的一个客服系统的WebSocket服务端。它允许客户端使用WebSocket协议连接到服务器并实时交换消息。

服务器根据消息的“type”字段处理消息并根据需要执行不同的操作。

例如,如果消息类型为“monitorOnline”,服务器将发送访客上线的信息给客服。访客离线的时候,发送monitorOffline离线信息给客服

使用“MonitorList”的全局变量map,用于存储访客正在访问的标题、地址、时间等相关信息。

代码语言:javascript
复制
    //网站监控
    engine.GET("/ws_monitor", ws.NewMonitorServer)
代码语言:javascript
复制
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”时,会把当前访问的标题、网址、来源等信息发送给服务端

代码语言:javascript
复制
/**
 * 连接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);
}

唯一在线客服系统

https://gofly.v1kf.com

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档