我正在编写一个 chrome 扩展,它将拦截某些下载(当前为 .doc 和 .docx 文件),并获取这些文件并自动将它们上传到您的 Google 驱动程序文件夹。这是我的清单:
{
// Default manifest crap.
"manifest_version": 2,
"name": "App",
"description": "SpartaHack 2016 application",
"version": "1.0",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
// Content security needed to access gapi script.
"content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'",
// Need to view downloads, and identity for obvious reasons.
// The other two permissions allow the script to access files that are outside our domain.
"permissions": [
"downloads",
"identity",
"http://*/",
"https://*/"
],
// Gives us the auth information.
"oauth2": {
"client_id": "id",
"scopes": [
"https://www.googleapis.com/auth/drive.file",
"https://www.googleapis.com/auth/userinfo.profile"
]
},
// Scripts that are always running.
// Client.js has the gapi script, eventPage is our code.
"background": {
"scripts": ["client.js", "eventPage.js"]
}
}
如果需要的话,我还编写了以下执行授权的方法:
chrome.identity.getAuthToken({
"interactive": true
}, sendAuthToken);
function sendAuthToken(token) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=' + token, true);
xhr.onload = function() {
console.log(xhr.response);
}
//TODO:
xhr.send();
console.log(token);
watchDownloads();
}
这个片段是我从某个地方的示例中找到的。似乎仅执行授权还不够,我还必须使用此令牌发送对用户信息的请求。这部分不会给我带来任何麻烦 - 令牌记录正常,并且记录的响应按预期显示了我的所有信息。
watchDownloads() 如下所示:
function watchDownloads() {
chrome.downloads.onCreated.addListener(function(download) {
if(download.url.endsWith(".doc") || download.url.endsWith(".docx")) {
// Get blob from URL
var xhr = new XMLHttpRequest();
xhr.open("GET", download.url, true);
xhr.responseType = "blob";
xhr.onload = function(error) {
if(this.status == 200) {
insertFile(this.response, function(resp) {
console.log(resp);
});
}
};
xhr.send();
}
});
}
简而言之,它会查找我关心的两个文件扩展名,如果它看到它们,则应该使用另一个 HTTP 请求直接获取该文件到文件的 url,然后使用此方法将其上传到驱动器中,该方法具有大部分是根据在线样本拼凑而成的:
function insertFile(fileData, callback) {
const boundary = "-------314159265358979323846";
const delimiter = "\r\n--" + boundary + "\r\n";
const close_delimiter = "\r\n--" + boundary + "--";
//TODO: Remove
console.log(fileData);
var reader = new FileReader();
reader.readAsBinaryString(fileData);
reader.onload = function(error) {
var contentType = fileData.type || "application/octet-stream";
var metadata = {
// "title": fileData.filename,
"title": "Potato",
"mimeType": contentType
};
var base64Data = btoa(reader.result);
var multipartRequestBody =
delimiter +
"Content-Type: application/json\r\n\r\n" +
JSON.stringify(metadata) +
delimiter +
"Content-Type: " + contentType + "\r\n" +
"Content-Transfer-Encoding: base64\r\n\r\n" +
base64Data +
close_delimiter;
//TODO: Remove
console.log(multipartRequestBody);
var request = gapi.client.request({
"path": "/upload/drive/v3/files",
"method": "POST",
"params": {
"key": "key",
"uploadType": "multipart"
},
"headers": {
"Content-Type": 'multipart/mixed; boundary="' + boundary + '"'
},
"body": multipartRequestBody
});
//TODO: Remove
console.log(request);
if(!callback) {
callback = function(file) {
console.log(file)
};
}
request.execute(callback);
}
}
这就是它失败的地方。我似乎无法让它工作,因为每次都会出现以下错误:
我需要做什么才能在这里正确登录?我尝试过添加一个Authorization
标题中的属性,但得到相同的错误。