pyppeteer control Chromium enable the plug-in incognito

basis

Enable stealth mode

from pyppeteer import launch


async def start_browser():
    browser = await launch(**{"headless": False})
    browser_context = await browser.createIncognitoBrowserContext()
    page = await browser_context.newPage()

    await page.goto("http://www.baidu.com")
    await browser.close()
    return

Non-stealth mode is enabled plug-ins

from pyppeteer import launch


async def start_browser():
    chrome_extension_path = "插件所在目录"
    args = [
        "--load-extension={}".format(chrome_extension_path),
        "--disable-extensions-except={}".format(chrome_extension_path),
    ]

    browser = await launch(**{"headless": False, "args": args})
    page = await browser.newPage()

    await page.goto("http://www.baidu.com")
    await browser.close()
    return

text

If the plug is non-stealth mode is enabled, then the above code on it. But very boring, there are scenes have to run in stealth mode, you also need plug-ins. If it is a manual operation, to enable the following steps:

  1. Open the Plugin Manager page chrome: // extensions /
  2. Find the need to activate the plugin, click Details, plug into the details.
  3. Looking at the details: option is enabled in incognito mode and check

Then you can use in stealth mode.

BUT, my goal is to enable the plug-in automatic stealth mode. Google Dafa start enabled. . .
after an hour. . . WTF, anyway, I did not find the normal implementation, seemingly pyppeteer does not support, do not know what hidden chrome parameters can be used, but find it too strenuous to give up.

In fact, Google found a way in the process, but it is not so elegant. Actually very simple, that is man-made steps above operations automation it.

The code is not very complex, but in the implementation process still learned something new of.

code show as below:

import asyncio
from pyppeteer.browser import Browser


async def enable_extension_for_incognito(browser: Browser, extension_name: str) -> bool:
    """
        在隐身模式下启用指定插件
    Args:
        extension_name: 插件名称

    Returns:

    """
    # 新开非隐身窗口并打开扩展程序页面
    page = await browser.newPage()
    await page.goto("chrome://extensions/")
    # 执行js代码获取指定的扩展id
    get_eid_js = (
        """() => {
        var extension_id;
        document.querySelector("extensions-manager").shadowRoot
        .querySelector("extensions-item-list").shadowRoot
        .querySelectorAll("extensions-item").forEach(function (e) {
            var e_name = e.shadowRoot.querySelector("#name").textContent.trim();
            if (e_name == "%s") {
                extension_id = e.getAttribute("id")
            }
        })
        return extension_id
    }"""
        % extension_name
    )
    extension_id = await page.evaluate(get_eid_js)
    await asyncio.sleep(1)
    # 进入扩展详情页面
    await page.goto("chrome://extensions/?id={}".format(extension_id))
    # 判断插件是否启用
    get_extension_status_js = """
                    () => {
                    return document.querySelector("extensions-manager").shadowRoot
                    .querySelector("extensions-detail-view").shadowRoot
                    .querySelector("extensions-toggle-row#allow-incognito").shadowRoot
                    .querySelector("#crToggle").getAttribute("aria-pressed")
                    }
                    """
    r = await page.evaluate(get_extension_status_js)
    if r != "true":
        # 点击在无痕模式下启用
        click_enable_js = """
        () => {document.querySelector("extensions-manager").shadowRoot
        .querySelector("extensions-detail-view").shadowRoot
        .querySelector("extensions-toggle-row#allow-incognito").shadowRoot
        .querySelector("#crToggle").shadowRoot
        .querySelector("button").click()}
        """
        await page.evaluate(click_enable_js)
        await asyncio.sleep(1)
    # 确认是否启用成功
    r = await page.evaluate(get_extension_status_js)
    assert r == "true"
    await page.close()
    return True

There are two caveats:

  1. shadowRoot this thing first encounter. . .
  2. Browser with memory function. If you already have a plugin enabled, then after re-open when the plug-in is already enabled the state.

Guess you like

Origin www.cnblogs.com/dyfblog/p/12225796.html