Антикракен, антиказино и т.д.

Расширения, сгенерированные с помощью искусственного интеллекта.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB 3.1.x/3.2.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
southklad
phpBB 3.1.0 RC3
Сообщения: 3395
Стаж: 13 лет 8 месяцев
Благодарил (а): 696 раз
Поблагодарили: 171 раз

Re: Антикракен, антиказино и т.д.

Сообщение southklad »

Вчера только, смотрю создана тема, 1 и в тексте 1 и все.Странно думаю, смотрю, а ранее она как раз казино и тд называлась, не смогли обойти и переименовали тему, чтобы не палиться
Изображение
er107
phpBB 2.0.18
Сообщения: 1185
Стаж: 14 лет 6 месяцев
Благодарил (а): 210 раз
Поблагодарили: 76 раз

Re: Антикракен, антиказино и т.д.

Сообщение er107 »

Да, у меня тоже так поначалу делали, я, как установил это расширение забыл о спаме:)
Но конечно, надо бы админку сделать для оперативности, но у меня сейчас другая напасть - "плавные" боты, которые делают так, чтобы сервак отключил хостер от нагрузки. Смекнули, что ддос не помогает, решили так действовать.
Аватара пользователя
southklad
phpBB 3.1.0 RC3
Сообщения: 3395
Стаж: 13 лет 8 месяцев
Благодарил (а): 696 раз
Поблагодарили: 171 раз

Re: Антикракен, антиказино и т.д.

Сообщение southklad »

Меня сегодня так же снова долбили, вчера фигачил так

Код: Выделить всё

89.36.32.231 - - [26/Aug/2025:14:14:02 +0300] "GET /tulbar/city_strany?asl_gen[]=content&customset[]=post&filters_changed=0&filters_initial=1&qtranslate_lang=%40%40lmalX HTTP/1.1" 403 177 
, причем с одного IP. Сегодня гостей разово было 1362, новый рекорд от ботов за разовое посещение. После блокировки пары IP подсетей отвалили.
Изображение
er107
phpBB 2.0.18
Сообщения: 1185
Стаж: 14 лет 6 месяцев
Благодарил (а): 210 раз
Поблагодарили: 76 раз

Re: Антикракен, антиказино и т.д.

Сообщение er107 »

У меня по 1500-1600 почти месяц висит...
Аватара пользователя
southklad
phpBB 3.1.0 RC3
Сообщения: 3395
Стаж: 13 лет 8 месяцев
Благодарил (а): 696 раз
Поблагодарили: 171 раз

Re: Антикракен, антиказино и т.д.

Сообщение southklad »

Ну у меня и блокировка на сервере и на форуме, но не справляются они все равно.
Изображение
Аватара пользователя
Dmitrij
phpBB 1.4.3
Сообщения: 82
Стаж: 21 год 3 месяца
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 3 раза

Re: Антикракен, антиказино и т.д.

Сообщение Dmitrij »

er107 писал(а): 28.08.2025 14:31 Но конечно, надо бы админку сделать для оперативности, но у меня сейчас другая напасть - "плавные" боты, которые делают так, чтобы сервак отключил хостер от нагрузки. Смекнули, что ддос не помогает, решили так действовать.
Аналогично. Получается спортивный интерес или личная неприязнь к сайту, зачем на это время тереть когда в сети кучу других сайтов и форумов.
С уважением, Дмитрий.
Аватара пользователя
southklad
phpBB 3.1.0 RC3
Сообщения: 3395
Стаж: 13 лет 8 месяцев
Благодарил (а): 696 раз
Поблагодарили: 171 раз

Re: Антикракен, антиказино и т.д.

Сообщение southklad »

Пробились спамеры с такими запросами Casino,
Изображение
er107
phpBB 2.0.18
Сообщения: 1185
Стаж: 14 лет 6 месяцев
Благодарил (а): 210 раз
Поблагодарили: 76 раз

Re: Антикракен, антиказино и т.д.

Сообщение er107 »

В дефолтном черном списке расширения нет слова , там написано только , надо в черный список добавить и .

Чтобы расширение блокировало слова на любой раскладке (при наличии в черном списке стоп-слов только на одной раскладке), надо расширение подкорректировать, а сейчас, для оперативности, надо добавлять слова которые проходят, в черный список.
Аватара пользователя
southklad
phpBB 3.1.0 RC3
Сообщения: 3395
Стаж: 13 лет 8 месяцев
Благодарил (а): 696 раз
Поблагодарили: 171 раз

Re: Антикракен, антиказино и т.д.

Сообщение southklad »

Расширение полезное, но как бы убрать срабатывания для обычных пользователей. :? Была проблема с отправкой темы еще у одного пользователя, и я в упор не нашел там ни одного запрещенного слова, но отправка блокировалась.
Изображение
er107
phpBB 2.0.18
Сообщения: 1185
Стаж: 14 лет 6 месяцев
Благодарил (а): 210 раз
Поблагодарили: 76 раз

Re: Антикракен, антиказино и т.д.

Сообщение er107 »

southklad писал(а): 04.09.2025 13:19 для обычных пользователей
Спамеры тоже обычные пользователи, тут, наверное, надо отключать проверку, если у юзера больше N сообщений на форуме? Или как?
Аватара пользователя
southklad
phpBB 3.1.0 RC3
Сообщения: 3395
Стаж: 13 лет 8 месяцев
Благодарил (а): 696 раз
Поблагодарили: 171 раз

Re: Антикракен, антиказино и т.д.

Сообщение southklad »

er107 писал(а): 04.09.2025 18:19 юзера больше N сообщений на форуме? Или как?
Тоже про это думал, потому что я как админ сам столкнулся с таким действием.
Изображение
er107
phpBB 2.0.18
Сообщения: 1185
Стаж: 14 лет 6 месяцев
Благодарил (а): 210 раз
Поблагодарили: 76 раз

Re: Антикракен, антиказино и т.д.

Сообщение er107 »

Админу можно антиспам вообще тогда отключить, надо подумать, в общем.
er107
phpBB 2.0.18
Сообщения: 1185
Стаж: 14 лет 6 месяцев
Благодарил (а): 210 раз
Поблагодарили: 76 раз

Re: Антикракен, антиказино и т.д.

Сообщение er107 »

Расширение обновлено до версии 1.0.5

Исправлена работа с белым списком. (была некорректная обработка слов в предыдущих версиях)
Упрощена функция get_default_patterns() теперь можно вписывать стоп-слова прямо в код расширения:

Код: Выделить всё

$default_words = ['кракен', 'casino', 'azino', '1xbet'];
а не их регулярки (на тот случай, если файл blacklist.txt будет не обнаружен на сервере или окажется пуст).
Оптимизирован код расширения.
Аватара пользователя
southklad
phpBB 3.1.0 RC3
Сообщения: 3395
Стаж: 13 лет 8 месяцев
Благодарил (а): 696 раз
Поблагодарили: 171 раз

Re: Антикракен, антиказино и т.д.

Сообщение southklad »

Приветствую, пытаюсь ввести не слово, а номер телефона с пробелами

Код: Выделить всё

8 (952) 133-65-10
задолбали попрошайки спамеры, но расширение данный код не обрабатывает.

Отправлено спустя 15 минут 50 секунд:
Вроде помогло вот такое решение: в main_listener.php
было

Код: Выделить всё

if (preg_match($pattern, $text_cleaned)) {
стало

Код: Выделить всё

if (preg_match($pattern, $text_lower) || preg_match($pattern, $text_cleaned)) {
Насколько верное поправьте.
Изображение
Аватара пользователя
southklad
phpBB 3.1.0 RC3
Сообщения: 3395
Стаж: 13 лет 8 месяцев
Благодарил (а): 696 раз
Поблагодарили: 171 раз

Re: Антикракен, антиказино и т.д.

Сообщение southklad »

Нейросеть подсказала такой вариант, работает, может кто подскажет верный ли код? в в main_listener.php

Код: Выделить всё

<?php
namespace chatgpt\antikraken\event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use phpbb\user;
use phpbb\request\request_interface;

class main_listener implements EventSubscriberInterface
{
    protected $user;
    protected $request;
    protected $phpbb_root_path;
    protected $patterns;
    protected $whitelist;
    protected $phone_patterns;
    
    // Режим проверки: true - ищем любое вхождения стоп-слова в составное слово и блокируем его (в этом случае и вулкан и вулканология заблокируются), false - ищем только целые слова (в этом случае вулкан заблокируется, а вулканология нет).
    
    protected $aggressive_mode = true;

    public function __construct(user $user, request_interface $request, $phpbb_root_path)
    {
        $this->user = $user;
        $this->request = $request;
        $this->phpbb_root_path = $phpbb_root_path;
        $this->user->add_lang_ext('chatgpt/antikraken', 'common');

        $this->whitelist = $this->load_word_list($phpbb_root_path . 'ext/chatgpt/antikraken/whitelist.txt');
        $this->patterns = $this->load_blacklist_patterns($phpbb_root_path . 'ext/chatgpt/antikraken/blacklist.txt');
        $this->phone_patterns = $this->load_phone_patterns();
    }

    protected function load_word_list($file_path)
    {
        $words = [];
        if (file_exists($file_path) && is_readable($file_path)) {
            $lines = file($file_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($lines as $line) {
                $line = trim($line);
                if (!empty($line) && strpos($line, '#') !== 0) {
                    $words[] = mb_strtolower($line);
                }
            }
        }
        return $words;
    }

    protected function load_blacklist_patterns($file_path)
    {
        $patterns = [];
        $blacklist_words = $this->load_word_list($file_path);

        foreach ($blacklist_words as $word) {
            $pattern = $this->convert_word_to_pattern($word);
            if ($pattern) {
                $patterns[] = $pattern;
            }
        }

        if (empty($patterns)) {
            $patterns = $this->get_default_patterns();
        }

        return $patterns;
    }

    protected function get_default_patterns()
    {
        // Используем convert_word_to_pattern для автоматической генерации
        $default_words = ['кракен', 'casino', 'azino', '1xbet'];
        $patterns = [];
        
        foreach ($default_words as $word) {
            $pattern = $this->convert_word_to_pattern($word);
            if ($pattern) {
                $patterns[] = $pattern;
            }
        }
        
        return $patterns;
    }

    // НОВЫЙ МЕТОД: Загрузка паттернов для номеров телефонов
    protected function load_phone_patterns()
    {
        return [
            // Паттерны для российских номеров (8, +7)
            '/8[\s\-\(\)\.]*9[\s\-\(\)\.]*5[\s\-\(\)\.]*2[\s\-\(\)\.]*1[\s\-\(\)\.]*3[\s\-\(\)\.]*3[\s\-\(\)\.]*6[\s\-\(\)\.]*5[\s\-\(\)\.]*1[\s\-\(\)\.]*0/iu',
            '/8[\s\-\(\)\.]*9[\s\-\(\)\.]*5[\s\-\(\)\.]*2[\s\-\(\)\.]*1[\s\-\(\)\.]*3[\s\-\(\)\.]*3/iu', // Первые 7 цифр
            '/8[\s\-\(\)\.]*9[\s\-\(\)\.]*5[\s\-\(\)\.]*2/iu', // Первые 3 цифры
            
            // Общие паттерны для любых номеров
            '/\b8[\s\-\(\)\.]*9[\s\-\(\)\.]*5[\s\-\(\)\.]*2[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d\b/iu',
            '/\b\+?7[\s\-\(\)\.]*9[\s\-\(\)\.]*5[\s\-\(\)\.]*2[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d[\s\-\(\)\.]*\d\b/iu',
            
            // Паттерн для любых номеров начинающихся с 8952 (более агрессивный)
            '/\b(8|\+?7)[\s\-\(\)\.]*(9[\s\-\(\)\.]*5[\s\-\(\)\.]*2)[\s\-\(\)\.]*\d{2,7}/iu'
        ];
    }

    protected function convert_word_to_pattern($word)
    {
        if (empty($word) || in_array(mb_strtolower($word), $this->whitelist)) {
            return false;
        }

        $pattern = '';
        $chars = preg_split('//u', mb_strtolower($word), -1, PREG_SPLIT_NO_EMPTY);

        foreach ($chars as $char) {
            $variants = $this->get_char_variants($char);
            $pattern .= '[' . implode('', $variants) . ']';
        }

        return $this->aggressive_mode
            ? '/' . $pattern . '/iu'
            : '/\b' . $pattern . '\b/iu';
    }

    protected function get_char_variants($char)
    {
        $map = [
            'а' => 'аa@', 'б' => 'бb', 'в' => 'вvw', 'г' => 'гg', 'д' => 'дd',
            'е' => 'еe€ё', 'ё' => 'ёеe', 'ж' => 'жzh', 'з' => 'зz3', 'и' => 'иi1',
            'й' => 'йy', 'к' => 'кk', 'л' => 'лl', 'м' => 'мm', 'н' => 'нn',
            'о' => 'оo0', 'п' => 'пp', 'р' => 'рrp', 'с' => 'сcs$', 'т' => 'тt',
            'у' => 'уyu', 'ф' => 'фf', 'х' => 'хxh', 'ц' => 'цc', 'ч' => 'чch',
            'ш' => 'шsh', 'щ' => 'щsch', 'ъ' => 'ъ', 'ы' => 'ыy', 'ь' => 'ь',
            'э' => 'эe', 'ю' => 'юyu', 'я' => 'яya',
            'a' => 'aа@', 'b' => 'bб', 'c' => 'cс', 'd' => 'dд', 'e' => 'eеё€',
            'f' => 'fф', 'g' => 'gг', 'h' => 'hх', 'i' => 'iи1', 'j' => 'jж',
            'k' => 'kк', 'l' => 'lл', 'm' => 'mм', 'n' => 'nн', 'o' => 'oо0',
            'p' => 'pр', 'q' => 'qк', 'r' => 'rр', 's' => 'sс$', 't' => 'tт',
            'u' => 'uу', 'v' => 'vв', 'w' => 'wв', 'x' => 'xх', 'y' => 'yуйы',
            'z' => 'zз', '0' => '0о', '1' => '1иi', '2' => '2', '3' => '3з',
            '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8',
            '9' => '9', '$' => '\$sс', '@' => '@а', '.' => '\.'
        ];

        foreach ($map as $key => $variants) {
            if (mb_strpos($variants, $char) !== false) {
                return array_map(function ($c) {
                    return preg_quote($c, '/');
                }, str_split($variants));
            }
        }

        return [preg_quote($char, '/')];
    }

    public static function getSubscribedEvents()
    {
        return [
            'core.posting_modify_submit_post_before' => 'check_forbidden_words',
        ];
    }

    public function check_forbidden_words($event)
    {
        $text = $this->prepare_text_to_check($event);
        $text_lower = mb_strtolower($text);
        
        // Сначала проверка белого списка по ОРИГИНАЛЬНОМУ тексту
        foreach ($this->whitelist as $word) {
            if (preg_match('/\b' . preg_quote($word, '/') . '\b/iu', $text_lower)) {
                return;
            }
        }
        
        // Два варианта проверки для черного списка:
        // 1. Оригинальный текст (для слов с пробелами и символами)
        // 2. Очищенный текст (для слитных слов)
        $text_cleaned = preg_replace('/[^a-zа-яё0-9]+/iu', '', $text_lower);
        
        // Проверка обычных запрещенных слов
        foreach ($this->patterns as $pattern) {
            if (preg_match($pattern, $text_lower) || preg_match($pattern, $text_cleaned)) {
                trigger_error($this->user->lang['ANTI_KRAKEN_BLOCKED']);
            }
        }
        
        // НОВАЯ ПРОВЕРКА: Проверка номеров телефонов
        foreach ($this->phone_patterns as $pattern) {
            if (preg_match($pattern, $text_lower)) {
                trigger_error($this->user->lang['ANTI_KRAKEN_BLOCKED']);
            }
        }
    }

    protected function prepare_text_to_check($event)
    {
        $message = $event['data']['message'] ?? '';
        $subject = $event['data']['post_subject'] ?? '';

        if (empty($subject)) {
            $subject = $this->request->variable('subject', '', true);
        }

        $combined = $message . ' ' . $subject;
        return $this->remove_invisible_chars($combined);
    }

    protected function remove_invisible_chars($text)
    {
        return preg_replace('/[\x{00AD}\x{034F}\x{061C}\x{115F}-\x{1160}\x{17B4}-\x{17B5}\x{180B}-\x{180E}\x{200B}-\x{200F}\x{2028}-\x{202F}\x{205F}-\x{206F}\x{FE00}-\x{FE0F}\x{FEFF}\x{FFA0}\x{1BCA0}-\x{1BCA3}\x{1D173}-\x{1D17A}\x{E0000}-\x{E0FFF}]/u', '', $text);
    }
}
Изображение

Вернуться в «ИИ расширения»