如何通过无头 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 管理登录会话?的主要内容,如果未能解决你的问题,请参考以下文章

通过将数据存储在会话存储中进行会话管理

如何在 ios 中的 facebook 集成中管理会话

如何在时间段为 30 分钟的春季实现会话管理

如何在 PHP 中管理从移动应用程序登录的用户的会话?

如何在多个 apache 服务器上管理单个 PHP5 会话?

会话登录成功后如何插入表