【问题标题】:Why Can't I Fetch a Webpage (With NodeJS and Node-Fetch)?为什么我无法获取网页(使用 NodeJS 和 Node-Fetch)?
【发布时间】:2021-03-03 04:27:32
【问题描述】:

我正在尝试获取一个站点:link here。如果单击该链接,它将显示 JSON:{"error":"Socket Error"}。我正在尝试获取该网站,并返回错误。

但是,我收到了 403 Forbidden 错误。是否有一个原因?我关闭了CORS,但我认为它没有做任何事情。这是我尝试过的一个示例:

async function b(){
  error = await fetch('https://matchmaker.krunker.io/seek-game?hostname=krunker.io&region=us-ca-sv&game=SV%3A4jve9&autoChangeGame=false&validationToken=QR6beUGVKUKkzwIsKhbKXyaJaZtKmPN8Rwgykea5l5FkES04b6h1RHuBkaUMFnu%2B&dataQuery=%7B%7D', {mode:'no-cors'}).then(res=>res.json())
  console.log(JSON.stringify(error))
}
b()

为什么似乎没有任何效果? 如果我需要添加任何内容,请发表评论,这是我的第一篇 Stack Overflow 帖子,所以我仍然对什么是好问题感到有些困惑。感谢您的帮助!

注意:我的环境是 Node.JS(在 Repl.it 上进行测试,我认为它使用了最新的 Node 版本)。

【问题讨论】:

  • 你在这里控制服务器端吗?也许他们只允许来自某些服务器的请求
  • @LucaKiebel,不,我不控制服务器端。但是,我确实知道 CORS 模式 Access-Control-Allow-Origin 正在阻止我(至少我认为)。
  • 那么你真的不能对它做任何事情。如果他们不提供公共 API,并且他们不希望您访问他们的 API,那么它将无法工作
  • @LucaKiebel 好的,感谢您的帮助!
  • 您可能想要使用(获取)请求标头来模仿您的浏览器。或者只是模仿 curl 标题(或使用 curl),这似乎工作正常 :-)

标签: node.js fetch node-fetch


【解决方案1】:

此特定主机受保护宽度 Cloudflare 防 DDoS 保护。服务器不接受fetch 发出的请求,但接受来自curl 的请求。天知道为什么。

$ curl 'https://matchmaker.krunker.io/seek-game?hostname=krunker.io&region=us-ca-sv&game=SV%3A4jve9&autoChangeGame=false&validationToken=QR6beUGVKUKkzwIsKhbKXyaJaZtKmPN8Rwgykea5l5FkES04b6h1RHuBkaUMFnu%2B&dataQuery=%7B%7D'

// => {"error":"Socket Error"}

您可以在 node.js 中使用 curlnode-libcurl 包。

const { curly } = require('node-libcurl')
const url = 'https://matchmaker.krunker.io/seek-game?hostname=krunker.io&region=us-ca-sv&game=SV%3A4jve9&autoChangeGame=false&validationToken=QR6beUGVKUKkzwIsKhbKXyaJaZtKmPN8Rwgykea5l5FkES04b6h1RHuBkaUMFnu%2B&dataQuery=%7B%7D'

curly.get(url)
    .then(({ statusCode, data }) => console.log(statusCode, data))

// => 400 { error: 'Socket Error' }

按预期工作:-)

【讨论】:

  • 非常感谢!这个解决方案工作了几天,现在好像我又被阻止了。我会保留这个作为答案,但你可以尝试更新它吗?非常感谢!
  • 可能是 Cloudflare 反 DDoS 保护将您识别为机器人并阻止了您的访问。
  • 查看该 URL 在同一 IP 上的浏览​​器中是否仍然有效。
  • 跟原产地有关。我去了https://matchmaker.krunker.io 并运行了函数b()(如上所示),得到了结果{ error: 'Socket Error' }。我知道您可以使用-H 标头(例如here)在cURL 中设置原点,但不知道如何使用node-libcurl 执行此操作。谢谢:)
  • 如果你愿意,可以回复我的new post。再次感谢
【解决方案2】:

您可以使用诸如 allorigins.win 之类的代理,它是一个 cors 代理,可以从 json 形式的 URL 中检索数据。您可以从这个 URL 获取:https://api.allorigins.win/raw?url=https://matchmaker.krunker.io/game-list?hostname=krunker.io

【讨论】:

  • 你的答案必须包含代码中的示例......毕竟这个问题很老......
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 2022-06-12
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多