Антиспам (запрет англоязычных сообщений)
Здравствуйте товарищи кодеры!
Жутко надоел спам в чате. Единственное, что пока пришло в голову, запретить сообщения которые содержат больше скажем 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, время: 11:05. |