как управлять входом в сеанс через безгласный хром?
Мне нужно сделать скребок для:
откройте безголовый браузер, перейдите по ссылке, войдите в систему (есть steam oauth), заполните некоторые поля, нажмите 2 кнопки
проблема в том, что каждый новый экземпляр безголового браузера очищает мой сеанс входа в систему, а затем мне нужно войти снова и снова... как сохранить его через экземпляры? например, используя кукловод с хромом без головы
или как открыть уже залогиненный в Chrome безголовый экземпляр? если я уже захожу в главное окно Chrome
Ответы
Ответ 1
В Puppeter у вас есть доступ к сессионным куки файлам через page.cookies()
.
Поэтому, войдя в систему, вы можете получить каждый файл cookie и сохранить его в файле json, используя jsonfile:
// Save Session Cookies
const cookiesObject = await page.cookies()
// Write cookies to temp file to be used in other profile pages
jsonfile.writeFile(cookiesFilePath, cookiesObject, { spaces: 2 },
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 из файла по page.setCookie()
:
const previousSession = fileExistSync(cookiesFilePath)
if (previousSession) {
// If file exist load the cookies
const cookiesArr = require('.${cookiesFilePath}')
if (cookiesArr.length !== 0) {
for (let cookie of cookiesArr) {
await page.setCookie(cookie)
}
console.log('Session has been loaded in the browser')
return true
}
}
Оформить документы:
Ответ 2
Существует возможность сохранить пользовательские данные с userDataDir
опции userDataDir
при запуске кукловода. Здесь хранятся сессии и другие вещи, связанные с запуском Chrome.
puppeteer.launch({
userDataDir: "./user_data"
});
Это не вдаваться в подробности, но здесь ссылка на документы для этого: https://pptr.dev/#?product=Puppeteer&version=v1.6.1&show=api-puppeteerlaunchoptions
Ответ 3
Для версии вышеупомянутого решения, которая действительно работает и не полагается на jsonfile
(вместо этого используя более стандартную fs
), проверьте это:
Настроить:
const fs = require('fs');
const cookiesPath = "cookies.txt";
Чтение файлов cookie (поставьте этот код первым):
// 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')
}
}
Написание куки:
// 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')
}
Для чтения Cookies, для этого вам нужно установить 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
и он будет работать для вас.