Node.js - como obter o conteúdo da API do Google Drive da maneira mais rápida possível
Estou tentando criar um site com o Node.js e a API do Google Drive. Para fazer isso, depois de obter minha chave de API do google, posso acessar um link como este:
https://www.googleapis.com/drive/v3/files?q=%27{my folder ID}%27+in+parents&key={my API key}
e recebo uma resposta como esta:
{
"kind": "drive#fileList",
"incompleteSearch": false,
"files": [
{
"kind": "drive#file",
"id": "1MhS55q3ZmRyUxo_tPW3kqXuLIy-cAv1-",
"name": "Capture001.png",
"mimeType": "image/png"
},
{
"kind": "drive#file",
"id": "18y88x-DxOW4APcz6YGBFPVCeBB7eLPHC",
"name": "contact.html",
"mimeType": "text/html"
},
{
"kind": "drive#file",
"id": "1voNKTQv-kbyS-jJnsIXc-1OH1YudB3Xw4Dcvi6VKIqY",
"name": "test",
"mimeType": "application/vnd.google-apps.document"
},
{
"kind": "drive#file",
"id": "1QHbCATkynjDidEBjueVv4Qvh0ijfzV0S",
"name": "Copy of 5737-12, 5738-01 (Freidin).mp4",
"mimeType": "video/mp4"
},
{
"kind": "drive#file",
"id": "1u6VsnhYvvnEJlFXi_B7I-7DY4JkZP9mQ",
"name": "Copy of 5750-01-03 Mincha-Maftir, Sicha and dollars.mpg",
"mimeType": "video/mpeg"
}
]
}
e se eu obtivesse (teoricamente) um ID de um arquivo específico, poderia inseri-lo neste URL:
https://www.googleapis.com/drive/v3/files/{my file ID}?alt=media&key={my api key}
SO Estou tentando criar um site com o node.js, que quando alguém acessa meu site / somename, esse "somename" acessa valores em um dicionário com o ID da pasta principal no Google Drive, com a chave da API e, em seguida, é capaz de acessar teoricamente todos os arquivos / pastas dessa pasta com mysite / somename / file.png ou /somename/contact.html ou algo para exibir páginas html, aqui está minha tentativa completa de código do nodejs até agora (doesn ainda não suporta subdiretórios), você pode experimentá-lo com sua própria pasta do Google Drive e chave de API, basta conectá-lo ao objeto de banco de dados:
var http = require("http");
var fetch = require("node-fetch");
var gDriveFolder = (folderID, apiKey) => `https://www.googleapis.com/drive/v3/files?q=%27${folderID}%27+in+parents&key=${apiKey}`
var gDriveFile = (fileID, apiKey) => `https://www.googleapis.com/drive/v3/files/${fileID}?alt=media&key=${apiKey}`
var database = {
"coby": {
"apiKey":"{paste your API key here}",
"folder":"{paste the shared URL of your Google Drive folder here}"
}
}
var server = http.createServer((request, response) => {
var urlParts = request.url.split("/").filter(x => x.length > 0).map(x => x.split("%20").join(" "));
if(urlParts[0] != "favicon.ico") { //to not make more than neccesary requests
var html = "";
var json = database;
if(json) {
console.log("We have a JSON!", json);
if(urlParts.length > 0) {
var folderWentTo = urlParts[0];
var myData = null;
for(var k in database) {
if(k == folderWentTo) {
myData = json[k];
break;
}
console.log(k, ":", json[k]);
}
}
if(myData) {
var key = myData["apiKey"];
var mainFolderURL = gDriveFolder(IDfromDriveURL(myData["folder"]),key);
console.log("main folder: ", mainFolderURL);
myReq(mainFolderURL, (data) => {
var fileList = JSONorNull(data);
console.log("key???",key);
if(fileList) {
var html = "<b>nothing</b><br>";
var f = fileList["files"];
if(f) {
if(urlParts.length > 1) {
var fileObject = f.filter(x=>x["name"] == urlParts[1])[0];
if(fileObject) {
var fileID = fileObject["id"];
var fileRequestedURL = gDriveFile(fileID, key);
console.log("trying to get contents of ", fileRequestedURL);
myReq(fileRequestedURL, (fileData) => {
html = fileData;
console.log(fileObject["mimeType"]);
// console.log("file: ", fileObject["name"], "'s content: ", fileData);
// response.setHeader("Content-Type",fileObject["mimeType"]);
response.end(html);
});
} else {
html = "file not found!";
console.log("tried to find: ", urlParts[1], " in list: ", f);
response.end(html);
}
} else {
console.log("loaded");
f.forEach((y, o) => {
// var fileURL = gDriveFile(y["id"], myData["apiKey"]);
html += `<a href="${urlParts[0]}/${y["name"]}">${y["name"]}</a><br>`
});
response.end(html);
console.log("printed");
}
} else {
response.end(html);
}
} else {
response.end("this data: " + data + " went wrong");
}
});
} else {
html = ("asdf")
response.end(html);
}
console.log("url parts:", urlParts);
} else {
console.log("no json :(");
response.end("dude what happened with the JSON: " + json + ", from " + bdy);
}
}
});
server.listen(80);
function myReq(url, cb) {
var start = parseInt(Date.now());
console.log("started", start);
fetch(url).then(res => res.text()).then(body => {
var end = parseInt(Date.now());
console.log("ended at",end, " total:",(end-start));
if(cb) {
cb(body);
}
});
}
function JSONorNull(str) {
var result = null;
try {
result = JSON.parse(str);
} catch(e) {
console.log(str, " has an error: ", e);
}
return result;
}
function IDfromDriveURL(url) {
return url.split("/").length > 1 ? (url.split("/").filter(x=>x.includes("open"))).join("").replace("open?id=", "") : url;
}
o problema: atualmente estou usando node-fetch para obter o conteúdo, como você pode ver na função myReq, mas isso aparentemente está demorando muito tempo, IDK se for apenas a API do Google, mas duvido, acho é assim que estou obtendo o conteúdo ... Quando tento obter uma imagem simples de 800kb com localhost / coby / Capture1.png, ela é impressa no meu console (forma a função myReq):
started 1550048095674
ended at 1550048130691 total: 35017
isso significa que demorou 35 segundos para carregar (e baixar automaticamente) a imagem ... Também apenas para a página principal localhost / coby, o resultado é de 2500ms a 4440ms ....
SO claramente algo está errado com a API da unidade (que duvido) ou a busca de nós está agindo muito devagar ..
SO: qual é a maneira mais rápida de obter o conteúdo de uma página (e várias páginas, como o que estou fazendo) no node.js? Eu tentei o módulo de solicitação, mas também é lento e, supostamente, a busca deve ser mais rápida ...
Tente testá-lo com sua própria pasta do Google Drive e deixe-me saber se funciona rápido ou nã
ATUALIZA BTW, se eu simplesmente copiar esta função (e executá-la):
function coby2() {
var startTime = Date.now();
const drive_url = "https://www.googleapis.com/drive/v3/files?q=%27{my file id}%27+in+parents&key={myAPIkey}";
let drive_request = {
method: "GET",
/*headers: new Headers({
Authorization: "Bearer "+access_token
})*/
}
fetch(drive_url, drive_request).then( response => {
var txt = response.json();
console.log(response, txt);
return(txt);
}).then( list => {
var endTime = Date.now();
console.log("Found files:",list.files, " with time total: ", (endTime - startTime));
});
}
tempo de resposta @my é de cerca de 150 a 300ms e, se eu copiar exatamente a mesma função no Node.js e chamá-la na função de solicitação / resposta (na função http.createServer), a resposta ainda será de cerca de 4000ms. Eu acho que é algo com o módulo node-fetc