web-dev-qa-db-fra.com

comment gérer la session de connexion à travers le chrome sans tête?

J'ai besoin de faire un grattoir pour:

ouvrez le navigateur sans interface graphique, accédez à url , connectez-vous (il y a Steam oauth), remplissez quelques entrées, cliquez sur 2 boutons

le problème est que chaque nouvelle instance de navigateur sans tête efface ma session de connexion, et puis je dois me connecter encore et encore ... comment le sauvegarder à travers des instances? par exemple en utilisant puppeteer avec chrome sans tête

ou comment puis-je ouvrir une instance déjà enregistrée dans Chrome Headless? si je me connecte déjà dans ma fenêtre principale chrome

9
Anton Kurtin

Dans puppeter, vous avez accès aux cookies de session via page.cookes()

Donc, une fois que vous vous êtes connecté, vous pouvez récupérer tous les cookies et les sauvegarder dans un fichier json avec 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')
})

Ensuite, lors de votre prochaine itération, juste avant d'utiliser page.goto() pour charger l'URL, vous pouvez utiliser page.setCookie() pour charger les cookies du fichier un à un:

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
  }
}

Commander les docs:

10
Ecovirtual

Il existe une option pour enregistrer les données de l'utilisateur à l'aide de l'option userDataDir lors du lancement de puppeteer. Ceci stocke la session et d’autres choses liées au lancement de chrome. 

puppeteer.launch({
  userDataDir: "./user_data"
});

Cela ne rentre pas dans les détails, mais voici un lien vers la documentation: https://pptr.dev/#?product=Puppeteer&version=v1.6.1&show=api-puppeteerlaunchoptions

12
meatherly

Pour une version de la solution ci-dessus qui fonctionne réellement et ne repose pas sur jsonfile (à la place de la plus standard fs), vérifiez ceci:

Installer:

const fs = require('fs');
const cookiesPath = "cookies.txt";

Lecture des cookies (mettez ce code en premier):

// 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')
  }
}

Ecrire les cookies:

// Write Cookies
const cookiesObject = await page.cookies()
fs.writeFileSync(cookiesPath, JSON.stringify(cookiesObject));
console.log('Session has been saved to ' + cookiesPath);
4
Daniel Porteous