• Как получить список всех групп/каналов в которых находится пользователь 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 комментариев
  • Почему код разбиения на слагаемые не работает?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Почему когда я указываю большие разбиваемого и количества слогаемых,вылетает ошибка:
    print(partition(1024,5))

    Превышено количество рекурсивных вызовов в Python.

    Можно увеличить глубину рекурсий:
    import sys
    sys.setrecursionlimit(5000)

    Либо, переписать функцию в итеративном стиле:
    def partition(n, k):
        stack = [(n, k, [])]
        while stack:
            current_n, current_k, current_partition = stack.pop()
            
            if current_n == 0 and current_k == 0:
                print(" + ".join(map(str, current_partition)))
            elif current_n == 0 or current_k == 0:
                continue
            elif current_n < 0:
                continue
            else:
                for i in range(1, current_n+1):
                    new_n = current_n - i
                    new_k = current_k - 1
                    new_partition = current_partition + [i]
                    stack.append((new_n, new_k, new_partition))
    
    partition(5, 3)
    Ответ написан
    1 комментарий
  • Что означает выражение. {x:1} в f.строках python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Это "f-строки"/"форматированные строковые литералы", простой пример:
    x = 5
    y = 555
    print(f"{x:1}")  # "5", минимальная ширина поля вывода переменной x = 1 (вывести значение x, удостоверившись, что оно занимает по меньшей мере один символ)
    print(f"{x:3}")  # "  5"
    print(f"{y:3}")  # "555"
    
    # Округление Pi до десятичного значения
    pi = 3.141592653589793
    print(f"Pi: {pi:.1f}")  # Pi: 3.1
    Ответ написан
    Комментировать
  • Как добавить программу в автозагрузки в regedit на python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Как создать ярлык программы с «тихим» запуском?
    Там есть пример добавления в автозагрузку. Вам потребуется создать отдельный скрипт, который добавит Ваш основной скрипт в автозагрузку.

    UPD, Добавление программы в автозагрузки в regedit на python:
    import winreg
    
    # Добавляем в автозагрузку
    def add_to_startup(program_name, executable_path):
        # Реестр
        registry_path = winreg.HKEY_CURRENT_USER
        key_path = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
        
        try:
            # Открываем ключ реестра для записи
            with winreg.OpenKeyEx(registry_path, key_path, 0, winreg.KEY_WRITE) as registry_key:
                # Создание или обновление реестра
                winreg.SetValueEx(registry_key, program_name, 0, winreg.REG_SZ, executable_path)
            print(f"{program_name} добавлена в автозагрузку.")
            
        except PermissionError:
            print("Нужны админские права.")
            
    # Проверка программы в автозагрузке
    def check_startup_entry(program_name):
        registry_path = winreg.HKEY_CURRENT_USER
        key_path = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
        
        try:
            # Открываем ключ реестра для чтения
            with winreg.OpenKeyEx(registry_path, key_path, 0, winreg.KEY_READ) as registry_key:
                program_path, regtype = winreg.QueryValueEx(registry_key, program_name)
            print(f"{program_name} уже добавлена в автозагрузку с путем: {program_path}")
            
        except FileNotFoundError:
            print(f"{program_name} не найдена в автозагрузке.")
    
    if __name__ == "__main__":
        program_name = "GodzillaSoft"
        program_path = r"C:\path\GodzillaSoft.exe"
        
        check_startup_entry(program_name)
        add_to_startup(program_name, program_path)

    Важно! Добавление программы в автозагрузку без явного согласия пользователя может считаться вредоносным действием. А так же, осторожнее с реестром, можно одним запуском скрипта наломать много дров...
    Ответ написан
    3 комментария
  • Как глобально подключить переменные _breakpoints и использовать их в проекте NEXT?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    breakpoints.scss:
    $breakpoint_sm: 300px;
    $breakpoint_md: 700px;
    $breakpoint_xl: 1000px;

    BestComponent.scss:
    @import "breakpoints";
    
    @media screen and (max-width: $breakpoint_md) {
      // ...
    }

    index.scss:
    @import "fonts";
    @import "breakpoints";

    _app.tsx:
    import { FC } from "react";
    import { AppProps } from "next/app";
    import "./styles/index.scss";
    
    const App: FC<AppProps> = ({ Component, pageProps }) => (
      <Component {...pageProps} />
    );
    
    export default App;

    Если Вы пишите "реактивные" приложения, то я бы рекомендовал уходить от классического css/scss к css-in-js, например используя emotion.js.

    Но тут видите, мы все равно подключаем
    Dmitrijs Balcers "breakpoints"; в BestComponent, а надо без импорта, сразу

    В случае с SCSS переменными, они не могут быть доступны глобально без импорта, как это возможно с CSS переменными, которые определены в :root. Это ограничение SCSS и его способа компиляции в CSS.

    Варианты:
    - Использовать переменные :root:
    :root {
      --breakpoint-sm: 300px;
      --breakpoint-md: 700px;
      --breakpoint-xl: 1000px;
    }

    @media screen and (max-width: var(--breakpoint-md)) {}

    - Использовать sass-loader в webpack для автоматического импорта переменных в каждый файл:
    {
      test: /\.scss$/,
      use: [
        "style-loader",
        "css-loader",
        {
          loader: "sass-loader",
          options: {
            additionalData: `@import "path/breakpoints.scss";`
          }
        }
      ]
    }

    - Использовать css-in-js и не изобретать велосипеды.
    Ответ написан
    4 комментария
  • Стоил ли переплачивать за монитор?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Привет! Разница довольно большая между двумя претендентами.

    Мое мнение:
    1. Если деньги есть, бери U2412M.
    2. Если денег нет, езжай в магаз, посмотри на оба моника и после следуй пункту 1.

    То, что выбрал Dell - молодец, лучших альтернатив в сегменте до 30р еще нужно поискать...

    Мой рейтинг мониторов такой:
    DELL P2416D - есть денег нет.
    DELL P2415Q - если денег почти нет.
    DELL UP2715K - если деньги есть.

    Ну и самое главное, не забываем про видео-карту, ибо более 2560x1600 разрешение НЕ всякая нормально потянет.
    Ответ написан
  • Как подгружать код на страницу по нажатию на href?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Подгружать по клику есть, а тегов в вопросе: javascript || ajax || jquery - нет...
    Ответ написан
    1 комментарий
  • Верстка на CSS фреймворке - много тегов HTML или правила CSS?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Как верстать правильно и по "феншую"?

    - Я работаю по принципу: взял фреймворк - бери из него максимум и следуй базовым инструкциям этого фреймворка, даже если из-за этого будет раздутый код.
    Намного проще разбираться в будущем будет в чуть более раздутом коде, но который был написал по всем правилам данного фреймворка, чем в твоем 'легком-лаконичном' коде, который без бутылки с ходу не разберешь...
    Ответ написан
    Комментировать
  • Память DDR4 2400 ECC заведется при поддержке процессором максимум 2133?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    DDR4 1600/1866/2133 - здесь указана максимальная тактовая частота оперативы, которую процессор может поддерживать. Если оператива имеет более высокую частоту, то частота будет обрезана по максимально-разрешенной частоте для процессора (заведется, но на меньших частотах, скорее всего на 2133).

    Так-же если вставить дополнительный слот оперативы с меньшей частотой (чем у первой), то частота обоих планок будет равна наименьшей...
    Ответ написан
    Комментировать
  • Можете помочь с подбором комплектующих?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Привет!

    Нужно определиться, что именно Вы делаете больше за этим компом:
    1. Работа с программами в стилей рендеринга, графический и 3D дизайн, стриминг итп.
    2. Игры.

    Если больше работать, то AMD Ryzen 3 1300X и гнать его по самые небалуй.
    Если игры, то i3-8350K и гнать его до 4900Mgz.
    По деньгам выйдет, что конфиг на рязани немного дешевле (на 2-5р).

    Размышлял над i5-7500
    1. Ни в коем случае. Kaby lake годится, если будете работать без видюхи (а она у Вас есть, и неплохая), а если так, то kaby lake для Вас будет старьем 5 летней давности. Берем только новые coffe lake, либо старые skylake.
    2. Зачем вам такой кусок дерьма, как i5? Брать имеет смысл лишь i3, либо i7.

    Что рекомендую с intel:
    1. Берите i3-8350K - это не i3 и не i5, это обрезанный i5, но с конской частотой.
    2. Берем мать на z370.
    3. Берем хорошую башню либо сразу водянку на проц за 2.5р, гоним проц до 4900Mgz (берет спокойно, но можно до 5100Mgz, но опасно).
    Итог: получаем камень, который даже от новых i7 не отстает, но по деньгам в сравнение с конфигой i7 выигрываем 30-50%. Работоспособность на таком разгоне более 3-5 лет.
    Я так делал с Skylake i3, так и сделал с Coffe Lake i3. Если взять самый слабый i7, то я от него отстаю по мощности на 8%, доволен как слон.

    4. Свою оперативку выкидываем, ставим DDR4-2400, если будет SSD, то 8гб хватит за глаза. Если в матери будет всего 2 слота под оперативу, то берите одной планкой, чтобы потом при необходимости докупить аналогичную без проблем. Если-же будет 4 слота, то берем каждую планку по 4гб, чтобы в итоге получить 4 планки и 4х канальную память (если 4 канала тянет проц).
    Ответ написан
    Комментировать
  • Как получить последние добавленные продукты (WooCommerce)?

    Mike_Ro
    @Mike_Ro Автор вопроса
    Python, JS, WordPress, SEO, Bots, Adversting
    Отсортировать по дате, задать количество:

    $query_args = array(
        'showposts'   => 5,
        'post_status' => 'publish',
        'post_type'   => 'product',
        'orderby'     => 'date',
        'order'       => 'DESC',
    );
    $r = new WP_Query( $query_args );
    if ( $r->have_posts() ) {
        while ( $r->have_posts() ) {
            $r->the_post();
            // Вывод
        }
    }
    wp_reset_postdata();
    Ответ написан
    Комментировать