使用 MediaWiki REST API“比较”修订版时出现 403 错误

问题描述 投票:0回答:1

我正在为自己构建一个简单的工具,它将使用(通过向 WikiMedia REST API 发送请求,如 API 文档中所述:Reference#Compare revisions)显示 Wikipedia 上修订版之间的差异。

这是检索我想要的 JSON 的代码示例:

const url = "https://en.wikipedia.org/w/rest.php/v1/revision/1157633768/compare/1157658266";
let json = await fetch(url).then(resp=>{ return resp.json(); }); 
console.log(json)

此代码可以在本地 Node REPL 中运行,或者同样,如果我将浏览器指向 ,并使用浏览器内控制台运行代码,它也可以运行。同样,我可以简单地 curl

 该网址并在我的终端中打印数据。

但是,如果我在站点中使用相同的代码(或者,同等地,如果我使用浏览器内控制台在指向维基百科以外的站点时运行代码),我会收到 403 错误。这是我收到的错误:

GET https://en.wikipedia.org/w/rest.php/v1/revision/1157633768/compare/1157658266 403


{error: 'rest-cross-origin-anon-write', httpCode: 403, httpReason: 'Forbidden'}

错误标题似乎表明我被禁止访问,因为我试图从跨源站点写入,但我正在执行的请求是一个简单的只读请求,不是吗?根据上面链接的参考页面,当“

修订版不可公开访问”时,会返回错误 403。但是,它显然是可以公开访问的,因为我可以从任何浏览器或curl

访问它而无需身份验证。

[注意,如果我使用此 API 发出任何其他请求,例如使用 url

https://en.wikipedia.org/w/rest.php/v1/revision/1157633768/bare 获取单个修订的详细信息(如文档中所示:Reference#Get_revision

),我不会收到此错误。仅当请求 
{from}/compare/{to}
 路线时才有效。]

我尝试将

?origin=*

 添加到网址中
正如
MediaWiki Action API网站建议的那样这里。我知道这是一个不同的 API,但它仍然值得一试。

我不太了解跨域请求,但我觉得这应该很简单。我不想做任何需要身份验证的事情。

javascript wikipedia-api mediawiki-api
1个回答
0
投票
该错误源自“Origin”标头(无双关语),浏览器可能会也可能不会将其添加到所有 XMLHttpRequest 中。不幸的是,“Origin”标头位于“禁止标头名称”列表中,因此无法更改或删除。

为了解决这个错误,我会按照@PCDSandwichMan 在评论中建议的方式进行操作,并(暂时)通过服务器端代理。如果您的服务器支持 PHP 并且“allow_url_fopen”设置为 true,您可以将以下 proxy.php

添加到您的 Web 根目录:

<?php readfile('https://en.wikipedia.org/w/rest.php/v1' . $_GET['path']);

并将你的 JS 代码更改为
const url = "/proxy.php?path=" + encodeURIComponent("/revision/1157633768/compare/1157658266");
const json =await fetch(url).then(resp=>{ return resp.json(); }); 
console.log(json);

如果您的网络主机没有“allow_url_fopen”,但启用了 PHP cURL 模块,请将
proxy.php
的内容更改为:

<?php $ch = curl_init('https://en.wikipedia.org/w/rest.php/v1' . $_GET['path']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); echo curl_exec($ch); curl_close($ch);

我已经成功测试了这两个选项。
    

© www.soinside.com 2019 - 2024. All rights reserved.