как управлять входом в сеанс через безгласный хром?

Мне нужно сделать скребок для:

откройте безголовый браузер, перейдите по ссылке, войдите в систему (есть 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 и он будет работать для вас.