Антиспам (запрет англоязычных сообщений)
Здравствуйте товарищи кодеры!
Жутко надоел спам в чате. Единственное, что пока пришло в голову, запретить сообщения которые содержат больше скажем 30 английских символов. Обычно хотя бы логику того, что нужно сделать представляю, но сейчас в растерянности. Итак, вот как выглядит сообщение:
<div id="KIDE_id_1000391" class="KIDE_msg_top">
<span class="KIDE_msg_hour"> 9:34 -</span>
<span title="22-1 9:34:16" oncontextmenu="event.preventDefault();kide.mensaje('Павлин_4861',0,1000391,'','22-1 9:34:16','e34629ab8eb3df87eb0230a6a380c2d2',3,'http://www.gravatar.com/avatar/9c083d94d6703024d615406e8b17a01c?s=50&d=wavatar')" class="KIDE_guest">
<span style="cursor: pointer" title="22-1 9:34:16" onclick="kide.insertSmile('Павлин_4861, ')"
class="KIDE_guest">Ник</span>: <span class="KIDE_dc_guest KIDE_msg">Текст сообщения</span>
<i class="fa fa-reply qutes" title="Цитировать" aria-hidden="true"></i>
<span class="hig K_copy"><i class="fa fa-clipboard" title="Копировать" aria-hidden="true"></i></span>
</span>
</div>
:help: |
Хотя в целом логику наверное понимаю. Получить все span "KIDE_msg" проверить не содержат ли английские символы и если их больше n удалить содержащий его "IDE_msg_top" но как это будет выглядеть не представляю (
Попробовать и посмотреть можно тут: https://noviy-kovcheg.ru/chat |
Ubivectel,
может чем-то поможет ...
document.addEventListener("DOMContentLoaded", function() {
let textarea = document.querySelector(".KIDE_dc_guest");
let reg = /[\w\s]{20,}/g;
textarea.addEventListener("input", function() {
reg.lastIndex = 0;
if (reg.test(textarea.value)) textarea.value = 'чапаев и пустота'
})
})
|
Цитата:
|
"n" имел ввиду именно количество латинских символов. То есть если спан class="KIDE_dc_guest KIDE_msg" содержит их например больше тридцати, то удалять содержащий его див class="KIDE_msg_top" В настоящий момент добавил скрипт предложенный рони, и хотя даже смутно пока не могу понять, что он должен делать, но ботов пока не видать ) Правда они набегами, тут только ждать
|
Цитата:
|
Цитата:
https://skrinshoter.ru/p/230123/Dtvq...2011:09:43.png |
Цитата:
|
Цитата:
|
Цитата:
Однако боты проходят, а textarea дает вписывать en любой длинны :( |
Ubivectel,
много элементов с этим классом -- исправил на id замени на это и проверь
document.addEventListener("DOMContentLoaded", function() {
let textarea = document.querySelector("#KIDE_txt");
let reg = /[\w\s]{20,}/g;
textarea.addEventListener("input", function() {
reg.lastIndex = 0;
if (reg.test(textarea.value)) textarea.value = 'чапаев и пустота'
})
})
|
Ubivectel,
обёртку на готовность страницы убери тогда, раз внутри jQuery(function () { используешь.
let textarea = document.querySelector("#KIDE_txt");
let reg = /[\w\s]{20,}/g;
textarea.addEventListener("input", function() {
reg.lastIndex = 0;
if (reg.test(textarea.value)) textarea.value = 'чапаев и пустота'
})
|
Цитата:
|
Однако при вводе значение меняет, но боты все равно пишут ((((
|
Может все таки присваивать родителю "KIDE_msg_top" внутри которого спан с en class="hide" ?
|
Цитата:
|
Так вот же:
<span class="KIDE_dc_guest KIDE_msg">Текст сообщения</span> Он внутри еще одного спана без класса, а эээ... пролродитель: <div id="KIDE_id_1000391" class="KIDE_msg_top"> который и нужно скрыть или удалить ) Как-то так вроде |
Цитата:
|
Но ведь классы известны? Получить содержимое, и если там больше стольки-то en символов удалить содержащий его див с классом IDE_msg_top. Или я что-то не то говорю?
|
Цитата:
Цитата:
перебор всех span внутри KIDE_msg_top
document.querySelectorAll(".KIDE_msg_top").forEach(msg => {
for (let {
textContent
} of msg.querySelectorAll("span"))
if (/\w{12,}/g.test(textContent.replace(/\s+/g, ''))) {
msg.remove();
break;
}
})
но это заглушка только на момент входа в чат. |
Да, при обновлении страницы удаляет, что кстати тоже очень неплохо, а новые проходят. Неужели нет решения :(
|
Ubivectel,
на сервере надо фильтровать, а не у клиента |
В любом случае спасибо! Буду ломать моск )
|
Еще мысль пришла, может это отловить на стадии формирования сообщения? Вот по моему код который его создает:
kide.insertNewContent = function (
uid,
name,
text,
url,
ti,
color,
rango,
id,
sesion,
yo,
hora,
img
) {
if (text.replace(/ /g, "") != "") {
let c =
color.length > 0 ?
'style="color:#' + color + '" class="KIDE_msg"' :
'class="KIDE_dc_' + this.rangos[rango] + ' KIDE_msg"';
let div = this.$("KIDE_msgs");
let nodo = document.createElement("div");
let insertO = this.$("KIDE_output");
let s_hora;
let bquote = document.querySelector("#insertmsg");
nodo.setAttribute("id", "KIDE_id_" + id);
nodo.setAttribute("class", "KIDE_msg_top");
if (this.show_hour)
s_hora =
'<span title="' +
ti +
'" class="KIDE_msg_hour">' +
hora +
"</span> ";
else s_hora = "";
let tmp = "";
if (img && kide.show_avatar) {
let style = kide.avatar_maxheight ?
'style="max-height:' + kide.avatar_maxheight + '" ' :
"";
tmp =
"<img " +
style +
'src="' +
img +
'" class="KIDE_icono" alt="" /> ';
}
nodo.innerHTML =
s_hora +
tmp +
'<span style="cursor: pointer" class="KIDE_' +
this.rangos[rango] +
'" onclick="kide.insertSmile(\'' + //mod
name +
", ')\" oncontextmenu=\"event.preventDefault();document.querySelector(\'.overlayo\').style.display = \'block\';kide.mensaje('" +
name +
"', " +
uid +
", " +
id +
", '" +
url +
"', '" +
ti +
"', '" +
sesion +
"', " +
rango +
", '" +
img +
"')\">" +
name +
"</span>: <span " +
c +
">" +
this.filter_smilies(text) +
"</span>" + "<i class='fa fa-reply qutes' title='Цитировать' aria-hidden='true'></i>" +
"<i class='fa fa-clipboard K_copy' title='Копировать' aria-hidden='true'></i>"; + //mod
"<span class='editors'><i class='fa fa-pencil' title='Редактировать' aria-hidden='true'></i></span>"; //mod
if (this.order == "bottom") {
this.insertAfter(nodo, insertO.lastChild);
} else insertO.insertBefore(nodo, insertO.firstChild);
if (!yo && this.sound == 1) this.play_msg_sound();
this.ajustar_scroll();
}
};
|
Ubivectel,
аккуратно вставить
kide.insertNewContent = function (
uid,
name,
text,
url,
ti,
color,
rango,
id,
sesion,
yo,
hora,
img
) {
*!*
if (/\w{12,}/g.test(text.replace(/\s+/g, ''))) return;
*/!*
if (text.replace(/ /g, "") != "") {
|
Ураааааааааааааааа!!! Рони я всегда знал, что ты при написании кода магию применяешь. Спасибище, а то достали неимоверно ))))
|
Ubivectel,
:) |
Привет мир!
Добавил проверку на регистрацию:
if (rango == 3 && /\w{12,}/g.test(text.replace(/\s+/g, ''))) return;
И было бы совсем хорошо, но они научились спамить на других языках. Единственное, что приходит в голову, это проверка не содержит ли сообщение ссылки. Как-то во возможно?:help: |
Ну ссылки наверно начинаются с http(s)://
|
Да логику-то понимаю конечно, но синтаксис мое больное место,
if (rango == 3 && http(s):// && /\w{12,}/g.test(text.replace(/\s+/g, ''))) return;
Ну не может же быть вот прямо так ) |
if (rango == 3 && /(\w{12,})|(https?\:\/\/)/g.test(text.replace(/\s+/g, ''))) return;
|
Спасибо, все работает :thanks:
|
Появилась необходимость так же удалять сообщения от определенных сессий, сессия выглядит примерно так: b57d72832e49247ea643c4bc8eaab8d1
Попробовал дописать таким образом:
document.querySelectorAll(".KIDE_msg_top").forEach(msg => {
for (let {
textContent
} of msg.querySelectorAll("span"))
if (sesion == cd112ab6890ac4fc25030e2bbcbd7e08 && /\w{11,}/g.test(textContent.replace(/\s+/g, ''))) {
msg.remove();
break;
}
})
Но не хочет работать :help: |
Дополню, при формировании сообщения это условие срабатывает, сделал так:
if (sesion == cd112ab6890ac4fc25030e2bbcbd7e08 && rango == 3 && /(\w{12,})|(https?\:\/\/)/g.test(text.replace(/\s+/g, ''))) return;
И все прекрасно фильтруется, но при обновлении страницы сообщения опять появляются. |
Ubivectel,
а кавычки? == "cd112ab6890ac4fc25030e2bbcbd7e08" |
Да да, без них встает код
|
Цитата:
Цитата:
условно типа var sesion = "<?php echo $_SESSION['username'] ?>" |
Это так понимаю не то?
foreach ($this->msgs as $r)
{
$tiempo = gmdate($this->fecha, $r->time + $this
->user->gmt * 3600);
echo '<div id="KIDE_id_' . $r->id . '" class="KIDE_msg_top">';
if ($this->show_hour) echo '<span class="KIDE_msg_hour"> ' . gmdate($this->formato_hora, $r->time + $this->user->gmt * 3600) . '</span> ';
echo '<span title="' . $tiempo . '" oncontextmenu="event.preventDefault();kide.mensaje(\'' . addslashes($r->name) . '\',' . $r->userid . ',' . $r->id . ',\'' . $r->url . '\',\'' . $tiempo . '\',\'' . $r->sesion . '\',' . $r->rango . ',\'' . $r->img . '\')" class="' . KideHelper::getRango($r->rango, 'KIDE_') . '">';
echo '<span style="cursor: pointer" title="' . $tiempo . '" onclick="kide.insertSmile(\'' . addslashes($r->name) , ', ' . '\')" class="' . KideHelper::getRango($r->rango, 'KIDE_') . '">';
echo $r->name;
echo "</span>";
$c = $r->color === '' ? 'class="' . KideHelper::getRango($r->rango, 'KIDE_dc_') . ' KIDE_msg"' : 'style="color:#' . $r->color . '"';
echo ': <span ' . $c . '>' . $r->text . ' </span>
<i class="fa fa-reply qutes" title="Цитировать" aria-hidden="true"></i>
<span class="hig K_copy"><i class="fa fa-clipboard" title="Копировать" aria-hidden="true"></i></span>
<span class="editors"><i class="fa fa-pencil" aria-hidden="true"></i></span></br>
</div>';
}
|
Цитата:
|
И тут никак?
kide.insertNewContent = function (
uid,
name,
text,
url,
ti,
color,
rango,
id,
sesion,
yo,
hora,
img
) {
console.log(hora, name, rango, sesion, text);
if (rango == 3 && /(\w{12,})|(https?\:\/\/)/g.test(text.replace(/\s+/g, ''))) return;
// if (rango == 3 && /\w{12,}/g.test(text.replace(/\s+/g, ''))) return;
if (text.replace(/ /g, "") != "") {
let c =
color.length > 0 ?
'style="color:#' + color + '" class="KIDE_msg"' :
'class="KIDE_dc_' + this.rangos[rango] + ' KIDE_msg"';
let div = this.$("KIDE_msgs");
let nodo = document.createElement("div");
let insertO = this.$("KIDE_output");
let s_hora;
let bquote = document.querySelector("#insertmsg");
nodo.setAttribute("id", "KIDE_id_" + id);
nodo.setAttribute("class", "KIDE_msg_top");
if (this.show_hour)
s_hora =
'<span title="' +
ti +
'" class="KIDE_msg_hour">' +
hora +
"</span> ";
else s_hora = "";
let tmp = "";
if (img && kide.show_avatar) {
let style = kide.avatar_maxheight ?
'style="max-height:' + kide.avatar_maxheight + '" ' :
"";
tmp =
"<img " +
style +
'src="' +
img +
'" class="KIDE_icono" alt="" /> ';
}
nodo.innerHTML =
s_hora +
tmp +
'<span style="cursor: pointer" class="KIDE_' +
this.rangos[rango] +
'" onclick="kide.insertSmile(\'' + //mod
name +
", ')\" oncontextmenu=\"event.preventDefault();document.querySelector(\'.overlayo\').style.display = \'block\';kide.mensaje('" +
name +
"', " +
uid +
", " +
id +
", '" +
url +
"', '" +
ti +
"', '" +
sesion +
"', " +
rango +
", '" +
img +
"')\">" +
name +
"</span>: <span " +
c +
">" +
this.filter_smilies(text) +
"</span>" + "<i class='fa fa-reply qutes' title='Цитировать' aria-hidden='true'></i>" +
"<i class='fa fa-clipboard K_copy' title='Копировать' aria-hidden='true'></i>"; + //mod
"<span class='editors'><i class='fa fa-pencil' title='Редактировать' aria-hidden='true'></i></span>"; //mod
if (this.order == "bottom") {
this.insertAfter(nodo, insertO.lastChild);
} else insertO.insertBefore(nodo, insertO.firstChild);
if (!yo && this.sound == 1) this.play_msg_sound();
this.ajustar_scroll();
}
};
|
| Часовой пояс GMT +3, время: 19:02. |