Google 驱动器 API 在获取文件时说 "Forbidden"
Google Drive API Says "Forbidden" When Fetching File
出于某种原因,我想从 google 驱动器获取文件并在服务器上处理它。我从选择器中获取 FileID 并将其发送到后端以供下载和处理。因此,在使用 googleapi 下载文件时,出现此错误
先决条件
- 驱动器 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
of auth: "MY ACCESS TOKEN",
是下载文件的有效访问令牌。
req.body.url
of fileId: req.body.url,
是不是 URL. 的文件 ID
如果我的猜测不正确,请告诉我。
如果我的猜测是正确的,请确认以下修改。
修改点:
- 很遗憾,
MY ACCESS TOKEN
不能直接用于 google.drive()
和 drive.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文档文件(Google文档、Google电子表格、Google幻灯片等)之外的文件。请注意这一点。
参考:
出于某种原因,我想从 google 驱动器获取文件并在服务器上处理它。我从选择器中获取 FileID 并将其发送到后端以供下载和处理。因此,在使用 googleapi 下载文件时,出现此错误
先决条件
- 驱动器 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()
和drive.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文档文件(Google文档、Google电子表格、Google幻灯片等)之外的文件。请注意这一点。