2025, Dec 28 00:02

Как запустить Chromium с нужным расширением в NoDriver (macOS ARM)

Как вернуть расширение при запуске Chromium через NoDriver: уберите --disable-extensions, не включайте инкогнито и загрузите его через --load-extension на macOS

Запуск Chromium в автоматическом режиме часто ведет себя иначе, чем при ручном старте. Частый сюрприз: расширение, которое остаётся включённым, когда вы открываете браузер вручную, пропадает при запуске Chromium из Python‑скрипта. Если сессия ещё и стартует в режиме инкогнито, разрыв становится ещё заметнее. Ниже — короткое объяснение, почему так происходит, и как запустить Chromium с нужным расширением при работе с NoDriver на macOS 64 ARM.

Как воспроизвести проблему

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

async def process_account(login_blob):
    browser_session = None
    provided_secret = None
    secret_phrase = None
    if ".com:" in login_blob:
        login_blob, secret_phrase = login_blob.split(":", 1)
        provided_secret = secret_phrase
    try:
        selected_proxy = None
        if ENABLE_PROXIES and proxy_pool:
            selected_proxy = random.choice(proxy_pool)
        else:
            print(f"{RED}Not using proxy {CLR}")
        win_w = random.randint(1000, 1500)
        win_h = random.randint(750, 950)
        pos_x = random.randint(0, 500)
        pos_y = random.randint(0, 500)
        opts = [
            f"--window-size={win_w},{win_h}",
            f"--window-position={pos_x},{pos_y}",
            "--disable-sync",
            "--no-first-run",
            "--no-default-browser-check",
            "--disable-backgrounding-occluded-windows",
            "--disable-renderer-backgrounding",
            "--disable-background-timer-throttling",
            "--disable-breakpad",
            "--disable-extensions",
            "--incognito",
            "--disable-dev-shm-usage",
        ]
        if selected_proxy:
            host, port, usern, passw = split_proxy_dsn(selected_proxy)
            proxy_auth = [usern, passw]
            proxy_url = f"http://{host}:{port}"
            opts.append(f"--proxy-server={proxy_url}")
        browser_session = await nd.start(
            browser_executable_path=CHROME_BIN,
            headless=HEADLESS_ON,
            stealth=True,
            browser_args=opts
        )
        bootstrap_tab = await browser_session.get("draft:,")
        await apply_proxy_auth(proxy_auth[0], proxy_auth[1], bootstrap_tab)
        page = await browser_session.get("https://www.target.com/")
        await page.evaluate(
            """
            () => {
                localStorage.clear();
                sessionStorage.clear();
            }
            """
        )

Что на самом деле происходит

Здесь сходятся три фактора. Во‑первых, режим инкогнито обычно по умолчанию отключает расширения. Во‑вторых, безголовые или автоматизированные сессии Chrome, как правило, не загружают расширения в инкогнито, если вы явно это не разрешили. В‑третьих, флаг --disable-extensions безусловно отключает все расширения. В совокупности эти параметры гарантируют, что при программном запуске Chromium ваше расширение не появится.

Решение

Практичный путь — перестать отключать расширения, не навязывать режим инкогнито, если нужно активное расширение, и явно подгрузить его с диска. Если вы хотите переиспользовать профиль, где расширение уже настроено, укажите Chromium путь к каталогу этого профиля.

async def process_account(login_blob):
    browser_session = None
    provided_secret = None
    secret_phrase = None
    if ".com:" in login_blob:
        login_blob, secret_phrase = login_blob.split(":", 1)
        provided_secret = secret_phrase
    try:
        selected_proxy = None
        if ENABLE_PROXIES and proxy_pool:
            selected_proxy = random.choice(proxy_pool)
        else:
            print(f"{RED}Not using proxy {CLR}")
        win_w = random.randint(1000, 1500)
        win_h = random.randint(750, 950)
        pos_x = random.randint(0, 500)
        pos_y = random.randint(0, 500)
        ext_path = "/Users/<user>/Library/Application Support/Chromium/Default/Extensions/pgojnojmmhpofjgdmaebadhbocahppod/1.16.0_0"
        # При желании можно переиспользовать существующий профиль с настроенными расширениями:
        # profile_dir = "/Users/<user>/Library/Application Support/Chromium"
        opts = [
            f"--window-size={win_w},{win_h}",
            f"--window-position={pos_x},{pos_y}",
            "--disable-sync",
            "--no-first-run",
            "--no-default-browser-check",
            "--disable-backgrounding-occluded-windows",
            "--disable-renderer-backgrounding",
            "--disable-background-timer-throttling",
            "--disable-breakpad",
            "--disable-dev-shm-usage",
            f"--load-extension={ext_path}",
            # f"--user-data-dir={profile_dir}",
        ]
        if selected_proxy:
            host, port, usern, passw = split_proxy_dsn(selected_proxy)
            proxy_auth = [usern, passw]
            proxy_url = f"http://{host}:{port}"
            opts.append(f"--proxy-server={proxy_url}")
        browser_session = await nd.start(
            browser_executable_path=CHROME_BIN,
            headless=HEADLESS_ON,
            stealth=True,
            browser_args=opts
        )
        bootstrap_tab = await browser_session.get("draft:,")
        await apply_proxy_auth(proxy_auth[0], proxy_auth[1], bootstrap_tab)
        page = await browser_session.get("https://www.target.com/")
        await page.evaluate(
            """
            () => {
                localStorage.clear();
                sessionStorage.clear();
            }
            """
        )

Ключевые изменения просты. Не передавайте --disable-extensions. Не включайте принудительно --incognito, если ожидаете активное расширение. Укажите путь к расширению на диске через --load-extension. На macOS путь может выглядеть так: /Users/<user>/Library/Application Support/Chromium/Default/Extensions/pgojnojmmhpofjgdmaebadhbocahppod/1.16.0_0. Если удобнее переиспользовать существующий профиль, где расширение уже установлено и включено, направьте Chromium на этот профиль через --user-data-dir.

Почему это важно

При автоматическом запуске Chromium параметры командной строки полностью определяют поведение браузера. Настройки, сделанные вручную в интерфейсе — включая разрешение работы расширения в инкогнито — могут быть переопределены или проигнорированы в зависимости от заданных флагов. Понимание того, как взаимодействуют --incognito, --disable-extensions и --load-extension, помогает избежать побочных эффектов и добиваться того, чтобы сценарии вели себя так же, как ручные сессии.

Итоги

Если в автоматизированной сессии расширение не появляется, начните с удаления --disable-extensions, не навязывайте инкогнито, когда расширение необходимо, и явно подгрузите его из папки через --load-extension. Если важна сохранность настроек, используйте --user-data-dir, чтобы переиспользовать известный профиль. С этими настройками Chromium, запущенный через NoDriver, будет повторять вашу ручную конфигурацию и сохранять расширение доступным при открытии вкладки скриптом.