Selenium + CDP 在連線前注入 Cookie

以下範例將 cookie 注入到 .google.com,然後第一次 request 就帶 cookie。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# === 測試用 Cookie ===
cookie_list = [
    {
        "name": "HSID",
        "value": "AOyw5em_g-Ed7t70I",
        "domain": ".google.com",
        "path": "/",
        "secure": False,
        "httpOnly": False,
    },
    {
        "name": "SSID",
        "value": "Ap4P8dfs0-98sdfsdf",
        "domain": ".google.com",
        "path": "/",
        "secure": False,
        "httpOnly": False,
    }
]

# === 初始化瀏覽器 ===
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
# 必須:啟動 CDP 才能注入 cookie
driver = webdriver.Chrome(options=options)

# 啟用 Network → 之後才能使用 setCookie
driver.execute_cdp_cmd("Network.enable", {})

# === 利用 CDP 在連線前注入 Cookie ===
for ck in cookie_list:
    try:
        driver.execute_cdp_cmd(
            "Network.setCookie",
            {
                "name": ck["name"],
                "value": ck["value"],
                "domain": ck["domain"],
                "path": ck["path"],
                "secure": ck["secure"],
                "httpOnly": ck["httpOnly"]
            }
        )
        print(f"[OK] 已注入 cookie: {ck['name']}")
    except Exception as e:
        print(f"[ERROR] 無法注入 cookie {ck['name']}: {e}")

# === 第一次連線 → server 會看到我們已設定好的 cookie ===
target_url = "https://www.google.com"
print(f"\n[INFO] 導向 {target_url},此時 cookie 已在 Network 層")
driver.get(target_url)

# === 驗證瀏覽器端 cookies ===
browser_cookies = driver.get_cookies()
print("\n=== Browser Cookies ===")
for bc in browser_cookies:
    print(bc)

# driver.quit()

🧩 運作原理

Selenium 的 add_cookie() 是 browser-level,因此:

  • 必須先 navigate 到該 domain
  • 否則出現 invalid cookie domain

而 CDP(Chrome DevTools Protocol)是 network stack level

✔ 不需要先載入 domain
✔ 可在第一個 request 發送前植入 cookie
✔ server 第一次看到的 cookie = 你設定的 cookie

避免 server 偵測 cookie 值從空 → 有值、或從 A → B 的變化。


官方範例

Using Chrome DevTools Protocol with Selenium
https://www.selenium.dev/documentation/webdriver/bidi/cdp/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *