将签名的 cookie 传递给 puppeteer

use*_*421 2 cookies session node.js puppeteer

我正在使用 node.js 并且显然可以访问我的签名 cookie。

它们是这种形式:

{ 'connect.sid': 's:qX4ZrttrjydtrjkgsdghsdghrewynZj4Ew2OUh.tTSILkcvgsegsegsegsr99gmW5
0XLcJefM' }
Run Code Online (Sandbox Code Playgroud)

Puppeteer 支持 cookie 并且为了传递 cookie 的参数而有这个功能:

page.setCookie(...cookies)
...cookies <...Object>
name <string> required
value <string> required
url <string>
domain <string>
path <string>
expires <number> Unix time in seconds.
httpOnly <boolean>
secure <boolean>
sameSite <string> "Strict" or "Lax".
returns: <Promise>
Run Code Online (Sandbox Code Playgroud)

如您所见,您直接提供了每个字段的参数。有没有办法将我签名的 cookie 直接传递给 puppeteer?

Md.*_*her 6

您必须提取并使用正确的 cookie 格式。

  1. 首先安装这个名为EditThisCookie 的扩展。
  2. 然后导出你的cookie。您将获得一系列 cookie。 在此处输入图片说明

  3. 使用...spread 将所有 cookie 作为参数传递给setCookie.

    await page.setCookie(...cookies)
    
    Run Code Online (Sandbox Code Playgroud)

完毕!

如果你想写cookies,那么这里有一个格式。

const cookies = [
 {
    "domain": "localhost", // google.com, yahoo.com etc. Without the host
    "hostOnly": true,
    "httpOnly": true,
    "name": "connect.sid", // here is the actual cookie name
    "path": "/",
    "sameSite": "no_restriction",
    "secure": false,
    "session": true,
    "storeId": "0",
    "value": "s%3AliYZ-M8urEQLfgn2_kSG_FIPwVTr5VQs.5rrJW7hzuXebekzTRgPYFTYri5nljhGCp8Dz%2FgLoSN4", // and the value
    "id": 1
 }
]
Run Code Online (Sandbox Code Playgroud)

工作示例

const cookie = {
    name: 'login_email',
    value: 'set_by_cookie@domain.com',
    domain: '.paypal.com',
    url: 'https://www.paypal.com/',
    path: '/',
    httpOnly: true,
    secure: true
}

const puppeteer = require('puppeteer');


const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.setCookie(cookie)
await page.goto('https://www.paypal.com/signin')
await page.screenshot({
    path: 'paypal_login.png'
})
await browser.close()
Run Code Online (Sandbox Code Playgroud)

如果您注意到原始文档,它会显示page.setCookie(...cookies)带有三个点的 cookie。这基本上意味着您可以通过这种方式将对象数组作为参数传递。

您如何将数据放入 cookie 变量取决于您,您可以对其进行硬编码,您可以使用某些数据库等。这与您如何传递 cookie 无关。

如果它只有一个 cookie,就像在 paypal 示例中一样,您将它们传递给page.setCookie(cookie),但是如果它是多个 cookie,就像您从使用 EditThisCookie 或上面的 localhost 示例导出的那样,那么您必须使用带有三个点的扩展运算符,就像我上面解释的那样.

你可以阅读更多关于传播和休息这个问题

  • 非常感谢!你告诉我这是可能的。但是,我打算从节点内部执行此过程。所以我不能使用这样的扩展。你知道从 node.js 内部这是如何可行的吗?如果我知道这个扩展到底在做什么,也许我可以复制它。 (2认同)