簡體   English   中英

節點 `https.get` 返回 403,`axios.get` 和 `curl` 返回 200

[英]Node `https.get` returns 403, `axios.get` and `curl` return 200

我正在嘗試使用 Node 的本機https模塊和 3rd 方axios模塊(非常常用)執行 GET 請求:

const endpoint = 'https://www.pathofexile.com/api/trade/data/stats';

require('axios')
    .get(endpoint)
    .then(response => console.log('axios', response.status));
// prints 200

require('https')
    .get(endpoint, {},
        response => console.log('https', response.statusCode));
// prints 403

axios請求按預期工作正常; 我也可以查看response.data 但是https請求失敗並顯示 403。

  • 奇怪的是,幾個月前我上次檢查時,它們都曾經工作過。
  • 我還沒有在我的機器上更新 Node(節點 v 14.5.0)。 我也在另一台機器上試過(13.3.0)。
  • 命令行中的curl也可以正常工作。

由於https過去可以工作,我的預感是服務器必須更改某些內容,並且https.getaxios.get必須做一些稍微不同的事情(例如,默認情況下發送不同的標頭),服務器不再對此漠不關心。

測試的一點點后,我注意到,默認情況下, https模塊包括User-Agent頭,而axioscurl都這樣做。 服務器拒絕您的請求,因為您沒有設置User-Agent

要解決此問題,只需指定您選擇的自定義User-Agent

require('https')
    .get(endpoint, {headers: {'User-Agent': 'whatever'}},
        response => console.log('https', response.statusCode));

在關注節點 https 的幾個網絡結果沒有找到答案之后,我發現另一個關於 python 的stackoverflow 帖子返回 403 而 curl 返回 200。

事實證明,這是請求的'User-Agent'標頭的問題。

Curl 默認發送用戶代理'curl/7.72.0'

> GET /94548/2401383/manifest.js HTTP/1.1
> Host: cdn.flashtalking.com
> User-Agent: curl/7.72.0
> Accept: */*

Axios 默認發送用戶代理'axios/0.20.0\\r\\n'

_header: 'GET /api/trade/data/stats HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'User-Agent: axios/0.20.0\r\n' +
      'Host: www.pathofexile.com\r\n' +
      'Connection: close\r\n' +
      '\r\n',

雖然默認情況下節點的 https 不發送用戶代理:

  _header: 'GET /api/trade/data/stats HTTP/1.1\r\n' +
    'Host: www.pathofexile.com\r\n' +
    'Connection: close\r\n' +
    '\r\n',

顯然,服務器現在檢查非空的User-Aagent標頭。 更新 https 請求會得到 200:

const endpoint = 'https://www.pathofexile.com/api/trade/data/stats';

require('axios')
    .get(endpoint)
    .then(response => console.log('axios', response.status));
// prints 200

require('https')
    .get(endpoint, {},
        response => console.log('https', response.statusCode));
// prints 403


require('https')
    .get(endpoint, {header: {headers: {'User-Agent': '_'}}}},
        response => console.log('https', response.statusCode));
// prints 200

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM