node.js - Google Drive API 在获取文件时显示“禁止”
问题描述
出于某种原因,我想从谷歌驱动器中获取文件并在服务器上处理它。从选择器中,我获取 FileID 并将其发送到后端进行下载和处理。所以在使用googleapis下载文件时,我收到了这个错误
先决条件
- Drive API 在项目中启用
- Access Token有Drive的权限
我尝试过的权限
- https://www.googleapis.com/auth/drive.readonly
- https://www.googleapis.com/auth/drive.file
- https://www.googleapis.com/auth/drive
我正在使用的代码来自 GitHub
const tmpDir = path.resolve(path.join(os.tmpdir(), "user-sheets"));
const file = path.join(tmpDir, Date.now().toString());
let stream = fs.createWriteStream(file);
let drive = google.drive({
version: "v3",
auth: "MY ACCESS TOKEN",
});
drive.files
.get(
{
fileId: req.body.url,
alt: "media",
oauth_token: "MY ACCESS TOKEN",
},
{
responseType: "stream",
}
)
.then((r) => {
r.data
.on("end", async () => {
console.log("ended");
stream.close();
})
.on("error", function (err) {
console.log("Error during download", err);
res.json({
success: false,
message: "Something went wrong",
error: err,
});
})
.pipe(stream);
})
.catch((e) => {
console.error(e.response);
});
解决方案
在这个答案中,我认为有以下几点。
MY ACCESS TOKEN
ofauth: "MY ACCESS TOKEN",
是下载文件的有效访问令牌。req.body.url
offileId: req.body.url,
是不是 URL 的文件 ID。
如果我的猜测不正确,请告诉我。
当我的猜测正确时,请确认以下修改。
修改点:
- 不幸的是,
MY ACCESS TOKEN
不能直接用于google.drive()
anddrive.files.get()
。
当这一点反映到您的脚本中时,它变成如下。
修改后的脚本:
从:let drive = google.drive({
version: "v3",
auth: "MY ACCESS TOKEN",
});
drive.files
.get(
{
fileId: req.body.url,
alt: "media",
oauth_token: "MY ACCESS TOKEN",
},
{
responseType: "stream",
}
)
至:
var oauth2Client = new google.auth.OAuth2();
oauth2Client.setCredentials({access_token: "MY ACCESS TOKEN"});
const drive = google.drive({
version: "v3",
auth: oauth2Client,
});
drive.files
.get(
{
fileId: req.body.url, // Please use the file ID here.
alt: "media",
},
{ responseType: "stream" }
)
笔记:
- 在这种情况下,可以下载除 Google Docs 文件(Google Document、Google Spreadsheet、Google Slides 等)之外的文件。请注意这一点。
参考:
推荐阅读
- c# - ASP.NET Core 分布式 Redis 缓存:断开连接
- python - Pandas - 查找过去 3 天的滚动平均值
- javascript - 自定义useOneLineText React Hook,可调整字体大小并始终将文本保持在一行
- python - linux上两个进程监听同一个串口
- azure-log-analytics - KQL 中的周边事件或多条件匹配
- python-3.x - AGI pyth2 + serversocket 无法发送命令
- python - 如何使用 for 循环更新列表
- math - 矩阵中平方子矩阵总数的公式
- javascript - 如何将 firebase 函数的输出返回到 index.js 文件的全局变量
- python - 错误:溢出错误:mktime 参数超出范围