在this thread的帮助下,我想到了下面的代码。如何获取Google云端硬盘文件ID,打开指向该文件的直接链接,并获取流式传输超过100 MB所需的病毒扫描确认ID,然后弄乱该链接?我有点卡在xhr部分。
function fixGoogleDriveURL(url) {
if (url.indexOf('drive.google.com') !== -1) {
var DocIDfull = url;
var DocIDstart = DocIDfull.indexOf('open?id=');
if (DocIDstart == -1) {
// invalid
return url;
}
var DocID = DocIDfull.slice(DocIDstart+8);
url = 'https://drive.google.com/uc?export=download&id=' + DocID;
var xhr = new XMLHttpRequest();
xhr.onload = function () {
if (xhr.readyState === xhr.DONE) {
if (xhr.status === 200) {
var token = xhr.responseText.match("/confirm=([0-9A-Za-z]+)&/");
window.location.replace(url + '&confirm=' + token[1]);
// should I add url += '&confirm=' + token[1] here instead of window.location?
}
}
};
xhr.open("GET", url);
xhr.send();
}
return url;
}
console.log(fixGoogleDriveURL('https://drive.google.com/open?id=1C25uoL6nIqqNhex3wm8VwODsO2q2pXBt') + "\n<-- should output:\nhttps://drive.google.com/uc?export=download&id=1C25uoL6nIqqNhex3wm8VwODsO2q2pXBt&confirm=XXXXX");
答案 0 :(得分:1)
Google未明确允许使用客户端JavaScript抓取GDrive,因此您的Ajax调用/ XHR失败。
解决此限制的唯一方法是在中间使用代理,该代理将转发Google的网站代码,但添加适当的访问控制允许来源标头。 您可以为此使用自己的服务器(某些最小的服务器端脚本代码即可),也可以使用诸如http://multiverso.me/AllOrigins/或https://corsproxy.github.io/之类的服务为您代理请求。
AllOrigins站点上有一些与jQuery一起使用的示例代码,但基本上,它们通过URI编码要访问的URL并将该字符串附加到站点的代理URL上来工作。
这是freecodecamp.org的一篇文章,概述了如何使用这些服务(跳至Don’t Let CORS Stop You!
部分。
注意:一个安全建议:这些服务现在可以正常工作,但是明天可能会倒闭,开始提供恶意数据,或者将您的文件请求重定向到完全不同的文件或完全不同的网站。由您决定是否要信任这些陌生人。