下载 Google 某个帐户拥有并与我的服务帐户共享的云端硬盘文件

Download Google Drive file owned by some account and shared with my service account

有一个 URL 由 Google 云端硬盘托管的共享电子表格文件。

看起来像这个

https://docs.google.com/spreadsheets/d/1TFFswncS12FAc-Fsh33dMfL0UK87LCcZZNToV0/edit?usp=sharing

我想使用一些 Google 服务帐户和 Google Drive API 客户端库通过 nodejs 应用程序下载此文件。但据我所知,图书馆没有这样的方法或选项来通过 URL.

下载文件

https://developers.google.com/drive/api/v3/manage-downloads

取而代之的是,有一个 get 方法需要 fileId 属性,在我看来,通过 [=13] 访问某人的文件是不可能的=].

所以,很可能,我将不得不根据服务帐户 client_idprivate_key 生成一个身份验证令牌,并使用任何传递令牌的 HTTP 客户端下载(实际上是导出的 CSV) header.

这是一个正确的选择吗?如何在没有密码的情况下对应用程序进行身份验证?

我有这样的应用环境变量

GOOGLE_FEED_ACCOUNT_TYPE=service_account
GOOGLE_FEED_PROJECT_ID=my-app
GOOGLE_FEED_PRIVATE_KEY_ID=sdf796a7S58FSADF9A8S97FD987AS6D8F75A8Sas
GOOGLE_FEED_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n\n-----END PRIVATE KEY-----\n"
GOOGLE_FEED_CLIENT_EMAIL=my-app@example.com
GOOGLE_FEED_CLIENT_ID=398387234329388162487
GOOGLE_FEED_FOLDER_ID=1QFBASSDFasdfasew3wsD85cHpf-9U

您需要了解的是,如果其他人可以访问您的文件,那么就是它的私有数据。您需要获得果蝇所有者的许可才能访问它。使用服务帐户,您可以对其进行预授权并授予其对文件的访问权限。如果该人与服务帐户电子邮件地址共享文件,就像您与任何其他用户共享文件一样,那么服务帐户将有权下载文件。

Is that a correct choice and how to authenticate to the app without password?

您可以访问私人用户数据的唯一方法是用户授予您访问权限。您可以使用 Oauth2 并要求用户 运行 您的应用程序并授予您访问权限,或者您可以使用服务帐户并预授权它访问数据。

如果他们不以某种方式授予您访问权限,则确实无法访问私人用户数据。客户端登录使用了登录名和密码,并于 2015 年被 google 关闭,因此多年来一直无法使用。

正在使用服务帐户导出 sheet。

你是对的,这不是通过下载 url 完成的,这是通过使用你要下载的文件的 file.id 完成的。

因为你会 downloading google sheet 你会想要 file.export 下载电影。文件导出会将您的 sheet 转换为 csv 文件,以便您可以在您的计算机上阅读它。

只需确保您已与服务帐户共享它。

const {google} = require('googleapis');

const auth = new google.auth.GoogleAuth({
  keyFile: '/path/to/your-secret-key.json',
  scopes: ['https://www.googleapis.com/auth/cloud-platform'],
});

var fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
var dest = fs.createWriteStream('/tmp/resume.pdf');
    drive.files.export({
      fileId: fileId,
      mimeType: 'application/pdf'
    })
        .on('end', function () {
          console.log('Done');
        })
        .on('error', function (err) {
          console.log('Error during download', err);
        })
        .pipe(dest);