如何通过Puppeteer利用已有Cookie维持登录状态?
你的代码核心问题是Cookie注入时机错误,同时部分Cookie属性配置不符合目标网站要求,导致服务器不识别你的登录状态。以下是具体修复方案:
1. 调整Cookie注入顺序
你现在是先访问目标页面,再设置Cookie——这时候服务器已经返回未登录的页面内容了,后续设置Cookie不会让已加载的页面自动变为登录状态。正确流程是:创建页面后先注入Cookie,再访问目标页面。
2. 修正Cookie属性配置
从你的代码看,Cookie的httpOnly属性搞反了:
sessionid通常是httpOnly: true(防止前端脚本窃取,由服务器端验证)csrftoken通常是httpOnly: false(前端需要读取并在请求中携带)
同时要确保Cookie的domain、path、secure、sameSite等属性和你登录浏览器中实际存储的Cookie完全一致(可以在浏览器开发者工具的Application→Cookies里查看)。
3. 清除默认Cookie(可选但推荐)
注入自定义Cookie前,先清除页面的默认Cookie,避免新旧Cookie冲突。
修改后的完整代码
import puppeteer from "puppeteer"; const width = 1080; const height = 1024; const browser = await puppeteer.launch({ headless: false, }); const page = await browser.newPage(); // 先设置与登录时一致的User-Agent await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'); // 清除页面默认Cookie await page.deleteCookie(...(await page.cookies())); // 配置正确的Cookie(属性需和浏览器中实际登录状态的Cookie完全匹配) const cookies = [ { name: "sessionid", value: "4a1fatg96pkisqew7iv5hzikyif41qtn", domain: "briansclub.cm", path: "/", httpOnly: true, secure: true, sameSite: "Lax" }, { name: "csrftoken", value: "替换为你登录状态下浏览器中的csrftoken值", domain: "briansclub.cm", path: "/", httpOnly: false, secure: true, sameSite: "Lax" }, // 若网站有其他登录关联Cookie,需一并添加 ]; // 注入Cookie await page.setCookie(...cookies); // 访问目标页面 await page.goto("https://briansclub.cm/cvv/", {waitUntil: 'networkidle0'}); // 验证登录状态(替换为网站登录后才会出现的元素选择器) const isLoggedIn = await page.$eval(".logged-in-avatar", el => !!el).catch(() => false); console.log("登录状态:", isLoggedIn ? "已登录" : "未登录");
额外注意事项
- 不要从未登录页面获取
csrftoken,直接使用登录状态下浏览器存储的csrftoken值,未登录页面的token与登录状态的token不匹配。 - 确保你的
sessionid是有效且未过期的,过期的sessionid会被服务器直接拒绝。 - 部分网站会检测浏览器指纹(如Canvas、WebGL指纹),若Cookie配置正确仍被拦截,需进一步配置Puppeteer模拟更真实的浏览器环境(如启用完整JavaScript、设置viewport、禁用自动化特征检测等)。
内容的提问来源于stack exchange,提问作者nguyenthanhson
相关产品推荐
相关产品推荐

