Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Антиспам (запрет англоязычных сообщений) (https://javascript.ru/forum/misc/84871-antispam-zapret-angloyazychnykh-soobshhenijj.html)

Ubivectel 22.01.2023 08:01

Антиспам (запрет англоязычных сообщений)
 
Здравствуйте товарищи кодеры!

Жутко надоел спам в чате. Единственное, что пока пришло в голову, запретить сообщения которые содержат больше скажем 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&amp;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:

Ubivectel 23.01.2023 09:12

Хотя в целом логику наверное понимаю. Получить все span "KIDE_msg" проверить не содержат ли английские символы и если их больше n удалить содержащий его "IDE_msg_top" но как это будет выглядеть не представляю (

Попробовать и посмотреть можно тут: https://noviy-kovcheg.ru/chat

рони 23.01.2023 09:47

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 = 'чапаев и пустота'
            })
        })

voraa 23.01.2023 10:18

Цитата:

Сообщение от Ubivectel
проверить не содержат ли английские символы и если их больше n удалить содержащий его "IDE_msg_top"

n латинских букв подряд или всего?

Ubivectel 23.01.2023 10:31

"n" имел ввиду именно количество латинских символов. То есть если спан class="KIDE_dc_guest KIDE_msg" содержит их например больше тридцати, то удалять содержащий его див class="KIDE_msg_top" В настоящий момент добавил скрипт предложенный рони, и хотя даже смутно пока не могу понять, что он должен делать, но ботов пока не видать ) Правда они набегами, тут только ждать

рони 23.01.2023 11:06

Цитата:

Сообщение от Ubivectel
что он должен делать, но ботов пока не видать )

введи текст на en побольше и увидишь

Ubivectel 23.01.2023 11:11

Цитата:

Сообщение от рони (Сообщение 550208)
введи текст на en побольше и увидишь

похоже что-то делаю не так:

https://skrinshoter.ru/p/230123/Dtvq...2011:09:43.png

Ubivectel 23.01.2023 11:34

Цитата:

Сообщение от voraa (Сообщение 550205)
n латинских букв подряд или всего?

Не подряд конечно, всего в сообщении

рони 23.01.2023 11:44

Цитата:

Сообщение от Ubivectel
похоже что-то делаю не так:

вроде верно

Ubivectel 23.01.2023 11:48

Цитата:

Сообщение от рони (Сообщение 550211)
вроде верно

Добавил код в конец файла: https://noviy-kovcheg.ru/components/.../kidecustom.js

Однако боты проходят, а textarea дает вписывать en любой длинны :(

рони 23.01.2023 11:55

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 = 'чапаев и пустота'
            })
        })

рони 23.01.2023 12:01

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 = 'чапаев и пустота'
            })

Ubivectel 23.01.2023 12:08

Цитата:

Сообщение от рони (Сообщение 550213)
амени на это и проверь

Да, заработало, только я правильно понимаю, что сообщения все равно будут идти, но со значением указанным в textarea.value? )))))

Ubivectel 23.01.2023 12:10

Однако при вводе значение меняет, но боты все равно пишут ((((

Ubivectel 23.01.2023 12:15

Может все таки присваивать родителю "KIDE_msg_top" внутри которого спан с en class="hide" ?

рони 23.01.2023 12:35

Цитата:

Сообщение от Ubivectel
Может все таки присваивать родителю "KIDE_msg_top" внутри которого спан с en class="hide" ?

да, но надо знать что это за span))) класс или местоположение?

Ubivectel 23.01.2023 12:41

Так вот же:

<span class="KIDE_dc_guest KIDE_msg">Текст сообщения</span>


Он внутри еще одного спана без класса, а эээ... пролродитель:

<div id="KIDE_id_1000391" class="KIDE_msg_top">


который и нужно скрыть или удалить ) Как-то так вроде

рони 23.01.2023 12:44

Цитата:

Сообщение от Ubivectel
Как-то так вроде

вот именно вроде :(

Ubivectel 23.01.2023 12:50

Но ведь классы известны? Получить содержимое, и если там больше стольки-то en символов удалить содержащий его див с классом IDE_msg_top. Или я что-то не то говорю?

рони 23.01.2023 12:59

Цитата:

Сообщение от Ubivectel
Но ведь классы известны?

нет
Цитата:

Сообщение от Ubivectel
<span class="KIDE_dc_guest KIDE_msg">Текст сообщения</span>

этого класса не достаточно, поэтому вариант
перебор всех 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 23.01.2023 13:10

Да, при обновлении страницы удаляет, что кстати тоже очень неплохо, а новые проходят. Неужели нет решения :(

рони 23.01.2023 13:23

Ubivectel,
на сервере надо фильтровать, а не у клиента

Ubivectel 23.01.2023 13:38

В любом случае спасибо! Буду ломать моск )

Ubivectel 23.01.2023 14:10

Еще мысль пришла, может это отловить на стадии формирования сообщения? Вот по моему код который его создает:

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();
    }
};

рони 23.01.2023 14:22

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 23.01.2023 14:29

Ураааааааааааааааа!!! Рони я всегда знал, что ты при написании кода магию применяешь. Спасибище, а то достали неимоверно ))))

рони 23.01.2023 14:34

Ubivectel,
:)

Ubivectel 22.02.2023 09:36

Привет мир!

Добавил проверку на регистрацию:

if (rango == 3 && /\w{12,}/g.test(text.replace(/\s+/g, ''))) return;


И было бы совсем хорошо, но они научились спамить на других языках. Единственное, что приходит в голову, это проверка не содержит ли сообщение ссылки. Как-то во возможно?:help:

voraa 22.02.2023 10:00

Ну ссылки наверно начинаются с http(s)://

Ubivectel 22.02.2023 10:17

Да логику-то понимаю конечно, но синтаксис мое больное место,

if (rango == 3 && http(s):// &&  /\w{12,}/g.test(text.replace(/\s+/g, ''))) return;


Ну не может же быть вот прямо так )

voraa 22.02.2023 11:06

if (rango == 3  &&  /(\w{12,})|(https?\:\/\/)/g.test(text.replace(/\s+/g, ''))) return;

Ubivectel 22.02.2023 12:33

Спасибо, все работает :thanks:

Ubivectel 12.03.2023 05:35

Появилась необходимость так же удалять сообщения от определенных сессий, сессия выглядит примерно так: 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:

Ubivectel 12.03.2023 05:57

Дополню, при формировании сообщения это условие срабатывает, сделал так:

if (sesion == cd112ab6890ac4fc25030e2bbcbd7e08 && rango == 3 && /(\w{12,})|(https?\:\/\/)/g.test(text.replace(/\s+/g, ''))) return;


И все прекрасно фильтруется, но при обновлении страницы сообщения опять появляются.

рони 12.03.2023 08:01

Ubivectel,
а кавычки?
== "cd112ab6890ac4fc25030e2bbcbd7e08"

Ubivectel 12.03.2023 08:27

Да да, без них встает код

рони 12.03.2023 08:44

Цитата:

Сообщение от Ubivectel
Попробовал дописать таким образом:

Цитата:

Сообщение от Ubivectel
Но не хочет работать

нужна строка перед кодом, в которой будет сессия!!!
условно типа var sesion = "<?php echo $_SESSION['username'] ?>"

Ubivectel 12.03.2023 09:00

Это так понимаю не то?

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>';
    }

рони 12.03.2023 09:07

Цитата:

Сообщение от Ubivectel
Это так понимаю не то?

то но как сюда фильтрацию всунуть, да ещё с упором на сессию не знаю.

Ubivectel 12.03.2023 09:11

И тут никак?

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.