nodriver / selenium / uc 設定 cookies

util.py 增加 code:

import io

def parse_netscape_cookies(cookie_data):
    data_normalized = cookie_data.replace('  ', '\t')
    file_like_object = io.StringIO(data_normalized)
    cookies_list = []
    FIELD_NAMES = [
        "domain",
        "subdomains",
        "path",
        "secure",
        "expiration",
        "name",
        "value"
    ]
    for line_number, line in enumerate(file_like_object, 1):
        line = line.strip()
        if not line or line.startswith('#'):
            continue
        parts = line.split()
        # 預期會有 7 個欄位,如果分割結果不足 7 個,則表示解析錯誤或格式不完整
        if len(parts) < 7:
            print(f"\n[⚠️ 警告] 第 {line_number} 行格式不完整,跳過:{line}")
            continue
        cookie_fields = {
            "Line": line_number,
            FIELD_NAMES[0]: parts[0],  # Domain
            FIELD_NAMES[1]: to_bool(parts[1]),  # Include Subdomains (Flag)
            FIELD_NAMES[2]: parts[2],  # Path
            FIELD_NAMES[3]: to_bool(parts[3]),  # Secure (Flag)
            FIELD_NAMES[4]: int(parts[4]),  # Expiration Timestamp
            FIELD_NAMES[5]: parts[5],  # Name
            FIELD_NAMES[6]: parts[6],  # Value
        }
        cookies_list.append(cookie_fields)
    return cookies_list

還有這個小小副程式:

def to_bool(value):
    """將字串轉換為布林值。支援 'true', 'yes' (忽略大小寫)。"""
    if not isinstance(value, str):
        return False  # 如果不是字串,直接返回 False

    lower_value = value.lower()
    return lower_value.startswith('true') or lower_value.startswith('yes')

欄位說明 (Netscape 格式)

解析出來的 7 個欄位意義如下:

  1. Domain (網域): 設定 Cookie 的目標網域。開頭有 . 表示子網域也適用。
  2. Include Subdomains (Flag): TRUE 表示適用於所有子網域;FALSE 表示僅適用於該網域。
  3. Path (路徑): Cookie 有效的路徑。/ 表示整個網站都適用。
  4. Secure (Flag): TRUE 表示只能在 HTTPS 連線時發送;FALSE 表示 HTTP 和 HTTPS 都可以。
  5. Expiration Timestamp (到期時間戳): Unix 時間戳,表示 Cookie 的過期時間。
  6. Name (名稱): Cookie 的名稱 (Key)。
  7. Value (值): Cookie 的對應值 (Value)。

settings.html

          <div class="row mb-3">
            <label for="cookies" class="col-sm-2 col-form-label">cookies</label>
            <div class="col-sm-10 col-lg-8 col-xl-6">
              <textarea class="form-control" id="cookies" rows="3"></textarea>
            </div>
          </div>

nodriver.py

    cookie_data = config_dict["advanced"]["cookies"]
    if len(cookie_data) > 1:
        cookies  = await driver.cookies.get_all()
        cookies_list = util.parse_netscape_cookies(cookie_data)
        for ck in cookies_list:
            new_cookie = cdp.network.CookieParam(ck["name"], ck["value"], domain=ck["domain"], path=ck["path"], http_only=False, secure=ck["secure"])
            cookies.append(new_cookie)
            is_cookie_changed = True
        await driver.cookies.set_all(cookies)

selenium_uc.py

        cookie_data = config_dict["advanced"]["cookies"]
        if len(cookie_data) > 1:
            cookies_list = util.parse_netscape_cookies(cookie_data)
            try:
                driver.execute_cdp_cmd('Network.enable', {})
                for ck in cookies_list:
                    cookie = {
                            'name': ck["name"],
                            'value': ck["value"],
                            'domain': ck["domain"],
                            'path': ck["path"],
                            'secure': ck["secure"]
                        }
                    driver.execute_cdp_cmd('Network.setCookie', cookie)
                    #print(f"[OK] 已注入 cookie: {ck['Name']}")
            except Exception as e:
                print(f"[ERROR] 無法注入 cookie: {e}")

瀏覽器安裝 chrome extension:
Get cookies.txt LOCALLY
https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc

取得已登入的相關網站 cookies, 例如: 特定網站, google, facebook.

發佈留言

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