JS Puppeteer cookie - ';'不允许?

JS Puppeteer cookie - ';' not allowed?

我正在尝试连接外部 API 并且必须向我的 POST 调用添加一个 cookie,但对于 puppeteer (13.5.0) 来说似乎长度太长了?

编辑

经过一些试验,问题似乎不是长度问题,而是字符“;”的使用问题。有办法解决这个问题吗?

如评论中所述,我已经尝试过 encodeURIComponent(),尽管调用正在处理(而不是给出错误)服务器不让它通过并在我使用它时抛出错误在邮递员中,未编码的 cookie 有效,编码的 cookie 无效。

根据 大多数现代后端都具有解码功能,但我们使用的后端显然没有(这是一个相当古老的后端)。然而,分号不应该被非法使用。

参考。 RFC 2965 第 12 页,第 3 段

Note: For backward compatibility, the separator in the Cookie header is semi-colon (;) everywhere.

编辑结束

当我在 javascript

中执行此操作时
await page.setCookie({name: 'Cookie', value: cookie, domain: 'https://www.example.com'});

当我将 cookie 值设置为较短的字符串且没有分号时,调用似乎有效。但是使用必要的 cookie 我收到一条错误消息。

错误:

error: new Errors_js_1.ProtocolError(),
       ^

ProtocolError: Protocol error (Network.setCookies): Invalid cookie fields
    at C:\Users\james\OneDrive\Bureaublad\connector\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:230:24
    at new Promise (<anonymous>)
    at CDPSession.send (C:\Users\james\OneDrive\Bureaublad\connector\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:226:16)
    at Page.setCookie (C:\Users\james\OneDrive\Bureaublad\connector\node_modules\puppeteer\lib\cjs\puppeteer\common\Page.js:772:32)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async loginRequest (C:\Users\james\OneDrive\Bureaublad\connector\connector.js:46:5) {
  originalMessage: 'Invalid cookie fields'
}

我需要使用的 cookie(433 个字符长):

Shortloin=alcatrasalami80er~SOCbiltongvenisonk/zPA==;chicken=leberkasdrumstickboudinbuffalofrankfurtershortribshamburger;Cowfatback=capicola;brisket=frankfurtersausageshanklelandjaegerdrumstickbacontonguechuckpigchislicbresaola;Cupimp=icanhabresaolaleberkas;Pancetta=picanhagroundroundbresaola;Tailcapicolaballtipmeatloaftenderloinchislicshankcornedbeefcowburgdoggen;Brisketdrumsticktenderloinshankporchetta;alcatratur=duckenTailswinesalamipicanha 

我在 postman 中尝试了相同的方法,我只是在 headers 页面中使用分号一键添加了 cookie,调用工作正常。

最小可重现示例:

const puppeteer = require('puppeteer');
const loginPage = 'https://whosebug.com/';

async function login() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.setCookie({name: 'Cookie', value: 'cookie=test;test=cookie' , domain: 'whosebug.com'}); 
    await page.goto(loginPage);
}

login();

您似乎将单个 cookie 的值与包含在 HTTP 请求中的 cookie 字符串混为一谈 headers。

// whoops, passing an etnire cookie string instead of the cookie value
await page.setCookie({name: 'Cookie', value: 'cookie=test;test=cookie' , domain: 'whosebug.com'}); 

您可以在您的 HTTP 请求中传递一个 cookie 字符串(例如 cookie=test;test=cookie)(我认为这是您对 postman 所做的),或者在浏览器中设置一个 cookie window将包含在后续的 HTTP 请求中。

page.setCookie 允许您在浏览器中设置 cookie,并方便地获取一组 cookie(参见 https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pagesetcookiecookies)。

因此,如果您想传递多个 cookie,您可以这样做:

const cookies = [
  { name: 'cookie', value: 'test', domain: 'whosebug.com' },
  { name: 'test', value: 'cookie', domain: 'whosebug.com' },
];

await page.setCookie(...cookies);