httpOnly, secure 플래그 쿠키값이 필요한 경우 브라우저 쿠키 저장소에서 꺼낸다. HttpOnly 는 페이지의 JS(document.cookie)에서만 가려질 뿐 브라우저 쿠키 저장소에는 있다.1 Puppeteer 25 기준 browser.cookies() 가 그 저장소를 읽는다.2

const cookies = await browser.cookies() // HttpOnly 쿠키도 httpOnly: true 로 들어 있다

로컬에 해당 쿠키정보를 임시로 저장해서 재활용하고 만료 시 갱신하는 방법을 사용.

fs.writeFileSync('cookies.json', JSON.stringify(cookies))

await browser.setCookie(...JSON.parse(fs.readFileSync('cookies.json', 'utf8')))

예전 방식(CDP Network.getAllCookies, page.setCookie)은 둘 다 폐기됐다.3


Footnotes

  1. Set-Cookie - MDN: “Forbids JavaScript from accessing the cookie, for example, through the Document.cookie property.” ↩

  2. Browser.cookies() — Puppeteer: “Returns all cookies in the default BrowserContext.” · Browser.setCookie() — Puppeteer: “Sets cookies in the default BrowserContext.” ↩

  3. Chrome DevTools Protocol — Network.getAllCookies: “Deprecated. Use Storage.getCookies instead.” · Page.setCookie() — Puppeteer: “Page-level cookie API is deprecated. Use Browser.setCookie() or BrowserContext.setCookie() instead.” ↩

#91

setExtraHTTPHeaders 호출하기

await page.setExtraHTTPHeaders(headers)

인터셉트로 가로채기 — 켜면 모든 요청이 멈추니 헤더를 바꿔 continue 로 내보내야 한다.1

await page.setRequestInterception(true)

page.on('request', (request) => {
  const headers = {
    ...request.headers()
  }

  request.continue({ headers })
})

Footnotes

  1. HTTPRequest.continue() | Puppeteer: “Continues request with optional request overrides.” / Page.setRequestInterception(): “Once request interception is enabled, every request will stall unless it’s continued, responded or aborted; or completed using the browser cache.” ↩

#92

이미지 저장1

  • 페이지에서 JavaScript를 통해 이미지 추출
    • 캔버스에서 이미지 추출
    • 서버에서 이미지 가져오기
  • DevTools 프로토콜을 사용하여 이미지 추출
const client = await page.createCDPSession()
const { frameTree } = await client.send('Page.getResourceTree')

for (const resource of frameTree.resources) {
  const { content, base64Encoded } = await client.send(
    'Page.getResourceContent',
    { frameId: frameTree.frame.id, url: resource.url },
  )
  const contentBuffer = Buffer.from(content, base64Encoded ? 'base64' : 'utf8')
}
page.on('response', async (response) => {
  const url = response.url()
  const buffer = await response.buffer()
})

Footnotes

  1. Saving Images from a Headless Browser ↩

#93