socket-anti-spam モジュールを使用して、socket.io チャットルームにスパム対策機能を追加したいのですが、その方法がわかりません。いくつか試してみましたが、うまくいかなかったようです。
ソケットアンチスパムモジュールが役に立たない場合は、他のモジュールでも問題ありません。私のserver.jsのこのバージョンにはスパム対策設定がありますが、機能していないようです。
HTML や CSS など、他の情報 (必要になるとは思えませんが) が必要な場合は、コメントしてください。この質問を更新します。
私のserver.js:
var PORT = process.env.PORT || 3000;
var express = require("express");
var app = express();
var http = require("http").Server(app);
var io = require("socket.io")(http);
var moment = require("moment");
var connectedUsers = {};
var prefix = "^";
var sysusername = "Twintails🎀";
function sleep(ms) {
var unixtime_ms = new Date().getTime();
while (new Date().getTime() < unixtime_ms + ms) {}
}
const SocketAntiSpam = require('socket-anti-spam')
const socketio = require('socket.io').listen(8080)
const socketAntiSpam = new SocketAntiSpam({
banTime: 30, // Ban time in minutes
kickThreshold: 2, // User gets kicked after this many spam score
kickTimesBeforeBan: 1, // User gets banned after this many kicks
banning: true, // Uses temp IP banning after kickTimesBeforeBan
io: socketio, // Bind the socket.io variable
})
app.use(express.static(__dirname + "/public"));
io.on("connection", function(socket) {
socketAntiSpam.event.on('ban', data => {
socket.emit("message", {
username: sysusername,
text: "A user was banned...",
timestamp: moment().valueOf()
});
})
console.log("A user is connected.");
socket.on("disconnect", function() {
var userData = connectedUsers[socket.id];
if (typeof userData !== "undefined") {
socket.leave(connectedUsers[socket.id]);
io.to(userData.room).emit("message", {
username: sysusername,
text: userData.username + " has left!",
timestamp: moment().valueOf()
});
delete connectedUsers[socket.id];
}
});
socket.on("joinRoom", function(req, callback) {
if (req.username.replace(/\s/g, "") !== "Twintails🎀") {
if (req.username.replace(/\s/g, "").length < 24) {
if (
req.room.replace(/\s/g, "").length > 0 &&
req.username.replace(/\s/g, "").length > 0
) {
var nameTaken = false;
Object.keys(connectedUsers).forEach(function(socketId) {
var userInfo = connectedUsers[socketId];
if (
userInfo.username.toUpperCase() === req.username.toUpperCase()
) {
nameTaken = true;
}
});
if (nameTaken) {
callback({
nameAvailable: false,
error: "This username is taken, please choose another one."
});
} else {
connectedUsers[socket.id] = req;
socket.join(req.room);
socket.broadcast.to(req.room).emit("message", {
username: sysusername,
text: req.username + " has joined!",
timestamp: moment().valueOf()
});
callback({
nameAvailable: true
});
}
} else {
callback({
nameAvailable: false,
error: "Please complete the forum."
});
}
} else {
callback({
nameAvailable: false,
error: "Please make a username less than 24 characters."
});
}
} else {
callback({
nameAvailable: false,
error: "Your username can't be: " + sysusername
});
}
});
socket.on("message", function(message, callback, req) {
if (message.text.length > null) {
if (message.text !== " ") {
if (message.text !== " ") {
if (message.text !== " ") {
if (message.text !== " ") {
if (message.text !== " ") {
if (message.text !== " ") {
if (message.text !== " ") {
if (message.text !== " ") {
if (message.text !== " ") {
if (message.text.length < 200) {
message.timestamp = moment().valueOf();
io.to(connectedUsers[socket.id].room).emit(
"message",
message
);
}
}
}
}
}
}
}
}
}
}
}
});
socket.emit("message", {
username: sysusername,
text: "Ask someone to join this chat room to start talking.",
timestamp: moment().valueOf()
});
socket.on("message", function(message) {
if (message.text === prefix + "discord") {
socket.emit("message", {
username: sysusername,
text: "Join the Twintails🎀 server here: https://discord.gg/fK9ynNq",
timestamp: moment().valueOf()
});
sleep(1000);
}
});
socket.on("message", function(message) {
if (message.text === prefix + "bot") {
socket.emit("message", {
username: sysusername,
text: "Coming soon...",
timestamp: moment().valueOf()
});
sleep(1000);
}
});
});
http.listen(PORT, function() {
console.log("Server started on port " + PORT);
});
ありがとうございます!
嘆願タイトルにタグを入れること、特にすべて大文字でタグを入れることは避けてください。これは人々が質問を見つけるのに役立ちません (タグ ボックスに入力されたタグがその役割を果たします)。また、すべて大文字はインターネットの多くの隅で叫んでいるように読まれます。
– 異端の猿2020 年 9 月 4 日 17:04
ユーザーが送信したメッセージを保存し、現在のメッセージが以前のメッセージと似ている場合に送信を防ぐことができます。
共有 この回答を改善しますフォローする2020 年 9 月 4 日、午後 5 時に回答
デビッド・レベルデビッド・レベル
11
1
銅バッジ 1 個