Задать вопрос
  • 404 ошибка при переходе на страницу рубрик?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    Проблема 404 была при указание rewrite в cpt:
    'rewrite' => array('slug' => '/', 'with_front' => false),

    Проблема 404 была решена так:
    'rewrite' => array('slug' => 'services', 'with_front' => false),
    Ответ написан
    Комментировать
  • Как настроить редирект со всех страниц сайта на эти же страницы его копии на другом домене?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    301 редирект всех запросов со старого домена (http/https), на новый (https).

    .htaccess:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^old\.ru$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.old\.ru$
    RewriteRule ^(.*)$ https://new.ru/$1 [R=301,L]
    Ответ написан
    Комментировать
  • Как сделать пунктирное подчеркивание ссылок?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Ответ написан
    Комментировать
  • Есть ли способы борьбы со спамными лидами?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    С начала декабря видим увеличение спамных лидов, прогрессия примерно такая: ноябрь 3%, декабрь 10%, январь 20%.

    Среднее поведение.
    В заявках указаны реально существующие номера телефонов, ФИО полностью, но когда менеджеры по ним звонят, то люди либо орут, что их достали уже звонками, а они нигде свои заявки не оставляли, либо вовсе не берут трубку.

    Среднее поведение.
    смотрела по вебвизору - похоже на поведение людей, но странное. вход на страницу, сразу переход к форме

    Простое поведение.
    ввод данных, причем не вставка сразу номера или ФИО, а виден набор (иногда видно, как что-то стирают и вводят вновь)

    Сложное поведение.
    Кто-то уже сталкивался с подобным

    "Сталкивался".
    Контекстологи не понимают в чем дело

    Им это и не нужно понимать, т.к. этим должны заниматься те, кто пишет подобный софт.
    как боролись? какие вообще варианты есть?

    уверяют что нужно ставить проги антифрода, но что-то не верится, что это поможет...

    1. Антифрод поможет, если против Вас боты начального уровня, которые не сильно заморачиваются в маскировку.
    2. Подтверждение заявок через смс, клиент оставляет заявку, Вы просите подтвердить его номер через смс. Таким образом Вы убиваете сразу двух зайцев, боретесь со спамом и можете эффективнее настраивать конверсию из сделок в crm для контекстной рекламы.

    В любом случае, бороться с фродом Вы сможете лишь на своем сайте, т.е. в случае чего, повлиять, например, на скликивание рекламы Вы не сможете.
    Ответ написан
    Комментировать
  • Как организовать закрытие вкладок автоматически по определенному url?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Через какой то скрипт хотя бы подскажите направление. В tampermonkey не нашел ничего подобного.

    По соображениям безопасности, никакой js скрипт или скрипт в tampermonkey (там тоже js) не сможет закрыть вкладку, которую открыл пользователь руками.

    Если же вкладку открыл скрипт, то ее можно закрыть так:
    // открыто
    window.open('youtube.com', '_blank');
    
    // закрыто
    if ('/youtube\.com/'.test(window.location.href)) {
        window.close();
    }
    Ответ написан
  • Как передать собственный класс на метод в качестве параметра по умолчании?

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

    Можно ли такое осуществлять? Или такое не стоит сделать даже если возможно?

    Можно. Не стоит.

    Значение аргументов по умолчанию в функции вычисляется в момент объявления функции, а не в момент обращения к ней.

    Например, экземпляр класса Test, который Вы пытаетесь использовать в качестве значения по умолчанию, будет создан в момент определения метода test, что может быть не тем, что Вы ожидаете и может привести к сложно отлаживаемым ошибкам из за неочевидного разделения состояния между экземплярами.

    Также, Ваш код приведет к ошибке, так как в момент определения метода test класс Test еще не полностью определен, и Вы не можете создать его экземпляр.

    Вместо этого, можно использовать None для аргумента по умолчанию, а внутри метода проверять, был ли передан аргумент, и если нет, то создавать новый экземпляр класса:
    class Test:
        def test(self, x=None):
            if x is None:
                x = Test()
            print(type(x))
    
    x = Test()
    x.test()

    Поделитесь целью использования такой схемы?
    Ответ написан
    4 комментария
  • Как ограничить количество подключений прокси в Pyrogram?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    в Pyrogram документации не нашел подобного

    Все верно, Pyrogram не настолько гибкий по прокси, в сравнение с Telethon. Используйте внешний менеджер подключений/проксей и не будите зависеть от конкретной библиотеки, например:
    import asyncio
    from pyrogram import Client
    from pyrogram.errors import PyrogramError
    
    class ProxyManager:
        def __init__(self, app, max_retries=5, retry_delay=1, proxy=None):
            self.app = app
            self.max_retries = max_retries
            self.retry_delay = retry_delay
            self.proxy = proxy
            self.client = None
    
        async def connect(self):
            for attempt in range(1, self.max_retries + 1):
                try:
                    print(f"Connection attempt #{attempt}")
                    self.client = Client(**self.app, proxy=self.proxy)
                    await self.client.start()
                    print("The connection was established successfully.")
    
                except PyrogramError as e:
                    print(f"Connection error: {e}")
                    if attempt == self.max_retries:
                        print("The maximum number of connection attempts has been reached, stop!")
                        break
    
                    await asyncio.sleep(self.retry_delay)
    
        async def disconnect(self):
            if self.client:
                await self.client.stop()
                print("Connection is closed.")
    
    app = {
        'api_id': 'YOUR_API_ID',
        'api_hash': 'YOUR_API_HASH',
        'session_name': 'your_session_name'
    }
    
    proxy = {
        'scheme': 'http',  # or 'socks5'
        'hostname': 'your.proxy.hostname',
        'port': 1080,
        'username': 'user',
        'password': 'password'
    }
    
    # test run
    async def main():
        manager = ProxyManager(app, max_retries=3, retry_delay=2, proxy=proxy)
        await manager.connect()
        await manager.disconnect()
    
    asyncio.run(main())
    Ответ написан
    1 комментарий
  • Как выровнять шрифт внутри line-height?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    В CSS существует ограниченный набор свойств для непосредственного управления межстрочным интервалом или отступами непосредственно от букв. Либо это line-height, либо возня с отрицательными margin или псевдо элементами.

    Ну вот и у госов теперь все "ровно":
    line-height: 1;

    65c355178a2f0946400951.png
    Ответ написан
  • PHPStorm плагин для комментариев/заметок без фиксирования в git?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Code Note
    Видео

    screenshot_4f5e4091-907d-49bf-b071-495922130fcb
    Ответ написан
    Комментировать
  • Как сделать 301 редирект со всех страниц вида /folder/1-2/p1.php, /folder/1-2/3-4/p1.php и т.д. на /folder/p1/?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    RewriteEngine On
    # /folder/ => /folder/file-name/
    RewriteCond %{REQUEST_URI} ^/folder/.+/(p[0-9]+)\.php$
    RewriteRule ^folder/.+/(p[0-9]+)\.php$ /folder/%1/ [R=301,L]
    Ответ написан
  • Нормально если первый стейт менеджер для react который я буду учить - будет mobx, а не Redux?

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

    Нормально ли будет если в резюме есть mobx вместо redux?

    Давайте проведем анализ хэхэ на 02.2024:
    - Redux (772 вакансии).
    - Mobx (235 вакансий).
    - Zustand (21 вакансия).

    Резюмируя, Ваш навык Mobx примерно в 3 раза менее ценен на рынке, чем навык Redux. Разумеется, сравнение поверхностное, но какой то вывод можно сделать.
    Ответ написан
    6 комментариев
  • Кто должен делать отправку формы на сайте?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Кто должен делать отправку формы на сайте?

    Тот, кто это обязан делать по тз или распоряжению тимлида. Если это нигде не определено, то:
    - front запрашивает у back схему api для отправки данных с формы, и программирует отправку формы с учетом этой схемы.
    - back пишет api, взаимодействует с данными с фронта, проектирует и работает с бд.
    Ответ написан
    Комментировать
  • Как я могу выявить вредоносный код на python?

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

    Своими глазами я вряд ли увижу, то чего стоило бы опасаться.

    Найти того, кто сможет.
    Есть ли какие то инструменты для выявления того, чего не должно быть в коде?

    Антивирус? Но врятли на python пишут вирусы, а все остальное на вирусы не тянет, но данные утащить может.
    Ответ написан
    3 комментария
  • Почему при загрузке сайта на Pages не подключаются стили CSS?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Неверные пути до css и js файлов на странице. Замените все части путей в html с ./libs/ на /lofthouse/libs/.

    https://antcosm.github.io/lofthouse/libs/youtubeLi... теперь доступен, как и другие файлы.
    Ответ написан
    Комментировать
  • Как заблокировать доступ к ресурсу для конкретного региона?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    GeoIP ngx_http_geoip_module

    1. Nginx должен включать модуль ngx_http_geoip_module.
    2. Качаем БД GeoLite2 Country.
    3. Пример конфига (nginx.conf), с отправкой всех из Индии в 403 лес:
    http {
        geoip_country /path/to/GeoLite2-Country.mmdb;
        map $geoip_country_code $allowed_country {
            default yes;
            IN no; # banned india
        }
    }
    
    server {
        if ($allowed_country = no) {
            return 403;
        }
    }
    Ответ написан
    5 комментариев
  • Есть ли отвественность за генерацию случайных данных?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Есть ли отвественность за генерацию случайных данных?

    И возник вопрос есть ли какие-то юридические ограничения на создание таких библиотек?

    1. За генерацию данных и создание таких инструментов - нет.
    2. За хранение и публикацию ПД субъекта без его разрешения и с нарушением законодательства - да.

    Условно, если у Вас случайно получилось сгенерировать реальные данные определенного человека из п1, то Вы автоматом попадаете под п2.

    P.S. ПД - это любые данные, на основание которых можно идентифицировать конкретного человека.
    Ответ написан
    Комментировать
  • Как получить индексы строк в openpyxl?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    https://openpyxl.readthedocs.io/en/latest/api/open...
    Обход всех строк на листе и вывод индекса каждой первой ячейки:
    from openpyxl import load_workbook
    
    wb = load_workbook('sheet.xlsx')
    sheet = wb.active
    
    for row in sheet.iter_rows():
        for cell in row:
            print(cell.row)
            break
    Ответ написан
    Комментировать
  • Как пофиксить ошибку с TeleBot?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    С моим токеном работает:
    import telebot
    
    bot = telebot.TeleBot("TOKEN")
    
    # handler /start
    @bot.message_handler(commands=['start'])
    def start_message(message):
        bot.send_message(message.chat.id, 'Йоу')
    
    bot.polling(none_stop=True)
    Ответ написан
    Комментировать
  • Ошибка 403 при парсинге сайта?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Обнаружил некую защиту "на лоха", а значит request и обычный selenium не справятся, буду использовать selenium + selenium-stealth (пример от сюда) + chrome + socks5 (рабочий, на момент теста):
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.chrome.options import Options
    from selenium_stealth import stealth
    
    proxy = '45.132.75.19:23820'
    
    options = Options()
    options.add_argument('--proxy-server=socks5://' + proxy)
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_argument("window-size=1920,1080")
    # options.add_argument("--incognito")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-plugins-discovery")
    options.add_argument("--start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    
    executable_path = './chromedriver-121.0.6167.85.exe'
    
    service = Service(executable_path=executable_path)
    driver = webdriver.Chrome(service=service, options=options)
    
    stealth(driver,
            languages=["en-US", "en"],
            vendor="Google Inc.",
            platform="Win64",
            webgl_vendor="Intel Inc.",
            renderer="Intel Iris OpenGL Engine",
            fix_hairline=True,
            run_on_insecure_origins=True,
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36',
            )
    
    try:
        driver.get('https://allegro.pl/kategoria/laptopy-491')
        time.sleep(30)
        print(driver.page_source)
    finally:
        driver.quit()

    Chromedriver качать здесь, он должен совпадать с мажорной версией Вашего Chrome браузера, который будет использовать Selenium.

    65c1e056ad6db620469150.png
    Ответ написан
    Комментировать