4

我在尝试着:

  1. 访问初始化会话的页面
  2. 将会话存储在 JSON 对象中
  3. 访问同一页面,该页面现在应该可以识别现有会话

我尝试的实现如下:

import puppeteer from 'puppeteer';

const createSession = async (browser, startUrl) => {
  const page = await browser.newPage();

  await page.goto(startUrl);

  await page.waitForSelector('#submit');

  const cookies = await page.cookies();
  const url = await page.url();

  return {
    cookies,
    url
  };
};

const useSession = async (browser, session) => {
  const page = await browser.newPage();

  for (const cookie of session.cookies) {
    await page.setCookie(cookie);
  }

  await page.goto(session.url);
};

const run = async () => {
  const browser = await puppeteer.launch({
    headless: false
  });

  const session = await createSession(browser, 'http://foo.com/');

  // The session has been established
  await useSession(browser, session);
  await useSession(browser, session);
};

run();
  1. createSession用于捕获加载页面的cookies。
  2. useSession预计将使用现有的 cookie 加载页面。

但是,这不起作用——session.url页面无法识别会话。似乎并非所有 cookie 都以这种方式被捕获。

4

2 回答 2

8

似乎返回了一些带有配置page#cookies的 cookie 。忽略这些值。session=true,expires=0setCookie

expires我通过构建一个覆盖andsession属性的新 cookie 数组来解决这个问题。

const cookies = await page.cookies();

const sessionFreeCookies = cookies.map((cookie) => {
  return {
    ...cookie,
    expires: Date.now() / 1000 + 10 * 60,
    session: false
  };
});

在撰写此答案时,session没有记录财产。参考以下问题https://github.com/GoogleChrome/puppeteer/issues/980

于 2017-10-08T13:16:28.247 回答
3

Puppeteerpage.cookies()方法仅获取当前页面域的 cookie。但是,在某些情况下,它也可能具有来自不同域的 cookie。

您可以调用内部方法Network.getAllCookies从所有域中获取 cookie。

(async() => {
  const browser = await puppeteer.launch({});
  const page = await browser.newPage();
  await page.goto('https://stackoverflow.com', {waitUntil : 'networkidle2' });

  // Here we can get all of the cookies
  console.log(await page._client.send('Network.getAllCookies'));

})();

更多关于这个线程的信息 - Puppeteer get 3rd party cookies

于 2019-06-04T16:24:23.460 回答