通过Chrome DevTools复制的node-fetch请求在Node环境返回403错误
以下是你可能遗漏的关键点,这些都是服务器返回403的常见原因:
缺少Cookie字段:浏览器访问网站时会自动携带网站之前设置的Cookie(包含会话验证、用户状态等信息),但DevTools复制的请求代码通常不会包含Cookie。服务器会通过Cookie判断请求是否来自合法的浏览器会话,没有Cookie会直接拒绝访问。你需要在请求头里手动添加浏览器中该请求对应的
Cookie字段。缺失标准User-Agent头:你提供的请求头里没有
User-Agent字段,而浏览器请求都会带上这类标识(比如Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36)。node-fetch默认的User-Agent是node-fetch/x.x.x,服务器很容易识别出这不是浏览器请求,从而返回403。请求头中的HTML实体编码错误:你请求头里的
sec-ch-ua、sec-ch-ua-platform等字段用了"(HTML实体双引号),这是DevTools的显示格式,实际浏览器发送的请求里是普通双引号。直接使用"会导致服务器无法正确解析这些客户端提示字段,触发反爬校验。需要把"替换成普通双引号,示例:'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"', 'sec-ch-ua-platform': '"macOS"'可能的其他校验:部分服务器会校验请求头的顺序、是否有特定隐含头,或者通过TLS指纹识别请求来源(node-fetch的TLS指纹和浏览器不同),不过前三点是最优先的排查方向。
内容的提问来源于stack exchange,提问作者supersize

