cURL выдает правильный резонанс, но nodejs перенаправляет выборку на отказ в доступе

#node.js #fetch #node-fetch

#node.js #выборка #выборка узла

Вопрос:

Я хочу загрузить файл json с веб-сайта. Используя инструмент разработки Chrome, когда я копирую команду cURL URL-адреса загрузки файла, она выдает мне требуемый ответ json. Но при копировании команды fetch (nodejs) и запуске через модуль «node-fetch» он перенаправляет меня на страницу с отказом в доступе.

Использование выборки (скопированной точно с этого веб-сайта) через async / await

 (async ()=>{
    try
{
  var res=await fetch("url/getjson?file", {
    "headers": {
      "accept": "application/json, text/plain, */*",
      "accept-language": "en-GB,en-US;q=0.9,en;q=0.8",
      "content-type": "application/json",
      "sec-fetch-dest": "empty",
      "sec-fetch-mode": "cors",
      "sec-fetch-site": "same-origin",
      "sec-gpc": "1",
      "cookie": "cooookiiieee=correctcookie; AuthToken=gibberishh; UserName=blahblah; EntityRefId=pleasehelp"
      
    },
    "referrer": "referrerurl",
    "referrerPolicy": "strict-origin-when-cross-origin",
    "body": null,
    "method": "GET",
    "mode": "cors"
  });
  const content = await res.json();
  console.log(content);
}
catch(err){
console.log(err)
}
})();


 

Ответ выборки

 FetchError: invalid json response body at url/error/accessdenied reason: Unexpected token < in JSON at position 1
    at /home/user/Documents/node_modules/node-fetch/lib/index.js:272:32
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async /home/user/Documents/test/app.js:25:19 {
  type: 'invalid-json'
}

 

в то время как ответ с помощью команды cURL был правильным файлом json, поскольку он не перенаправляет меня.

Команда Curl

 curl 'url/getjson?file'   
-H 'Connection: keep-alive'   
-H 'Accept: application/json, text/plain, */*'   
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36'   
-H 'Content-Type: application/json'   
-H 'Sec-GPC: 1'   -H 'Sec-Fetch-Site: same-origin'   
-H 'Sec-Fetch-Mode: cors'   -H 'Sec-Fetch-Dest: empty'   
-H 'Referer: referrerurl'   
-H 'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8'   
-H 'Cookie: 
cooookiiieee=correctcookie; AuthToken=gibberishh; UserName=blahblah; EntityRefId=pleasehelp'   
--compressed
 

Комментарии:

1. Итак, если вы добавите console.log(res.status); перед await res.json(); тем, как он будет напечатан 403 ?

2. Он выдает ok ответ 200

3. Как выглядит команда curl?

4. Я добавил команду cURL.

5. Похоже, что json не возвращается с node-fetch вызовом. Замените res.json() на res.text() , чтобы посмотреть, показывает ли он что-нибудь.

Ответ №1:

Правильный ответ был получен после того, как я добавил User-Agent в заголовки, поскольку он рассматривал агента узла по умолчанию как бота. Он должен быть добавлен перед cookie, т.е. перед отправкой authToken.