Вопрос или проблема
У меня есть скрипт 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”,
Я пробовал следующее:
- устанавливал куки с помощью page.setCookie(…args) и с помощью network.send(“setCookie”, cookies)
- я пытался вручную записать в sqlite userDataDir, но это тоже не сработало
Ответ или решение
Конечно, давайте разберемся с вашей проблемой, связанной с тем, что Puppeteer не сохраняет куки при установке через page.setCookie()
и закрытии браузера.
Судя по вашему коду и описанию, проблема действительно может быть связана с тем, как вы используете userDataDir
. Когда вы запускаете Puppeteer с указанным параметром userDataDir
, он должен сохранять состояние браузера, включая куки, расширения и другой контент в заданной папке.
Шаги для решения проблемы:
-
Убедитесь в правильности указанного пути: Проверьте, чтобы путь к
userDataDir
был корректным и доступным для записи. Если указанный путь недоступен, Puppeteer не сможет сохранить куки.userDataDir: `./src/sessions/userData`, // Убедитесь, что эта папка существует и доступна
-
Структура кода: Подумайте о том, чтобы позволить Puppeteer управлять жизненным циклом браузера, чтобы избежать потенциальных проблем с многопоточностью или конфликтами. Откройте браузер один раз и используйте его несколько раз, не закрывая.
-
Проверка наличия и содержание куки: Сразу после установки куки, убедитесь, что они успешно установлены. Вы можете сделать это с помощью
page.cookies()
после вызоваsetCookie()
:const setCookiesResult = await page.setCookie(...cleanedCookies); console.log('Установленные куки:', await page.cookies());
-
Использование одного экземпляра браузера: Попробуйте использовать один и тот же экземпляр браузера с одним и тем же
userDataDir
во всем скрипте. Это поможет убедиться в том, что куки сохраняются между сессиями:const browser = await getBrowser({ noUserData: false });
-
Отложенные операции: Убедитесь, что вы даете достаточно времени для выполнения всех операций, особенно для установки куки и перехода по страницам. В случае сетевых запросов это может быть критично.
-
Проверка других плагинов: Убедитесь, что используемые вами плагины (например,
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;
};
Заключение
Сохраняя эти советы в уме, попробуйте снова выполнить ваш скрипт. Если проблема сохраняется, проверьте наличие ошибок в консоли и убедитесь, что вы обрабатываете все возможные исключения. Удачи!