如何通过无头Chrome管理登录会话?Puppeteer保存Steam OAuth会话
解决方案:在Puppeteer无头实例间复用Steam OAuth登录会话
这个问题我之前做Steam相关爬虫时也碰到过,核心就是让Puppeteer复用Chrome的用户会话数据(包括Cookie、登录状态这些),有两个非常实用的方案,给你详细拆解下:
方案一:自定义用户数据目录,永久保存会话
Chrome的所有登录状态、Cookie、本地存储都是存在用户数据目录里的,只要让每次启动的无头Chrome都使用同一个目录,就能自动复用之前的登录会话。
步骤和代码示例:
- 选择一个本地目录(比如
./steam-chrome-profile)来存储会话数据 - 启动Puppeteer时指定
userDataDir参数:
const puppeteer = require('puppeteer'); (async () => { // 启动无头Chrome,指定自定义用户数据目录 const browser = await puppeteer.launch({ headless: 'new', // 推荐用新版无头模式,和正常Chrome行为更一致 userDataDir: './steam-chrome-profile', // 你的会话存储目录 args: ['--no-sandbox', '--disable-setuid-sandbox'] // 可选,解决部分环境的权限限制 }); const page = await browser.newPage(); await page.goto('你的目标URL'); // 第一次运行时:手动完成Steam OAuth登录(可以临时把headless改成false,登录后再切回无头) // 后续运行时:浏览器会自动加载之前保存的登录状态,无需重复登录 // --- 这里写你填写输入框、点击按钮的逻辑 --- await browser.close(); })();
注意事项:
- 第一次运行建议暂时关闭无头模式(
headless: false),手动完成Steam登录流程,之后再切回无头模式即可自动复用状态 - 确保程序对
userDataDir目录有读写权限 - 不要同时启动多个使用同一个用户目录的Chrome实例,会导致会话冲突
方案二:复用本地已登录的主Chrome会话
如果已经在你的日常使用的Chrome浏览器里完成了Steam登录,可以直接让无头Chrome复用这个现成的会话,省去重新登录的步骤。
步骤和代码示例:
- 找到本地Chrome的用户数据目录:
- Windows:
C:\Users\<你的用户名>\AppData\Local\Google\Chrome\User Data - macOS:
~/Library/Application Support/Google/Chrome/Default - Linux:
~/.config/google-chrome/Default
- Windows:
- 复制一份目录副本(重要!不要直接用原目录,否则会和正在运行的主Chrome冲突)
- 启动Puppeteer时指定这个副本目录:
const puppeteer = require('puppeteer'); (async () => { // 注意:必须用复制后的目录,避免和主Chrome进程冲突 const browser = await puppeteer.launch({ headless: 'new', userDataDir: '/Users/你的用户名/Library/Application Support/Google/Chrome/SteamSessionCopy', // 替换成你的副本目录路径 args: ['--no-sandbox', '--disable-setuid-sandbox'] }); const page = await browser.newPage(); await page.goto('你的目标URL'); // 此时页面应该已经处于Steam登录状态,直接执行后续的输入框填写、按钮点击操作即可 await browser.close(); })();
注意事项:
- 复制目录前必须关闭主Chrome浏览器,否则部分文件会被锁定,导致复制不完整
- 不同操作系统的路径格式要对应正确,Windows路径记得用双反斜杠或者正斜杠转义
- 如果遇到会话未加载的情况,可以检查副本目录是否完整,或者是否有Chrome的同步功能干扰(可以临时关闭同步)
内容的提问来源于stack exchange,提问作者Anton Kurtin
相关产品推荐
相关产品推荐

