我正在为自己构建一个简单的工具,它将使用(通过向 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,但它仍然值得一试。 我不太了解跨域请求,但我觉得这应该很简单。我不想做任何需要身份验证的事情。
<?php
readfile('https://en.wikipedia.org/w/rest.php/v1' . $_GET['path']);
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);