Puppeteer не сохраняет куки после их установки с помощью page.setCookie() и закрытия браузера

Вопрос или проблема

У меня есть скрипт Puppeteer, который устанавливает куки для аутентифицированной сессии. Затем он закрывает браузер и открывает его снова позже. Странно, что если я аутентифицируюсь в течение сессии, вместо того чтобы устанавливать куки вручную, в следующий раз, когда я открываю браузер, бот все еще авторизован. Я думаю, это может быть связано с userDataDir, но не уверен. Кто-нибудь знает?


(async () => {
    const browser = await getBrowser();
    const page = await browser.newPage();

      // Устанавливаем куки для страницы, если они у нас есть
      const cookies = readCookiesString();
      if (cookies) {
        const jsonCookies = JSON.parse(cookies) as Cookie[];
        const cleanedCookies = jsonCookies.map(
          ({ name, value, domain, path, expires, httpOnly, secure, sameSite }) => ({
            name,
            value,
            domain,
            path,
            expires,
            httpOnly,
            secure,
            sameSite,
          })
        );

         await page.setCookie(...cleanedCookies);
      }

     // Переходим на страницу по URL
      await page.goto(SITE_URL, {
        waitUntil: "domcontentloaded",
        timeout: NETWORK_TIMEOUT,
      });

      await delay(5000);

      await browser.close();
      await delay(5000);

      const browser2 = await getBrowser();
      const page2 = await browser2.newPage();

      await page2.goto(SITE_URL, {
        waitUntil: "domcontentloaded",
        timeout: NETWORK_TIMEOUT,
      });

})()

export const getBrowser = async ({
  noUserData = false,
  headless = false,
  args = [] as string[],
}: Options = {}) => {
  if (browser) {
    return browser;
  }

  const launchParams = {
    headless,
    ...(!!!noUserData && {
      userDataDir: `./src/sessions/userData`,
    }),
    args: [
      `--no-first-run`,
      `--ash-no-nudges`,
      `--no-default-browser-check`,
      ...args,
    ],
  };

  browser = await puppeteer.launch(launchParams);

  return browser;
};

Node: 21.2.0
Puppeteer:
“puppeteer”: “^22.8.2”,
“puppeteer-extra”: “^3.3.6”,
“puppeteer-extra-plugin-session”: “^1.0.1”,
“puppeteer-extra-plugin-stealth”: “^2.11.2”,
“puppeteer-extra-plugin-user-preferences”: “^2.4.1”,

Я пробовал следующее:

  1. устанавливал куки с помощью page.setCookie(…args) и с помощью network.send(“setCookie”, cookies)
  2. я пытался вручную записать в sqlite userDataDir, но это тоже не сработало

Ответ или решение

Конечно, давайте разберемся с вашей проблемой, связанной с тем, что Puppeteer не сохраняет куки при установке через page.setCookie() и закрытии браузера.

Судя по вашему коду и описанию, проблема действительно может быть связана с тем, как вы используете userDataDir. Когда вы запускаете Puppeteer с указанным параметром userDataDir, он должен сохранять состояние браузера, включая куки, расширения и другой контент в заданной папке.

Шаги для решения проблемы:

  1. Убедитесь в правильности указанного пути: Проверьте, чтобы путь к userDataDir был корректным и доступным для записи. Если указанный путь недоступен, Puppeteer не сможет сохранить куки.

    userDataDir: `./src/sessions/userData`, // Убедитесь, что эта папка существует и доступна
  2. Структура кода: Подумайте о том, чтобы позволить Puppeteer управлять жизненным циклом браузера, чтобы избежать потенциальных проблем с многопоточностью или конфликтами. Откройте браузер один раз и используйте его несколько раз, не закрывая.

  3. Проверка наличия и содержание куки: Сразу после установки куки, убедитесь, что они успешно установлены. Вы можете сделать это с помощью page.cookies() после вызова setCookie():

    const setCookiesResult = await page.setCookie(...cleanedCookies);
    console.log('Установленные куки:', await page.cookies());
  4. Использование одного экземпляра браузера: Попробуйте использовать один и тот же экземпляр браузера с одним и тем же userDataDir во всем скрипте. Это поможет убедиться в том, что куки сохраняются между сессиями:

    const browser = await getBrowser({ noUserData: false });
  5. Отложенные операции: Убедитесь, что вы даете достаточно времени для выполнения всех операций, особенно для установки куки и перехода по страницам. В случае сетевых запросов это может быть критично.

  6. Проверка других плагинов: Убедитесь, что используемые вами плагины (например, puppeteer-extra-plugin-session, stealth) не вызывают конфликтов в работе с куками.

Вот как может выглядеть ваша обновленная функция getBrowser с учетом вышеуказанных рекомендаций:

export const getBrowser = async ({
  noUserData = false,
  headless = false,
  args = [] as string[],
}: Options = {}) => {
  if (browser) {
    return browser;
  }

  const launchParams = {
    headless,
    ...(!!!noUserData && {
      userDataDir: `./src/sessions/userData`,
    }),
    args: [
      `--no-first-run`,
      `--ash-no-nudges`,
      `--no-default-browser-check`,
      ...args,
    ],
  };

  browser = await puppeteer.launch(launchParams);
  return browser;
};

Заключение

Сохраняя эти советы в уме, попробуйте снова выполнить ваш скрипт. Если проблема сохраняется, проверьте наличие ошибок в консоли и убедитесь, что вы обрабатываете все возможные исключения. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...