我在尝试着:

  • 访问初始化 session 的页面
  • 将 session 存储在 JSON 对象中
  • 访问同一页面,现在应该识别现有 session

  • 我尝试的实现如下:
    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();
    
  • createSession 用于捕获加载页面的cookies。
  • useSession 预计使用现有 cookie 加载页面。

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

    最佳答案

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

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

    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

    关于javascript - 如何使用所有 cookie 重新创建页面?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46631333/

    10-11 22:14
    查看更多