您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

Nodejs读取Google Drive里面的文件

时间:2021-06-09 09:34:09  来源:  作者:前端在路上

最近在工作中遇到了一个场景:要做一个静态的网站,里面的内容是由设计编写的.md格式的内容。设计将编好的文档统一放在常用的google Drive里面,如下图

「JS小技巧」Nodejs读取Google Drive里面的文件

 

然后我需要将这些文档下载下来导入到我的项目里面,然后进行解析编译,最后展示在网页上面。最开始,每次下载.md、删除项目里面之前的.md、再导入新的.md, 没什么问题,但是设计时不时更新一下文档,然后我每次我都要痛苦地执行上面的操作,关键是这些.md还不止一个文件夹,文档的数量也有近百个,重复工作不胜其烦。

为了解决这个问题,我想到使用NodeJS编写一个简单的脚本,直接读取Google Drive里面的文件。下面记录了一些过程

Google搜索google drive api

「JS小技巧」Nodejs读取Google Drive里面的文件

 

非常多的API, 直接找我们需要的Download

「JS小技巧」Nodejs读取Google Drive里面的文件

 

然后这里有官方提供的案例

「JS小技巧」Nodejs读取Google Drive里面的文件

 

copy到项目里面,在build文件夹下建一个test.js,将刚刚copy的脚本放在里面。但是这个脚本,我们缺少fileId,拿不到fileId就无法去下载。于是去找get方法

「JS小技巧」Nodejs读取Google Drive里面的文件

 

从list返回集里面可以找到fileId, 且参数里面传入我们的driveId(文件夹的ID)

「JS小技巧」Nodejs读取Google Drive里面的文件

 

所以,我们现在我们依赖两个API: list和get。我们先读取文件夹里面全部的文件

async function list(folderId, limit = 100) {
  let files = [];
  let pageToken = null;
  let listOptions = {
    q: `'${folderId}' in parents`,
    fields: 'files(id,name,mimeType,trashed)'
  };
  while (true) {
    if (pageToken) {
      listOptions['pageToken'] = pageToken;
    }
    let response = await drive.files.list(listOptions);
    if (!response.data.files || !response.data.files.length) {
      break;
    }
    let limitReached = false;
    for (let file of response.data.files) {
      if (file.trashed) {
        continue;
      }
      delete (file.trashed);
      files.push(file);
      if (files.length >= limit) {
        limitReached = true;
        break;
      }
    }
    pageToken = response.data.nextPageToken;
    if (limitReached || !pageToken) {
      break;
    }
  }
  return files;
}

期望返回的files如下:

[
  {
    id: '3434UTHhlvdvpFL4hdHjsxImiLPKYLYh6VpK',
    name: 'Default Page.md',
    mimeType: 'text/markdown'
  },
  {
    id: '134Za--w6fKhGSZGPc7vWAn_ejg88Sx4pqf',
    name: 'Anchor.md',
    mimeType: 'text/markdown'
  },
]

这里的id就是fileId, 然后我们就可以通过

files.forEach(file => {
  drive.files.get({ fileId: file.id, alt: 'media' }).then(res => {
		console.log('res', res.data)
    // writeFile
  });
});

到这里,基本上主要的Google Drive的API已经用完了,但是,我们知道使用Google Drive是需要登录认证,只有授权账户才能访问文件。所以接下来的工作就是获取Google Auth。

 

Get Google Auth

「JS小技巧」Nodejs读取Google Drive里面的文件

 

从Google API Console[
https://console.cloud.google.com/apis/dashboard]进入Google Developer Console。新建一个project

「JS小技巧」Nodejs读取Google Drive里面的文件

 

填写project信息

「JS小技巧」Nodejs读取Google Drive里面的文件

 

这样,project就创建好了,我们还需要给它配置api

「JS小技巧」Nodejs读取Google Drive里面的文件

 

选择google drive

「JS小技巧」Nodejs读取Google Drive里面的文件

 

启用google drive

「JS小技巧」Nodejs读取Google Drive里面的文件

 

为了使用API, 我们创建凭据

「JS小技巧」Nodejs读取Google Drive里面的文件

 

继续

「JS小技巧」Nodejs读取Google Drive里面的文件

 

继续

「JS小技巧」Nodejs读取Google Drive里面的文件

 

继续

「JS小技巧」Nodejs读取Google Drive里面的文件

 

继续

「JS小技巧」Nodejs读取Google Drive里面的文件

 

完成后就看到生成的服务账号了,点击编辑

「JS小技巧」Nodejs读取Google Drive里面的文件

 

生成秘钥

「JS小技巧」Nodejs读取Google Drive里面的文件

 

导出为json格式,并保存到项目中credentials.json

「JS小技巧」Nodejs读取Google Drive里面的文件

 

接下来,我们就可以使用生成的凭据来获得Google Auth了

const { google } = require("googleapis");
const credentials = require("./credentials.json");
const scopes = ["https://www.googleapis.com/auth/drive"];
const auth = new google.auth.JWT(
  credentials.client_email,
  null,
  credentials.private_key,
  scopes
);
const drive = google.drive({ version: "v3", auth });

至此,我们的读取Google Drive的功能全部介绍到了。但是想要使用,还需要给对象文件(夹)share with service account email id.

「JS小技巧」Nodejs读取Google Drive里面的文件

 

这里的email来源于上面credentials.json里面的的client_email。

「JS小技巧」Nodejs读取Google Drive里面的文件

 

至此,我们就能真正访问到Google Drive里面的文件了。下面是全部的脚本

const { google } = require("googleapis");
const writeFile = require('write');
const { resolve } = require('path');

const folders = [
  {
    name: '组件文档',
    folderId: '1sfsCs5ojo4g-RJU-GamENaetNpJlpVYiNQ',
    dest: 'pages/components'
  },
  {
    name: '组件日志',
    folderId: '1MsdVAyt7_c1qsXM8ZxyVV_lxXG2_VhD6fW',
    dest: 'pages/record'
  },
  {
    name: '设计文档',
    folderId: '12IkZBRsdNjW_D0C3pKOseoehkGv0uZO3',
    dest: 'pages/design'
  },
]

const credentials = require("./credentials.json");
const scopes = ["https://www.googleapis.com/auth/drive"];
const auth = new google.auth.JWT(
  credentials.client_email,
  null,
  credentials.private_key,
  scopes
);
const drive = google.drive({ version: "v3", auth });

// 读取文件夹里面的文件,返回的数据格式如下:
// {
//   id: '1me2MPIehUw9LeP7sj4Px-V45G_m6mIGFZ',
//   name: 'Button.md',
//   mimeType: 'text/markdown'
// }
async function list(folderId, limit = 100) {
  let files = [];
  let pageToken = null;
  let listOptions = {
    q: `'${folderId}' in parents`,
    fields: 'files(id,name,mimeType, trashed)'
  };
  while (true) {
    if (pageToken) {
      listOptions['pageToken'] = pageToken;
    }
    let response = await drive.files.list(listOptions);
    if (!response.data.files || !response.data.files.length) {
      break;
    }
    let limitReached = false;
    for (let file of response.data.files) {
      if (file.trashed) {
        continue;
      }
      delete (file.trashed);
      files.push(file);
      if (files.length >= limit) {
        limitReached = true;
        break;
      }
    }
    pageToken = response.data.nextPageToken;
    if (limitReached || !pageToken) {
      break;
    }
  }
  return files;
}

folders.forEach(folder => {
  const { folderId, dest } = folder;
  list(folderId).then(files => {
    // console.log('files', files);
    files.forEach(file => {
      drive.files.get({ fileId: file.id, alt: 'media' }).then(res => {
        writeFile(`${resolve(dest)}/${file.name}`, res.data, {encoding: 'utf-8'});
        console.log(`Download ${resolve(dest)}/${file.name} success`);
      });
    });
  });
});

最终,完成需求,解放双手



Tags:Nodejs   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在此前写的文章“从零基础入门进行小程序开发实战”中,已经介绍过背单词的小程序,因为没有备案的服务器资源只能使用系统后台提供的缓存功能存储用户数据。缓存有大小限制,而且...【详细内容】
2021-07-27  Tags: Nodejs  点击:(108)  评论:(0)  加入收藏
最近在工作中遇到了一个场景:要做一个静态的网站,里面的内容是由设计编写的.md格式的内容。设计将编好的文档统一放在常用的Google Drive里面,如下图 然后我需要将这些文档下载...【详细内容】
2021-06-09  Tags: Nodejs  点击:(148)  评论:(0)  加入收藏
框架语言:nodejs 包:express fs目的通过nodejs实现一个大文件的断点下载的服务。代码由于没啥复杂的,这里直接上代码。 http断点下载是通过range来判断文件的起始位置的。其基...【详细内容】
2021-04-27  Tags: Nodejs  点击:(199)  评论:(0)  加入收藏
一、Debug 调试方法Node 的调试方法有很多,主要分为安装 node-inspect 包调试、用 Chrome DevTools 调试和 IDE 调试,可以在官网的 Docs Debugging Guide 查看安装方法。下面...【详细内容】
2020-08-24  Tags: Nodejs  点击:(69)  评论:(0)  加入收藏
NodeJS是服务器端JavaScript,是为在网络应用程序框架内实现高性能而开发的,并针对并发环境进行了优化。它是使用命令行工具,用JavaScript和C ++编写。它借助后端JavaScript代码...【详细内容】
2020-07-02  Tags: Nodejs  点击:(57)  评论:(0)  加入收藏
环境:远程系统 : deepIn 15.11本地系统:windows 7nodejs : 12.13.01.程序部署将nodejs程序同时放到远程系统和本地系统$ tree.├── index.js└── node_modules └── ex...【详细内容】
2020-06-26  Tags: Nodejs  点击:(96)  评论:(0)  加入收藏
安装nodejs和yarn的命令:curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repocurl --silent --location https://rpm.no...【详细内容】
2019-09-26  Tags: Nodejs  点击:(147)  评论:(0)  加入收藏
前言:身边越来越多的同事谈论Nodejs,谈其异步IO、事件回调、前后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,期望能够使用一种语言节省成本快速完成需求开发。与...【详细内容】
2019-08-30  Tags: Nodejs  点击:(186)  评论:(0)  加入收藏
▌简易百科推荐
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === 'a') { b = true} else { b = false}// goodb = a === 'a'2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Mason程    Tags:JavaScript   点击:(5)  评论:(0)  加入收藏
给新手朋友分享我收藏的前端必备javascript已经写好的封装好的方法函数,直接可用。方法函数总计:41个;以下给大家介绍有35个,需要整体文档的朋友私信我,1、输入一个值,将其返回数...【详细内容】
2021-12-15  未来讲IT    Tags:JavaScript   点击:(19)  评论:(0)  加入收藏
1. 检测一个对象是不是纯对象,检测数据类型// 检测数据类型的方法封装(function () { var getProto = Object.getPrototypeOf; // 获取实列的原型对象。 var class2type =...【详细内容】
2021-12-08  前端明明    Tags:js   点击:(23)  评论:(0)  加入收藏
作者:一川来源:前端万有引力 1 写在前面Javascript中的apply、call、bind方法是前端代码开发中相当重要的概念,并且与this的指向密切相关。本篇文章我们将深入探讨这个关键词的...【详细内容】
2021-12-06  Nodejs开发    Tags:Javascript   点击:(18)  评论:(0)  加入收藏
概述DOM全称Document Object Model,即文档对象模型。是HTML和XML文档的编程接口,DOM将文档(HTML或XML)描绘成一个多节点构成的结构。使用JavaScript可以改变文档的结构、样式和...【详细内容】
2021-11-16  海人为记    Tags:DOM模型   点击:(34)  评论:(0)  加入收藏
入口函数 /*js加载完成事件*/ window.onload=function(){ console.log("页面和资源完全加载完毕"); } /*jQuery的ready函数*/ $(document).ready(function(){ co...【详细内容】
2021-11-12  codercyh的开发日记    Tags:jQuery   点击:(35)  评论:(0)  加入收藏
一、判断是否IE浏览器(支持判断IE11与edge)function IEVersion() {var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isIE = userAgent.indexOf("comp...【详细内容】
2021-11-02  V面包V    Tags:Javascript   点击:(38)  评论:(0)  加入收藏
Null、Undefined、空检查普通写法: if (username1 !== null || username1 !== undefined || username1 !== '') { let username = username1; }优化后...【详细内容】
2021-10-28  前端掘金    Tags:JavaScript   点击:(50)  评论:(0)  加入收藏
今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化...【详细内容】
2021-10-18  前端达人    Tags:JS   点击:(51)  评论:(0)  加入收藏
带有多个条件的 if 语句把多个值放在一个数组中,然后调用数组的 includes 方法。// bad if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") { //logic } // be...【详细内容】
2021-09-27  羲和时代    Tags:JS   点击:(58)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条