web-dev-qa-db-ja.com

ヘッドレスクロムを介してログインセッションを管理する方法は?

私はスクレーパーを作る必要があります:

ヘッドレスブラウザーを開き、 rl に移動し、ログイン(Steam oauthがあります)、入力を入力し、2つのボタンをクリックします

問題は、ヘッドレスブラウザのすべての新しいインスタンスがログインセッションをクリアし、その後何度もログインする必要があることです...インスタンスを通してそれを保存する方法は?たとえば、ヘッドレスクロームで操り人形師を使用する

または、すでにログインしているchrome headlessインスタンスを開くにはどうすればよいですか?メインでログインしている場合chrome window

19
Anton Kurtin

Puppeterでは、page.cookies()を介してセッションCookieにアクセスできます。

したがって、ログインすると、すべてのCookieを取得し、 jsonfile を使用してjsonファイルに保存できます。

_// 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を1つずつロードできます。

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

ドキュメントをチェックアウトします。

20
Ramiro

Puppeteerの起動時にuserDataDirオプションを使用してユーザーデータを保存するオプションがあります。これは、Chromeの起動に関連するセッションおよびその他のものを保存します。

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

詳細は説明しませんが、次のドキュメントへのリンクを参照してください。 https://pptr.dev/#?product=Puppeteer&version=v1.6.1&show=api-puppeteerlaunchoptions

39
meatherly

実際に機能し、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);
10
Daniel Porteous

クッキーを書くために

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

Cookieを読み取るには、プロジェクトにjsonfileをインストールする必要があります。npminstall 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を使用してこれらの2つの関数を呼び出すと、機能します。

0
Meet Mahajan