Notion Blog
技术分享1 分钟阅读

获取web登录信息保存,让playwright直接可以使用免登录

能做什么?为什么这么做?发挥想象!

在控制台输入代码

function getCookieDetails(cookie) {
    const [name, value] = cookie.split("=");
    const escapedValue = value ? decodeURIComponent(value.replace(/'/g, "\\'")) : '';
    
    return {
        name: name.trim(),
        value: escapedValue,
        domain: window.location.hostname,
        path: "/",
        expires: -1,
        httpOnly: false,
        secure: false,
        sameSite: "Lax"
    };
}

function exportSessionStorage() {
    let sessionStorageData = [];
    for (let i = 0; i < sessionStorage.length; i++) {
        const key = sessionStorage.key(i);
        const value = sessionStorage.getItem(key);
        sessionStorageData.push({
            name: key,
            value: value
        });
    }
    return sessionStorageData;
}

function exportLocalStorage() {
    let localStorageData = [];
    for (let i = 0; i < localStorage.length; i++) {
        const key = localStorage.key(i);
        const value = localStorage.getItem(key);
        localStorageData.push({
            name: key,
            value: value
        });
    }
    return localStorageData;
}

function exportCookies() {
    let cookiesData = [];
    const cookies = document.cookie.split("; ");
    cookies.forEach(cookie => {
        if (cookie) {
            cookiesData.push(getCookieDetails(cookie));
        }
    });
    return cookiesData;
}

const result = {
    cookies: exportCookies(),
    origins: [
        {
            origin: window.location.origin,
            localStorage: exportLocalStorage(),
            sessionStorage: exportSessionStorage()
        }
    ]
};

const blob = new Blob([JSON.stringify(result, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'state.json';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);

playwright使用保存的文件,免登录使用

def use_saved_context():
    """
    使用保存的浏览器上下文进行后续操作
    """
    STATE_PATH = "state.json"
    
    with sync_playwright() as p:
        try:
            # 使用保存的上下文状态启动浏览器
            browser = p.chromium.launch(headless=False)
            context = browser.new_context(storage_state=STATE_PATH)
            page = context.new_page()
            
            print("✅ 成功加载保存的浏览器上下文")
            
            # 直接访问需要登录的页面
            page.goto("https://XXXXXX.com/#/list")
            time.sleep(2)
            
            # 检查是否仍然处于登录状态
            current_url = page.url
            if "login" not in current_url.lower():
                print("✅ 登录状态有效,可以正常访问页面")
                time.sleep(10)
                
                # 在这里添加你的后续操作
                
            else:
                print("❌ 登录状态已失效,需要重新登录")
                
        except FileNotFoundError:
            print(f"❌ 未找到保存的上下文文件: {STATE_PATH}")
            print("请先运行登录脚本")
        except Exception as e:
            print(f"❌ 使用保存的上下文失败: {e}")
        finally:
            try:
                browser.close()
            except:
                pass

selenium

 print("✅ 登录成功!保存cookies...")
        cookies = driver.get_cookies()
        with open(STATE_PATH, "w", encoding="utf-8") as f:
            json.dump(cookies, f)
        logging.info("登录成功,保存cookies成功")

使用

with open(STATE_PATH, "r", encoding="utf-8") as f:
            cookies = json.load(f)
for cookie in cookies:
    # selenium要求expiry为int类型
    if "expiry" in cookie:
        cookie["expiry"] = int(cookie["expiry"])
    driver.add_cookie(cookie)
driver.refresh() 

有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。