Задать вопрос
  • Как распарсить смешанный тип json-данных?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Не очень понятен вопрос.

    Если точно известно что там всё есть, то обращаться напрямую:
    parsed_data = json.loads(json_data)
    ip_address = parsed_data["data"]["ipAddress"]


    Если могут быть сюрпризы, то:
    ip_address = parsed_data.get("data", {}).get("ipAddress", "N/A")

    import json
    
    json_data = '''
    {
      "data": {
        "ipAddress": "192.168.1.1",
        "abuseConfidenceScore": 85
      }
    }
    '''
    parsed_data = json.loads(json_data)
    try:
        ip_address = parsed_data.get("data", {}).get("ipAddress", "N/A")
        score = parsed_data.get("data", {}).get("abuseConfidenceScore", 0)
        print(f"IP: {ip_address}, Score: {score}")
    except Exception as e:
        print(f"Ошибка: {e}")
    Ответ написан
    Комментировать
  • Почему не получается создать профиль в программе Dolphin{anty}?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    У меня так сработало:
    import requests
    
    token = '...'
    headers = {
        "Authorization": f"Bearer {token}",
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    
    # Обязательные параметры (заполните своими значениями):
    name = "lol"  # Обязательное поле
    platform = "windows"  # Обязательное поле (например: "windows", "mac", "linux")
    browser_type = "anty"  # Обязательное поле (например: "chrome", "firefox", "anty")
    proxy_type = "http"
    proxy_host = "None" # Тут тоже что-то своё надо, видимо, вставлять.
    useragent_mode = "manual"
    useragent_value = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    
    # Остальные параметры (можно оставить пустыми или заполнить по необходимости):
    tags = []
    tabs = ""
    main_website = ""
    webrtc_mode = ""
    webrtc_ip_address = ""
    canvas_mode = ""
    webgl_mode = ""
    webgl_info_mode = ""
    webgl_info_vendor = ""
    webgl_info_renderer = ""
    # Заменить webgl2Maximum на ваше. Это всего лишь пример:
    webgl_info_webgl2_maximum = r'{\"MAX_SAMPLES\": 8, \"MAX_DRAW_BUFFERS\": 8, \"MAX_TEXTURE_SIZE\": 16384, \"MAX_ELEMENT_INDEX\": 4294967294, \"MAX_VIEWPORT_DIMS\": [16384, 16384], \"MAX_VERTEX_ATTRIBS\": 16, \"MAX_3D_TEXTURE_SIZE\": 2048, \"MAX_VARYING_VECTORS\": 30, \"MAX_ELEMENTS_INDICES\": 2147483647, \"MAX_TEXTURE_LOD_BIAS\": 15, \"MAX_COLOR_ATTACHMENTS\": 8, \"MAX_ELEMENTS_VERTICES\": 2147483647, \"MAX_RENDERBUFFER_SIZE\": 16384, \"MAX_UNIFORM_BLOCK_SIZE\": 65536, \"MAX_VARYING_COMPONENTS\": 120, \"MAX_TEXTURE_IMAGE_UNITS\": 32, \"MAX_ARRAY_TEXTURE_LAYERS\": 2048, \"MAX_PROGRAM_TEXEL_OFFSET\": 7, \"MIN_PROGRAM_TEXEL_OFFSET\": -8, \"MAX_CUBE_MAP_TEXTURE_SIZE\": 16384, \"MAX_VERTEX_UNIFORM_BLOCKS\": 13, \"MAX_VERTEX_UNIFORM_VECTORS\": 4096, \"MAX_COMBINED_UNIFORM_BLOCKS\": 60, \"MAX_FRAGMENT_UNIFORM_BLOCKS\": 13, \"MAX_UNIFORM_BUFFER_BINDINGS\": 72, \"MAX_FRAGMENT_UNIFORM_VECTORS\": 4096, \"MAX_VERTEX_OUTPUT_COMPONENTS\": 124, \"MAX_FRAGMENT_INPUT_COMPONENTS\": 124, \"MAX_VERTEX_UNIFORM_COMPONENTS\": 16384, \"MAX_VERTEX_TEXTURE_IMAGE_UNITS\": 32, \"MAX_FRAGMENT_UNIFORM_COMPONENTS\": 16384, \"UNIFORM_BUFFER_OFFSET_ALIGNMENT\": 256, \"MAX_COMBINED_TEXTURE_IMAGE_UNITS\": 64, \"MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\": 229376, \"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\": 4, \"MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\": 229376, \"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\": 4, \"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\": 128}'
    notes_icon = ""
    notes_color = ""
    notes_style = ""
    notes_content = ""
    timezone_mode = ""
    timezone_value = ""
    locale_mode = ""
    locale_value = ""
    status_id = ""
    geolocation_mode = ""
    geolocation_latitude = ""
    geolocation_longitude = ""
    cpu_mode = ""
    cpu_value = ""
    memory_mode = ""
    memory_value = ""
    do_not_track = ""
    proxy_id = ""
    
    proxy_port = ""
    proxy_login = ""
    proxy_password = ""
    proxy_name = ""
    proxy_change_ip_url = ""
    
    # F-строка
    payload = f'name={name}&tags%5B%5D={tags}&tabs={tabs}&platform={platform}&mainWebsite={main_website}&useragent%5Bmode%5D={useragent_mode}&useragent%5Bvalue%5D={useragent_value}&webrtc%5Bmode%5D={webrtc_mode}&webrtc%5BipAddress%5D={webrtc_ip_address}&canvas%5Bmode%5D={canvas_mode}&webgl%5Bmode%5D={webgl_mode}&webglInfo%5Bmode%5D={webgl_info_mode}&webglInfo%5Bvendor%5D={webgl_info_vendor}&webglInfo%5Brenderer%5D={webgl_info_renderer}&webglInfo%5Bwebgl2Maximum%5D={webgl_info_webgl2_maximum}&webrtc%3A%20%7Bmode%3A%20%22altered%22%2C%20ipAddress%3A%20null%7D&notes%5Bicon%5D={notes_icon}&notes%5Bcolor%5D={notes_color}&notes%5Bstyle%5D={notes_style}&notes%5Bcontent%5D={notes_content}&timezone%5Bmode%5D={timezone_mode}&timezone%5Bvalue%5D={timezone_value}&locale%5Bmode%5D={locale_mode}&locale%5Bvalue%5D={locale_value}&statusId={status_id}&geolocation%5Bmode%5D={geolocation_mode}&geolocation%5Blatitude%5D={geolocation_latitude}&geolocation%5Blongitude%5D={geolocation_longitude}&cpu%5Bmode%5D={cpu_mode}&cpu%5Bvalue%5D={cpu_value}&memory%5Bmode%5D={memory_mode}&memory%5Bvalue%5D={memory_value}&doNotTrack={do_not_track}&browserType={browser_type}&proxy%5Bid%5D={proxy_id}&proxy%5Btype%5D={proxy_type}&proxy%5Bhost%5D={proxy_host}&proxy%5Bport%5D={proxy_port}&proxy%5Blogin%5D={proxy_login}&proxy%5Bpassword%5D={proxy_password}&proxy%5Bname%5D={proxy_name}&proxy%5BchangeIpUrl%5D={proxy_change_ip_url}'
    
    url = "https://dolphin-anty-api.com/browser_profiles"
    response = requests.request("POST", url, headers=headers, data=payload)
    print(response.json())

    68821a5c5cb3a524599248.png

    В сам Dolphin{anty} профиль тоже подсосался после рефреша:
    68821b2fe0493862243582.png
    Ответ написан
    Комментировать
  • Как накапливать сумму в одной ячейке, за счет изменения значений в соседней?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    function onEdit(e) {
      const sheet = e.source.getActiveSheet();
      const range = e.range;
      
      // Проверяем, что изменение произошло в ячейке A1 нужного листа.
      if (range.getA1Notation() === "A1"&& sheet.getName() === "Лист1") {
        const newValue = range.getValue();
        const b1Cell = sheet.getRange("B1");
        const currentSum = b1Cell.getValue() || 0;
        
      if (!isNaN(newValue)) {
          b1Cell.setValue(currentSum + newValue);
        }
      }
    }
    Ответ написан
  • Парсинг на Python при помощи tor?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    зачем нужно прописывать мосты

    Как будто бы это гуглится:
    В некоторых странах доступ к сети Tor может быть заблокирован. Мосты, не являющиеся частью публичного списка узлов, позволяют обойти эти блокировки, так как их сложнее обнаружить и заблокировать.


    Работает, почему бы не работать. Но, имхо, такой себе способ: скорость непредсказуемая, коннект сейчас есть, а через минуту нет, крупные выходные ноды могут быть блокированы ресурсами, которые вы парсите. Одним словом: зачем?
    Ответ написан
    Комментировать
  • Как в Firefox открыть URL в активной вкладке?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    AutoHotKey, вам, вроде бы, предлагали в прошлую итерацию вопроса.
    start_in_firefox.ahk
    #Requires AutoHotkey v2.0
    SendMode "Input"
    SetWorkingDir A_ScriptDir
    
    ; Проверяем, передан ли URL
    if !A_Args.Length {
        MsgBox "Ошибка: Не указан URL. Используйте: `n`nOpenInFirefox.ahk `"https://example.com`""
        ExitApp 1
    }
    
    URL := A_Args[1]
    
    ; Проверяем, запущен ли Firefox
    if ProcessExist("firefox.exe") {
        try {
            ; Активируем окно Firefox и вставляем URL в текущую вкладку
            WinActivate "ahk_exe firefox.exe"
            Sleep 200
            Send "^l"          ; Ctrl+L (фокус на адресную строку)
            Sleep 100
            SendInput URL "{Enter}"
        } catch as e {
            ; Если не удалось активировать окно, открываем URL в новом окне
            Run 'firefox.exe "' URL '"'
        }
    } else {
        ; Если Firefox не запущен, открываем URL в новом окне
        Run 'firefox.exe "' URL '"'
    }

    Запуск через AHK непосредственно:
    "C:\path\to\AutoHotkeyUX.exe" "C:\path\to\open_in_firefox.ahk" "https:\\habr.com"


    start_in_firefox.bat
    @echo off
    "C:\path\to\AutoHotkeyUX.exe" "C:\path\to\open_in_firefox.ahk" %1

    Запуск через bat:
    C:\path\to\start_in_firefox.bat "https://ya.ru"
    Ответ написан
  • Как поменять шрифт в cmd на nerd font?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Ставить те, которые поддерживают cmd.
    Например CaskaydiaCove Nerd Font или FiraCode Nerd Font.
    686bda5a0d062092771824.png
    Ответ написан
  • Какова временная сложность del[pos:] для списка в Python?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Сложность O(n).
    Если делать замеры для списков разных размеров, то увидим что время выполнения растёт линейно, что подтверждает сложность O(n).

    Если же сложность не O(1), то почему? Ведь перемещать ничего не надо.
    Удаление среза реализовано как проход по удаляемым элементам с вызовом Py_DECREF на каждый.

    З.Ы. чисто теоретически сложность O(1) может быть для крайнего случая с pos = 0, если целиком уничтожается вся структура (но так ли это в реальности надо проверять) и pos = n - 1.
    Ну и надо разделять абстрактную алгоритмику и конкретные бенчмарки.

    6867dce1a31c0265426845.png

    Код.
    import time
    import matplotlib.pyplot as plt
    
    
    def test_del_slice_complexity():
        sizes = [10 ** 3, 10 ** 4, 10 ** 5, 10 ** 6]
        times = []
    
        for n in sizes:
            # Создаем список
            my_list = [1] * n
    
            # Замеряем время удаления
            start_time = time.perf_counter()
            del my_list[n // 2:]  # Удаляем 50% элементов
            end_time = time.perf_counter()
    
            elapsed = end_time - start_time
            times.append(elapsed)
    
            print(f"n = {n:>7}: {elapsed:.6f} сек")
    
        # Визуализация результатов
        plt.figure(figsize=(10, 5))
        plt.plot(sizes, times, 'o-', label='Измеренное время')
        plt.plot(sizes, [times[0] * n / sizes[0] for n in sizes], '--', label='Ожидаемое линейное время')
        plt.xscale('log')
        plt.yscale('log')
        plt.xlabel('Размер списка (n)')
        plt.ylabel('Время выполнения (сек)')
        plt.title('Сложность операции del my_list[n//2:]')
        plt.legend()
        plt.grid(True)
        plt.show()
    
    
    if __name__ == "__main__":
        test_del_slice_complexity()
    Ответ написан
    4 комментария
  • Как сделать лог при удалении сообщений?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    В аудит лог не попадают сообщения об удалении, если это сделал сам автор.

    Читайте аудит лог (там написано кто (имеющий права на Manage Messages) удалил чьё сообщение из какого канала) и переписывайте это в отдельный канал, если вас не устраивает встроенный функционал просмотра лога, где всё это реализовано в удобном виде с фильтрами.
    Ответ написан
    Комментировать
  • Из-за ошибки текстовый файлик занимает всё свободное место на носителе, как это исправить?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Используйте loggingс ограничением размера лога параметром maxBytes, чтобы не изобретать велосипед.

    я включаю символ "\n" в функции get_nmea_datetime

    Где?
    Вы накапливаете данные в data, при появлении перевода строки записываете их. Но не добавляете '\n'.

    Ну и, вероятно, могут не выполняться условия выше data=''и оно может не обнуляться.

    З.Ы. ну и в целом: работайте с файлами через контекстный менеджер with, добавьте логирование и обработку исключений (для себя прежде всего), аннотации и комментарии к коду (для других), тем более, если он будет опубликован.
    Ответ написан
    2 комментария
  • Какую CMS использует сайт телешторм?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Использует Next.js, а откуда он получает данные вы вряд ли узнаете, если не спросите напрямую.
    Имхо, это может быть хоть markdown-файлики, хоть записи в Notion, хоть самописная CMS, хоть WordPress через API в режиме headless.
    Ответ написан
    Комментировать
  • Как исправить игнорирование кода при импорте в python?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Используйте коги: https://discordpy.readthedocs.io/en/stable/ext/com...

    main.py:
    import discord
    from discord.ext import commands
    
    intents = discord.Intents.default()
    intents.message_content = True
    
    bot = commands.Bot(command_prefix="!", intents=intents)
    
    async def load_extensions():
        await bot.load_extension("ticket")  # Загружаем Cog без .py
    
    @bot.event
    async def on_ready():
        print(f"Бот {bot.user} готов!")
        await load_extensions()
    
    bot.run("***")


    ticket.py:
    from discord.ext import commands
    
    class TicketsCog(commands.Cog):
        def __init__(self, bot):
            self.bot = bot
    
        @commands.command(name="systicket")
        async def systicket(self, ctx):
            """Обработка команды !systicket"""
            # логика команды
            await ctx.send("Система тикетов работает!")  # Пример ответа
    
    async def setup(bot):
        await bot.add_cog(TicketsCog(bot))  # Важно: await и новое API discord.py 2.0+
    Ответ написан
    Комментировать
  • Как создать/изменить примечание (Note) в Google.Sheets.API?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    from googleapiclient.discovery import build
    from google.oauth2 import service_account
    
    # Укажите путь к скачанному JSON-файлу сервисного аккаунта
    SERVICE_ACCOUNT_FILE = 'ваш_сервис_аккаунт_файл.json'
    
    # Настройка доступа
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE,
        scopes=['https://www.googleapis.com/auth/spreadsheets'])
    
    service = build('sheets', 'v4', credentials=credentials)
    
    def update_note(spreadsheet_id, sheet_name, cell, note_text):
        # Конвертация имени ячейки в индексы:
        col = ord(cell[0].upper()) - ord('A')
        row = int(cell[1:]) - 1
    
        # Получаем ИД листа:
        spreadsheet = service.spreadsheets().get(
            spreadsheetId=spreadsheet_id,
            fields="sheets(properties(sheetId,title))"
        ).execute()
    
        sheetId = [sheet['properties']['sheetId'] for sheet in spreadsheet['sheets'] if
                   sheet['properties']['title'] == sheet_name][0]
        print(sheetId)
    
        service.spreadsheets().batchUpdate(
            spreadsheetId=spreadsheet_id,
            body={
                "requests": [{
                    "updateCells": {
                        "range": {
                            "sheetId": sheetId,
                            "startRowIndex": row,
                            #"endRowIndex": row + 1,
                            "startColumnIndex": col,
                            #"endColumnIndex": col + 1
                        },
                        "rows": [{"values": [{"note": note_text}]}],
                        "fields": "note"
                    }
                }]
            }
        ).execute()
    
    
    # Использование:
    spreadsheetId = 'ваш ид таблицы'
    update_note(spreadsheetId, "Лист3", "B3", "Тестовое примечание.")


    З.Ы. Для "сложных" ячеек ("AA15" итд.), если у вас такие есть, перепишите конвертацию имени ячейки в индексы, текущая работать не будет корректно.

    Чтение примечания с ячейки:
    def read_note(spreadsheet_id, sheet_name, cell) -> str or None:
        response = service.spreadsheets().get(
            spreadsheetId=spreadsheet_id,
            ranges=[f"{sheet_name}!{cell}"],
            fields='sheets(data.rowData.values.note)'
        ).execute()
    
        note = (response
                .get('sheets', [{}])[0]
                .get('data', [{}])[0]
                .get('rowData', [{}])[0]
                .get('values', [{}])[0]
                .get('note'))
    
        return note
    
    # Использование:
    spreadsheetId = 'ваш ид таблицы'
    read_note(spreadsheetId, 'Лист3', 'B3')
    Ответ написан
    1 комментарий
  • Как поставить картинку под текст?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Типа такого?
    683c69607d63c316950911.png
    Код
    <?php
    require 'vendor/autoload.php';
    use PhpOffice\PhpWord\PhpWord;
    
    $phpWord = new PhpWord();
    $section = $phpWord->addSection();
    
    // 1. Сначала добавляем изображение как фон (первый слой)
    $section->addImage(
        __DIR__ . '/img/test.png',
        [
            'width' => 100, // Ширина изображения
            'height' => 100, // Высота изображения
            'wrappingStyle' => 'behind', // Ключевой параметр: изображение становится фоном
            'positioning' => 'relative', // Относительное позиционирование
            'posHorizontal' => \PhpOffice\PhpWord\Style\Image::POSITION_HORIZONTAL_CENTER,
            'posVertical' => \PhpOffice\PhpWord\Style\Image::POSITION_VERTICAL_TOP,
        ]
    );
    
    // 2. Затем добавляем текст (второй слой)
    $section->addText(
        'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam error doloribus doloremque voluptate natus, numquam laudantium ducimus cupiditate, cumque nulla fugit consectetur ipsam nobis illum enim. Rerum, nulla. Laborum, tempora?',
        [
            'name' => 'Arial',
        ],
        [
            //'alignment' => 'center', // Выравнивание текста по центру
            'spaceAfter' => 0,
        ]
    );
    
    $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
    $objWriter->save('layered.docx');
    echo "Текст наложен на изображение.";
    Ответ написан
    1 комментарий
  • Взаимодействие с базой данных при сборке файла exe?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    izma, не нужны танцы с бубнами...

    Сделал тестовую программку на Tk и sqlite3. Всё, ожидаемо, собирается.
    1. До БД должен быть абсолютный путь, используем:
    def get_db_path():
        if getattr(sys, 'frozen', False):
            # Если запущен из .exe, использовать путь рядом с исполняемым файлом
            return os.path.join(os.path.dirname(sys.executable), 'database.db')
        else:
            # При обычном запуске — рядом с .py файлом
            return os.path.join(os.path.dirname(__file__), 'database.db')

    2. Собираем: pyinstaller --onefile --windowed app.py
    3. Кладём базу рядом с exe-ником.

    З.Ы. Если база нужна только в режиме чтения можно её тоже интегрировать в exe.
    pyinstaller --onefile --add-data "database.db;." --windowed app.py
    Ответ написан
    2 комментария
  • Сборка python файла с расширением pyw в exe файл??

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Перенести сборку в папку с не таким длинным названием: D:\Yandex....(+100500 символов).
    Не использовать папку/файл с таким длинным названием.
    Ответ написан
    5 комментариев
  • Ошибка при работе Python + 1C?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    obj = rs.Справочники.Номенклатура.НайтипоКоду('0001')

    У вас метод неправильно написан: НайтиПоКоду().
    Ответ написан
    Комментировать
  • Как убрать украинский флаг leaflet с карт Openstreetmap?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    В leaflet.css в .leaflet-attribution-flag добавить display: none !important;.
    683783763cecc419277630.png
    Ответ написан
    Комментировать
  • Найти и декодировать base64 в тексте, как реализовать?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    В notepad++ есть плагин Mime Tools он умеет в Base64 decode. Регуляркой находите, плагином декодируете.
    Ответ написан
    Комментировать
  • Не работает машинка на радиоуправлении, что не так?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Явным образом устанавливаем состояние моторов в void setup():
    // Остановка моторов при запуске
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      analogWrite(ENA, 0);
      analogWrite(ENB, 0);


    и если нет сигнала - останавливаем моторы в loop():
    void loop() {
      if (radio.available()) {
        int joystickData[2] = {0}; 
        radio.read(&joystickData, sizeof(joystickData));
        controlMotors(joystickData[0], joystickData[1]);
      } else {
        controlMotors(512, 512);  // Нейтральное положение джойстика
      }
    }
    Ответ написан
    Комментировать
  • Как заставить скрипт tampermonkey работать?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    // ==UserScript==
    // @name         New Userscript
    // @namespace    http://tampermonkey.net/
    // @version      2025-05-24
    // @description  try to take over the world!
    // @author       You
    // @match        https://store.steampowered.com/news/app/550
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=steampowered.com
    // @grant        none
    // ==/UserScript==
    
    (function() {
        'use strict';
        function redOctober() {
            var textElements1 = document.querySelectorAll("#responsive_page_template_content > div.page_content_ctn > div > div > div > div > div > div > div > div > div > span");
            textElements1.forEach(function(element) {
                element.style.color = 'red';
            });
        }
        const observer = new MutationObserver(redOctober);
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    })();

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