• Как проскролить страницу вверх при помощи puppeteer?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно крутануть саму страницу:
    await page.evaluate(() => {window.scroll(0,0)});

    Либо крутить колёсиком мыши:
    await page.goto(
      'https://mdn.mozillademos.org/en-US/docs/Web/API/Element/wheel_event$samples/Scaling_an_element_via_the_wheel?revision=1587366'
    );
    
    const elem = await page.$('div');
    const boundingBox = await elem.boundingBox();
    await page.mouse.move(
      boundingBox.x + boundingBox.width / 2,
      boundingBox.y + boundingBox.height / 2
    );
    
    await page.mouse.wheel({deltaY: -100});
    Ответ написан
    4 комментария
  • Может ли крупная компания добиться уголовной ответственности для спамеров, если они фактически сделали невозможной работу сайта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    И вот вопрос, а сможет ли крупная компания вроде Сбера, Яндекса, ВК добиться применения этих статей к подобным спамерам, если захочет?

    Вы не правильно поставили вопрос, перефразирую - сможет ли субъект со связями и соответствующим влиянием сделать X? - сможет!

    Абсолютно согласен с Drno , особенно про паяльник и дядей, которые будут вполне конкретными персонажами, с соответствующими сертификатами.
    Ответ написан
    6 комментариев
  • Что выбрать WP или Python+Django для сайта?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Короткий ответ (с учетом указанного ТЗ) - WP.

    Длинный ответ:
    публиковать страницы, создавать иерархию страниц, чпу url, какой то слайдер с картинками

    Учитывая типовое ТЗ, ответ - WP (все это уже реализовано, приимущественно бесплатно и в большом количестве).
    небольшое количество услуги в регионе

    Вы на старте выхода в интернет, предположу, что количество оказываемых услуг оффлайн - будет примерно равнозначно количеству оказываемых услуг онлайн, а значит производительность инструмента не первостепенна, ответ - WP.
    Нашли компанию, предлагает разработку сайта на WP или на Python+Django (дороже и дольше)

    Начнем с того, что это не равнозначные инструмент, ибо WP - это готовый движок/CMS для сайта + сам сайт (готовые шаблоны), развернул на хостинге и готово. А вот Django - это фреймворк, т.е. некий набор инструментов, да он позволяет сделать из него что угодно (ах*енно сделать (на правах отвечающего)), но потом. Соответственно, если вопроса в функционале и производительности не стоит (и предположу - сделать быстро) - выбираем WP, будет дешевле и быстрее.

    Что обычно я использую (от начального проекта к финальному):
    1. WP в стоке.
    2. Оптимизация производительности WP в 2-3 раза под конкретные задачи (от wp там мало что остается, но ценник и сроки еще не такие, как в п3).
    3. ASP.NET (если нужно быстрее любого WP и более специфический функционал).
    4. ASP.NET + кэширование (если прям совсем прижало по производительности).
    Ответ написан
    6 комментариев
  • Как посчитать разницу между двумя датами в секундах, минутах, часах и т.д.?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Почему так происходит, и как такое можно решить?

    Потому что объект Date возвращает дату, а не интервал времени. Попробуйте так:
    function getTimeDiff(startDate, endDate) {
      const diff = endDate - startDate;
    
      const seconds = Math.floor(diff / 1000);
      const minutes = Math.floor(seconds / 60);
      const hours = Math.floor(minutes / 60);
      const days = Math.floor(hours / 24);
      const months = Math.floor(days / 30); // ~30
      const years = Math.floor(days / 365); // ~365
    
      return {
        years,
        months: months % 12,
        days: days % 30,
        hours: hours % 24,
        minutes: minutes % 60,
        seconds: seconds % 60
      };
    }
    
    const today = new Date();
    const targetDate = new Date("2023-12-29 00:00:00");
    const diff = getTimeDiff(targetDate, today);
    
    console.log(`Разница, лет: ${diff.years}, месяцев: ${diff.months}, дней: ${diff.days}, часов: ${diff.hours}, минут: ${diff.minutes}, секунд: ${diff.seconds}`);
    
    // Разница, лет: 0, месяцев: 0, дней: 0, часов: 9, минут: 51, секунд: 22
    Ответ написан
    Комментировать
  • Как в wordpress сделать чтобы url категории заканчивался слешем?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    WordPress functions.php (для категорий, нужно очистить кэш wp (если используется)):
    // add a slash at the end of the url for categories
    function add_url_slash_from_categories() {
        global $wp_rewrite;
        $wp_rewrite->category_base = 'category/';
        $wp_rewrite->tag_base = 'tag/';
        $wp_rewrite->flush_rules();
    }
    
    add_action('init', 'add_url_slash_from_categories');

    WordPress functions.php (для всех, нужно очистить кэш wp (если используется)):
    // add a slash at the end of the url of all urls, excluding files
    function add_url_slash($url) {
        if (!preg_match('/\.[a-zA-Z0-9]+$/', $url)) {
            $url = trailingslashit($url);
        }
        return $url;
    }
    
    add_filter('add_url_slash', 'add_slash_to_all_urls');

    .htaccess (для всех, 301 редирект):
    # set 301 redirects for all urls without a slash at the end to a slash
    RewriteEngine On
    RewriteBase /
    RewriteRule ^category/(.*)$ /category/$1/ [R=301,L]
    RewriteRule ^tag/(.*)$ /tag/$1/ [R=301,L]
    Ответ написан
    1 комментарий
  • Как подключить script src= прямо в файле JS?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    const loadedModule = require('./modulePath/index.js');
    
    loadedModule.counter()
    console.log(loadedModule.awesomeValue);

    Хорошее руководство
    Ответ написан
    1 комментарий
  • Как при парсинге на node js смотреть цвет шрифта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    1. Перейти на страницу.
    2. Получить все элементы по селектору.
    3. В цикле обойти каждый элемент, выполняя код на странице, который получит и вернет цвет элемента, затем проверить на белый.
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('//some.com')
    
    const symbol = "₽";
    const xpathExpression = `(//span[contains(text(), '${symbol}')])`;
    const els = await page.$x(xpathExpression);
    
    for (const el of els) {
      const c = await page.evaluate(_el => {
        const s = window.getComputedStyle(_el);
        return s.color;
      }, el);
    
      if (c === 'rgb(255, 255, 255)') console.log('White is detected!')
    }
    
    await browser.close();
    Ответ написан
    Комментировать
  • Снять сайт с теневого бана Google?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    После получения ссылки на пациента, все более менее прояснилось. Ниже список того, что лично меня напрягло, когда я увидел сайт (от наиболее приоритетного к наименьшему):
    - При переходе с главной по элементу каталога, я получаю url //openworkshop.su/?page=1&page_size=30&name=&game=108600&game_select=false&dependencies=false&sort=iMOD_DOWNLOADS, это же уже как бы внутренняя страница, но по url - это главная.
    - Очень похожие title и description на разных страницах.
    - Минимум текста на страницах.
    - Отсутствуют атрибуты rel="canonical".
    - Отсутствуют H1-3 заголовки.
    - Ранее был проиндексирован дубль по //5.44.41.136/, хоть и щас его нет здесь нет, но я бы все равно отдавал 403 код.
    - Слишком много "красного" и "желтого" при диагностике.
    КартинкО
    658d19b88c8e5000123808.png
    Ответ написан
    1 комментарий
  • Как оптимизировать сервер на python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    как можно улучшить код, чтобы данные с сервера к клиенту предавались быстрее

    Я бы использовал следующее:
    - Асинхронность с Asyncio.
    - Сжимать аудио перед отправкой на клиент.

    Если я правильно понимаю, Вы используете новое соединение для каждого запроса? Может лучше постоянное?
    Ответ написан
    2 комментария
  • Можно ли использовать pnpm из РФ?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно ли использовать pnpm из РФ?

    Нужно! Хоть владелец площадки и наложил собственные санкции, но у меня лично проблем не возникает (без vpn).
    Ответ написан
    2 комментария
  • Почему модуль winsound не воспроизводит звук?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Вы не передали переменную с путем до "звука":
    import winsound
    sound_timer = 'stoping.wav'
    # winsound.PlaySound('sound', winsound.SND_FILENAME)
    winsound.PlaySound(sound_timer, winsound.SND_FILENAME | winsound.SND_LOOP)

    Расширенное руководство.
    Ответ написан
  • Как составить HTTP post запрос на dadata?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Помогите составить запрос с помощью модуля requests

    Вы имели ввиду "напишите за меня запрос с помощью модуля requests"?

    На основе официального примера, с помощью модуля requests:
    import requests
    import json
    
    api_key = "api_key"
    secret_key = "secret_key"
    api_url = "https://cleaner.dadata.ru/api/v1/clean/address"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Token {api_key}",
        "X-Secret": secret_key
    }
    
    # data
    data = ["мск сухонска 11/-89"]
    
    # requests
    response = requests.post(api_url, headers=headers, data=json.dumps(data))
    
    # check response
    if response.status_code == 200:
        print(f"Success: {response.json()}")
    else:
        print(f"Failed: {response.status_code}, {response.text}")
    Ответ написан
    Комментировать
  • Как запретить пользователям из России обращаться к определенным функциям сервера?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    ФЗ № 406 от 31.07.2023:
    Владелец сайта и (или) страницы сайта в сети "Интернет", и (или) информационной системы, и (или) программы для электронных вычислительных машин, являющийся российским юридическим лицом или гражданином Российской Федерации и осуществляющий свою деятельность в сети "Интернет" на территории Российской Федерации, в случае, если доступ к информации, размещенной на его сайте и (или) странице сайта в сети "Интернет", и (или) в его информационной системе, и (или) программе для электронных вычислительных машин, предоставляется пользователям, прошедшим авторизацию, обязан проводить ее в отношении пользователей, находящихся на территории Российской Федерации, одним из следующих способов:

    - с использованием абонентского номера оператора подвижной радиотелефонной связи в порядке...
    - ЕСИА...
    - ЕБС...
    - с использованием иной информационной системы, обеспечивающей авторизацию пользователей сайтов и (или) страниц сайтов в сети "Интернет"...

    Закон обязывает всех владельцев "веб-площадок" (зарегистрированных на территории РФ) с возможность авторизации пользователей (находящихся на территории РФ) производить эту "авторизацию" любым из перечисленных способов.

    Тут интересный момент в "находящихся на территории РФ" пользователей. Соответственно, Вы обязаны удостовериться, находится ли пользователь на территории РФ или нет. Варианты определения геолокации пользователя:
    - IP-адрес (своя бд, сторонний сервис, WebRTC).
    - HTML5 Geolocation API.
    - Часовой пояс браузера.
    - Геолокация у мобильных устройств.

    Но в отношение IP имеется №152-ФЗ, который гласит "персональные данные - любая информация, относящаяся к прямо или косвенно определенному или определяемому физическому лицу (субъекту персональных данных)", а значит IP сюда тоже можно "натянуть на глобус", соответственно, вначале необходимо спросить разрешение на обработку данных о любой геолокации пользователя, а затем, если он разрешит - проверять, "верблюд ли он". Соответственно, если пользователь не разрешит, то Вы не имеете право предоставлять авторизацию, через "иные сервисы".
    Т.е. единственный выход выходит сервисы которые каким-то образом ассоциируют IP со страной/регионом/городом и делятся этой информацией по подписке, либо предоставляют готовую БД, но у неё проблема в потере актуальности со временем

    Именно, платить в случае не верного определения - Вам.
    Ответ написан
    Комментировать
  • Почему бот дважды выполняет команду (telebot)?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Почему бот дважды выполняет команду (telebot)?

    Присмотритесь внимательнее на свой код, в цикле происходит отправка одного и того же сообщения столько раз, сколько пользователей в чате (дважды, если пользователей в чате тоже двое):
    for user in range(users):
        try:
            bot.send_message(message.chat.id, msg)
    Ответ написан
  • Страницы с GET-параметрами в sitemap.xml, плохо?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Если это фильтры для магазина, либо эти url параметры как то изменяют поведение/содержимое страницы, тогда нормально. В остальном случае - лучше от них избавляться.
    Ответ написан
    Комментировать
  • Как исключить записи отдельной категории своей таксономии WordPress?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Параметры Таксономий

    Получаем все записи с таксономией offer_cat, исключая записи с id 100, 101 и 102:
    $q = new WP_Query([
      'post_type' => 'offer',
      'posts_per_page' => 99,
      'tax_query' => [
        [
          'taxonomy' => 'offer_cat',
          'field' => 'term_id',
          'terms' => [100, 101, 102],
          'operator' => 'NOT IN',
        ],
      ],
    ]);

    Получаем записи (3) с таксономией offer_cat и id 100, 101 и 102:
    $q = new WP_Query([
      'post_type' => 'offer',
      'posts_per_page' => 99,
      'tax_query' => [
        [
          'taxonomy' => 'offer_cat',
          'field' => 'term_id',
          'terms' => [100, 101, 102],
          'operator' => 'IN',
        ],
      ],
    ]);
    Ответ написан
    1 комментарий
  • Стоил ли экранировать вывод Contact Form 7?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Стоил ли экранировать вывод Contact Form 7?

    Если Вы под "экранировать" понимаете санитайзинг (Sanitize), то да. Лишний слой безопасности, который не зависит от конкретного плагина - хуже не сделает (если написан не криво).
    Ответ написан
    Комментировать
  • Почему не обновляется tittle и description в поисковиках?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Поисковикам нужно больше времени, чтобы обновить данные или я что-то неправильно сделал?

    Нужно. Но, если ПС посчитает, что title/desctiption не соответствуют ключу, а страница в целом соответствует, то ПС может использовать иные данные со страницы.
    Ответ написан
    2 комментария
  • Почему при использовании .toUTCString() у меня получается не то время?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Tue Dec 19 2023 15:15:27 GMT+0600 (Восточный Казахстан)
    popup.js:22 Tue, 19 Dec 2023 09:15:27 GMT

    Все верно он отображает, а отображает он это с учетом смещения на 6 часов.

    Вот пример вычисления настоящей и UTC даты, а так же настоящего времени (nowTime()):
    const date = new Date();
    const nowTime = () => {
      const hours = date.getHours().toString().padStart(2, '0');
      const minutes = date.getMinutes().toString().padStart(2, '0');
      const seconds = date.getSeconds().toString().padStart(2, '0');
    
      return `${hours}:${minutes}:${seconds}`
    }
    
    console.log(`Local date: ${date}`);
    console.log(`Local time: ${nowTime()}`);
    
    console.log(`UTC date: ${date.toUTCString()}`);
    console.log(`Offset hours: ${date.getTimezoneOffset() / 60}`);
    
    // Local date: Wed Dec 20 2023 09:24:43 GMT+0300 (Москва, стандартное время)
    // Local time: 09:24:43
    // UTC date: Wed, 20 Dec 2023 06:24:43 GMT
    // Offset hours: -3
    Ответ написан