如何通过无头 chrome 管理登录会话?
Posted
技术标签:
【中文标题】如何通过无头 chrome 管理登录会话?【英文标题】:How to manage log in session through headless chrome? 【发布时间】:2018-07-14 12:09:20 【问题描述】:我想创建一个刮板:
-
打开无头浏览器,
转到url,
登录(有steam oauth),
填充一些输入,
并单击 2 个按钮。
我的问题是每个新的无头浏览器实例都会清除我的登录会话,然后我需要一次又一次地登录......
如何通过实例保存?(使用 puppeteer 和 headless chrome)
或者如何打开已经登录的 chrome 无头实例?(如果我已经登录了我的 chrome 主窗口)
【问题讨论】:
另见Puppeteer: how to store a session (including cookies, page state, local storage, etc) and continue later? 【参考方案1】:在启动 puppeteer 时,可以使用 userDataDir
选项保存用户数据。这存储了与启动 chrome 相关的会话和其他内容。
puppeteer.launch(
userDataDir: "./user_data"
);
它没有详细说明,但这里有一个文档链接:https://pptr.dev/#?product=Puppeteer&version=v1.6.1&show=api-puppeteerlaunchoptions
【讨论】:
这个比较好,保留cookie和本地存储 这是保持会话最简单的方法,尽管您最终可能会存储比您需要的更多的数据。只需启动具有此配置的浏览器,就会创建一个包含约 3mb 数据的文件夹。如果存储是一个问题,您可能需要考虑@Ecovirtual 解决方案。否则,这是完美的。 好答案,但这需要更多磁盘空间,我可以指定cookies只保存到这个文件夹吗?? 我用的不行,怎么办? 这是一个与 Puppeteer 文档的版本无关的启动选项链接,因为版本更新已经取消了旧链接:pptr.dev/…【参考方案2】:在 puppeter 中,您可以通过 page.cookies()
访问会话 cookie。
所以一旦你登录,你就可以获取每一个 cookie 并将其保存在一个 json 文件中:
const fs = require(fs);
const cookiesFilePath = 'cookies.json';
// Save Session Cookies
const cookiesObject = await page.cookies()
// Write cookies to temp file to be used in other profile pages
fs.writeFile(cookiesFilePath, JSON.stringify(cookiesObject),
function(err)
if (err)
console.log('The file could not be written.', err)
console.log('Session has been successfully saved')
)
然后,在您使用page.goto()
之前的下一次迭代中,您可以调用page.setCookie()
从文件中一个一个地加载cookie:
const previousSession = fs.existsSync(cookiesFilePath)
if (previousSession)
// If file exist load the cookies
const cookiesString = fs.readFileSync(cookiesFilePath);
const parsedCookies = JSON.parse(cookiesString);
if (parsedCookies.length !== 0)
for (let cookie of parsedCookies)
await page.setCookie(cookie)
console.log('Session has been loaded in the browser')
查看文档:
https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagecookiesurls https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagesetcookiecookies【讨论】:
无头时jsonfile似乎不起作用:false,文档说“注意:此模块不能在浏览器中使用。” fileExistSync 不是一个有效的函数...需要使用:***.com/questions/4482686/… 刚刚更新为使用 Node 的“fs”而不是外部依赖来写入和读取文件。【参考方案3】:对于上述解决方案的实际工作版本并且不依赖于jsonfile
(而不是使用更标准的fs
),请查看以下内容:
设置:
const fs = require('fs');
const cookiesPath = "cookies.txt";
读取cookies(先放这段代码):
// If the cookies file exists, read the cookies.
const previousSession = fs.existsSync(cookiesPath)
if (previousSession)
const content = fs.readFileSync(cookiesPath);
const cookiesArr = JSON.parse(content);
if (cookiesArr.length !== 0)
for (let cookie of cookiesArr)
await page.setCookie(cookie)
console.log('Session has been loaded in the browser')
编写 cookie:
// Write Cookies
const cookiesObject = await page.cookies()
fs.writeFileSync(cookiesPath, JSON.stringify(cookiesObject));
console.log('Session has been saved to ' + cookiesPath);
【讨论】:
【参考方案4】:用于编写 Cookies
async function writingCookies()
const cookieArray = require(C.cookieFile); //C.cookieFile can be replaced by ('./filename.json')
await page.setCookie(...cookieArray);
await page.cookies(C.feedUrl); //C.url can be ('https://example.com')
要读取 Cookie,为此,您必须在项目中安装 jsonfile:npm install jsonfile
async function getCookies()
const cookiesObject = await page.cookies();
jsonfile.writeFile('linkedinCookies.json', cookiesObject, spaces: 2 ,
function (err)
if (err)
console.log('The Cookie file could not be written.', err);
console.log("Cookie file has been successfully saved in current working Directory : '" + process.cwd() + "'");
)
使用await
调用这两个函数,它会为你工作。
【讨论】:
以上是关于如何通过无头 chrome 管理登录会话?的主要内容,如果未能解决你的问题,请参考以下文章