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);
我正在尝试连接外部 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);