Задать вопрос
  • Как через JS проверить что пользователь пользуется встроенным браузером?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Есть ли какой-то media query для этого?

    Нет.
    Или всякими browser detector-ами пользоваться надо?

    Только косвенно, по User-Agent или отсутствию некоторых функций, например serviceWorker.

    Пример проверки "встроенных браузеров", используя User-Agent:
    function isEmbedded(userAgent) {
      const userAgents = ['FBAV', 'Instagram', 'Snapchat', 'Twitter'];
      return userAgents.some(id => userAgent.includes(id));
    }
    
    console.log(isEmbedded(window.navigator.userAgent)); // true

    Пример проверки "встроенных браузеров", используя отсутствие функции serviceWorker:
    if (!('serviceWorker' in navigator)) console.log('Embedded?');

    Библиотека Bowser позволяет проще получать данные о браузере.
    Ответ написан
    Комментировать
  • Как отправить решение капчи?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Подставить код-решение в поле, которое ранее необходимо было сделать display=block, а затем нажать на кнопку войти, ну или любое другое действие, которое отслеживает рекапча.
    КартинкО
    659abb0ea29eb164258346.png
    Ответ написан
  • Как найти элемент по index в selenium?

    Mike_Ro
    @Mike_Ro Куратор тега Selenium
    Python, JS, WordPress, SEO, Bots, Adversting
    Документация:
    fruit = driver.find_element(By.CSS_SELECTOR, '[index="76"]')

    Если элемент динамический, то необходимо его вначале дождаться, используя Waiting Strategies.
    Ответ написан
    Комментировать
  • Как проскролить страницу вверх при помощи 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 в стоке + сборка фронта (webpack) с оптимизацией + кэширование.
    2. Докупка железа и горизонтальное масштабирование п1 балансировщиком.
    3. Профилирование и переписывание определенных запросов под конкретные задачи в самом WP, обычно добавляет производительности в 2-3 раза (от wp там мало что остается, но ценник и сроки еще не такие, как в п4).
    4. Python + Django + кэширование (если нужно быстрее любого WP и более специфический функционал).
    5. П4 + FastAPI (если прям совсем прижало по производительности).
    Ответ написан
    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 Куратор тега WordPress
    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 Куратор тега WordPress
    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 комментарий