• Как получить элемент по селектору из переменной?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    jquery:
    const currentSlide = swp.slides[activeIndex]
    const btn = $(currentSlide).find('.header-banner-swiper__slide-btn');

    vanilla:
    const currentSlide = swp.slides[activeIndex]
    const btn = currentSlide.querySelector('.header-banner-swiper__slide-btn');
    Ответ написан
    Комментировать
  • Где искать JS код если в консоль показывает что он в VM?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    JS из WM - это что то вроде выполнение кода в контексте браузера, но не из js файла при загрузке страницы. Как вариант, где искать: innerHTML, eval, createElement(script).
    Ответ написан
    Комментировать
  • Почему переменная класса становится undefined при обращении из метода?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Стрелочная функция не имеет своего this, соответственно возьмет его из скоупа выше:
    MyFunc = (e) => {
      console.log("MyVariable: " + this.MyVariable); // oh yes
    }
    Ответ написан
    Комментировать
  • Как сделать проще. компактней код?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Попроще, как заказывали!
    const clickTargetElement = document.querySelector('.hiking__about_item_img');
    
    const imageConfigurations = {
      primaryImage: {
        htmlElement: document.querySelector('.img1'),
        sourcePaths: ['img/about_hiking/1.png', 'img/about_hiking/2.png'],
        altTexts: ['House and mountains in the background', 'Snowy mountains']
      },
      secondaryImage: {
        htmlElement: document.querySelector('.img2'),
        sourcePaths: ['img/about_hiking/1.png', 'img/about_hiking/2.png'],
        altTexts: ['House and mountains in the background', 'Snowy mountains']
      }
    }
    
    const toggleImageAttributes = ({htmlElement, sourcePaths, altTexts}) => {
      const isPrimarySource = htmlElement.getAttribute('src') === sourcePaths[0];
      const indexToUse = isPrimarySource ? 1 : 0;
    
      htmlElement.setAttribute('src', sourcePaths[indexToUse]);
      htmlElement.setAttribute('alt', altTexts[indexToUse]);
    }
    
    clickTargetElement.addEventListener('click', () => {
      Object.values(imageConfigurations).forEach(toggleImageAttributes);
    });
    Ответ написан
    4 комментария
  • Как отправить запрос с конкретной формы и передать ID или Class формы в PHP-скрипт через ajax-запрос?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Как нужно вызывать js-функцию, чтобы она брала данные с той формы которую отправили? И как передать через ajax или ID, или Class формы?

    Модифицировать кнопку форм, чтобы она вызывала событие формы submit:
    <button type="submit" class="button">Отправить</button>

    Создадим один обработчик для всех форм:
    async function sendForm(form) {
      const data = {
        name: form.querySelector("input[name='name']").value,
        email: form.querySelector("input[name='email']").value,
        phone: form.querySelector("input[name='phone']").value,
        message: form.querySelector("textarea[name='message']").value,
        formId: form.id,
        formClass: form.className
      }
    
      try {
        const response = await fetch('php/send.php', {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify(data)
        });
    
        if(response.ok) {console.log('Success send form')}
        else console.log('Error send form', response);
      }
    
      catch(error) {console.log('Error: ' + error.message)}
    }

    Вешаем слушателей на submit форм:
    document.querySelector('#form1').addEventListener('submit', (e) => {
      e.preventDefault();
      sendForm(event.target);
    });
    
    document.querySelector('#form2').addEventListener('submit', (e) => {
      e.preventDefault();
      sendForm(event.target);
    });

    В зависимости от формы нужно в PHP-скрипте менять тему письма.

    В php обработчике формы обрабатываем полученные данные от js (php у меня не очень):
    $json = file_get_contents("php://input");
    $data = json_decode($jsonData, true);
    
    // get formId and formClass
    $id = $data['formId'];
    $class = $data['formClass'];
    
    // this change type email message
    Ответ написан
    4 комментария
  • Как написать скрипт/софт на Python который будет автоматически отвечать на сообщения в телеграмме по шаблону?

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

    Рекомендую начать с гугла и запроса "python telegram libraries".
    С помощью какого фреймворка вообще пишутся подобные скрипты ?

    python-telegram-bot
    Telethon
    Aiogram
    И возможно ли это реализовать с помощью телеграмм бота написанного на aiogram?

    Возможно.
    Ответ написан
    Комментировать
  • Как или чем решить новую капчу Yandex SmrtCaptcha?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Существуют ли браузерные расширения для автоматического решения данной капчи?

    Нет, в этом весь смысл капчи.
    Меня эта капча настолько бесит, что я даже готов потратить время и написать свое расширение для обхода, лишь бы было внешнее API для ее решения.

    Пишите - ждать по 20-60 секунд для расшифровки, через специализированные сервисы + это не бесплатно, смысла для личного пользования практически нет.

    alexalexes все правильно написал в комменте.
    Ответ написан
    2 комментария
  • Как правильно закрыть от индексации URL с GET параметром источника ссылки?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Не индексировать страницы в url которых имеется url параметр param, robotx.txt:
    User-agent: *
    Disallow: /*?param=

    Но лучше использовать канонические адреса, html страницы:
    <link rel="canonical" href="https://www.example.com/statya"/>
    Ответ написан
    1 комментарий
  • Насколько законно для крупной компании пробивать человека по почте?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Насколько законно для крупной компании пробивать человека по почте?

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

    Соответственно, в теории можно подать на них в суд за использование ПД, им придется доказать, что Вы давали такое согласие. Однако, на кого Вы будите подавать в суд? Ответчик кто? Вся компания? Конкретный чел? Может, кот пробежал по клаве и взломал пентагон? - экспертизы в студию!

    Я хочу узнать, насколько незаконны их действия?

    Законны, пока не доказано обратное.

    На что они меня пробили, отправили письмо моему начальнику, а сама компания чуть ли не угрожает мне.

    Как мерили уровень "угроз"?
    Нет такой статьи "покушение на угрозу". Это не угроза, пока не доказано обратное.

    Если резюмировать, то овчинка выделки не стоит, с обоих сторон.
    Ответ написан
    Комментировать
  • Next JS это только про SSR или на нём приложение ничем не отличается от реакта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Next JS это только про SSR

    Это про любой тип веб-приложения:
    - SSR.
    - SSG.
    - ISR.

    Ну а еще, это фактически единственный инструмент, который может все и сразу под React.

    Next JS это тот же реакт в котором сразу есть все необходимые пакеты для работы с ним или он все же медленней обычного spa приложения на реакте с пакетами?

    - Все инструменты в наличие.
    - Next может экспортировать собранное React приложение, после чего - некста там уже не будет, а статика, маршрутизация и реактивность останется. Что быстрее статики?
    что в нексте реакт всегда обращается к своему серверу для SSR

    Как настроите, так и будет работать. Можно всегда, можно иногда, можно никогда.
    а у обычного реакта мы фетчем просто запросы шлем, когда все spa приложение очень быстро работает без лишних запросов на сервер

    На Next тоже самое можно. А Ваш SPA в SEO может? А рендерить одни страницы без SEO, вторые ПРЕрендерить с SEO, а остальные и так и так на лету может? А единовременно в рамках одного приложения? А еще и без дополнительных библиотек? А еще с конским комьюнити в рамках одного инструмента?

    Еще начинают активно внедряться Server Components, которые по некоторым отзывам - могут стать отраслевым стандартом.

    Если Вас интересует лишь SPA без SEO и дополнительных опций рендеринг, который будет рендериться лишь на клиенте, то оптимальнее будет выбрать лишь React + Роутер + WebPack в качестве сборщика.

    Vercel

    Vercel, оплата интеграции по стандартному тарифу, ну Вы знаете ;)
    Ответ написан
    1 комментарий
  • Как получить список всех групп/каналов в которых находится пользователь Telegram?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    https://github.com/LonamiWebs/Telethon
    https://docs.telethon.dev/en/stable/concepts/entit...
    from telethon import TelegramClient, utils
    
    # config
    api_id = 'id'
    api_hash = 'hash'
    phone = 'phone'
    
    client = TelegramClient('session_name', api_id, api_hash)
    
    async def main():
        # authentication
        await client.start(phone)
        
        # get group and channel list
        dialogs = await client.get_dialogs()
    
        # print group and channel data
        for dialog in dialogs:
            if dialog.is_group or dialog.is_channel:
                print(f"{dialog.name}: {dialog.id}")
    
    # start
    client.loop.run_until_complete(main())
    Ответ написан
    4 комментария
  • Является ли замена iframe ютуб ролика на lite-youtube таким кодом оптимальной?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Цикл можно оптимизировать:
    foreach($matches[1] as $index => $video_id) {
        $replacement = '<lite-youtube videoid="' . $video_id . '" params="controls=1"></lite-youtube>';
        $content = str_replace($matches[0][$index], $replacement, $content);
    }

    А существует ли вообще matches?
    if(!empty($matches[0]))
    Если src не идет первым во фрейме, то Ваша регулярка не сработает, можно сделать так:
    '/<iframe[^>]*src=\"https:\/\/www\.youtube\.com\/embed\/([^\?"]+)(\?[^\"]*)?\"[^>]*><\/iframe>/';
    Ответ написан
    Комментировать
  • Нужно ли снова устанавливать Node.js для каждого нового проекта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Попробую объяснить простым языком.

    0. Каждый проект по умолчанию имеет свои локальный пакеты (библиотеки), которые самостоятельно устанавливаются в корневую директорию node_modules, они устанавливаются на основе файла проекта package.json (инициализация).

    Предположим, что Вы не используете контейнеризацию, то:
    1. Ноду необходимо ставить глобально, например 18 версии. Что такое глобально? В таком случае, все Ваши проекты NodeJS смогут использовать эту ноду, хотя нода при этом не будет находиться локально ни в одном из Ваших проектов.
    2. Если все Ваши проекты используют исключительно ноду 18 версии, то дополнительную ноду ставить не требуется.
    ---
    3. Если у Вас проекты используют разные версии ноды, то рекомендую с нодой работать не на прямую, а через nvm (установка/удаление/переключение).
    ---
    4. Если Вы используете контейнеризацию, то обычно, нода+проект ставится в каждый контейнер.
    Ответ написан
    Комментировать
  • Как создать пункт меню и страницу в админке Wordpres через плагин?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Создаем плагин, wp-content/plugins/best-plugin/best-plugin.php:
    <?php
    /**
     * Plugin Name: Чумовой плагин
     * Description: Это плагин, твердо и четко!
     */
    
    if(!defined('ABSPATH')) {
      exit;
    }
    
    class Best_Plugin {
      protected $menu_slug = 'best-plugin';
    
      public function __construct() {
        // добавление страницы с пунктом меню
        add_action('admin_menu', [$this, 'add_admin_page']);
    
        // добавление ссылки на настройки плагина в списке плагинов
        add_filter(
          'plugin_action_links_' . plugin_basename(__FILE__),
          [$this, 'add_settings_link']
        );
      }
    
      // страница, любое содержимое страницы, обычно это винегрет из html/js/php
      public function add_page() {}
    
      // добавление страницы с пунктом меню
      public function add_admin_page() {
        add_options_page(
          'Страница чумового плагина',
          'Чумовой плагин',
          'manage_options',
          $this->menu_slug,
          [$this, 'add_page'],
          1
        );
      }
    
      // добавление ссылки на настройки в списке плагинов
      public function add_settings_link($links) {
        $settings_link = "<a href=\"options-general.php?page={$this->menu_slug}\">Настройки чумового плагина</a>";
        array_unshift($links, $settings_link);
        return $links;
      }
    }
    
    new Best_Plugin();
    Ответ написан
    Комментировать
  • Как спарсить комментарии под постом вк на Python?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Да и по остальным моментам опыта и знаний 0

    Здесь есть 2 варианта:
    1. Использовать родной api ВК.
    2. Использовать сторонний фреймворк для тестирования веб-приложений. Но, учитывая, что знаний у вас 0, то используйте п1.

    https://vk.com/dev, заюзаем метод wall.getComments.

    Получение комментов из поста:
    import requests
    
    TOKEN = 'token'
    OWNER_ID = 'user_or_group_id'
    POST_ID = 'post_id'
    
    res = requests.get(
        'https://api.vk.com/method/wall.getComments',
        params = {
            'owner_id': OWNER_ID,
            'post_id': POST_ID,
            'access_token': TOKEN,
            'v': '5.130'
        }
    )
    
    comments = res.json()


    спарсить комментарии со всех постов
    сложить в один файл, преобразовав в вид ссылки
    удалить дубликаты
    рандомно выбрать 1 победителя, среди комментариев
    парсить по ключевому слову "участвую"
    что бы программа сама открыла ссылку победителя и отправила сообщение мол "вы победили"

    Комменты у Вас получены, осталось 5 шагов из 6, дерзайте!
    Ответ написан
    2 комментария
  • Бесплатный онлайн-чат для сайта на JS?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    https://www.chatwoot.com/
    https://github.com/chatwoot/chatwoot

    Self-hosted, десктоп/мобильное приложение, интеграции, боты, бесплатно!
    Ответ написан
    9 комментариев
  • Как сверстать такой блок?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Если Вы хотите, чтобы размеры ячеек были определены исключительно размерами изображений, то гриды не лучший вариант, а вот флексы - да. Для заполнение колонки изображением, использовал object-fit (contain/cover).


    Если задача будет еще сложнее, то лучше использовать masonry grid, например https://masonry.desandro.com/ .
    Ответ написан
    7 комментариев
  • Как выбрать значение в дропдаун меню используя selenium?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Got error selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated

    Как можно поправить? На экране он виден

    Для парсера он не виден, по разным причинам.

    Попробуйте так:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("example.com")
    
    # находим и кликаем на элемент .SumoSelect
    dropdown_container = driver.find_element(By.CSS_SELECTOR, ".SumoSelect")
    dropdown_container.click()
    
    # ждем появления элемента li.opt label, но не более 10 сек
    option_to_select = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "li.opt label"))
    )
    
    # итерируемся по всем option и кликаем, если текст option равен AB
    for option in options:
        if "AB" == option.text.strip():
            option.click()
            break
    else:
        print("Не удалось найти нужную опцию.")
    
    driver.quit()
    Ответ написан
    1 комментарий
  • Как получить данные из get параметров и подставить их в запрос getStaticProps?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Если параметры динамически изменяются в зависимости от действий пользователя с интерфейсом (фильтры, пагинация итп.), статическая генерация не лучший вариант. В таком случае, лучше использовать хуки useState и useEffect для хранения и изменения get параметров, и последующего выполнения запроса к API.

    Но если прям невтерпеж, то, как вариант:
    export const getServerSideProps = async (context) => {
      const page = context.query.page || 1;
      
      try {
        const res = await axios.get(`tracks?page=${page}`);
        return {
          props: {
            tracks: res.data.items,
          },
        }
      } catch (e) {
        return {
          notFound: true,
        }
      }
    }
    
    export const getStaticProps = async (context) => {
      const page = context.params.page;
      // code
    }
    Ответ написан
    Комментировать
  • Насколько сейчас актуальна html карта сайта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно ли обойтись без неё

    Можно, законом не запрещено.
    или же это может хоть и маленьким, но фактором роста?

    Да.

    UPD:
    Так нет, я же не xml карту имел ввиду, а html

    Если все Ваши страницы хорошо перелинкованы, то смысла в "html-карте" нет, но xml-карта по прежнему актуальна.
    Ответ написан
    5 комментариев