【问题标题】:How to change access to a particular folder of google drive using node.js?如何使用 node.js 更改对谷歌驱动器特定文件夹的访问?
【发布时间】:2023-03-25 20:00:02
【问题描述】:

我正在学习关于 node.js 的 google drive API。我很想知道如何在 node.js 中更改谷歌驱动器的特定文件/文件夹的访问类型?

意思是假设我在谷歌驱动器中有一个名为Batman 的文件夹。 batman文件夹里面有3个文件,一个文件的访问类型是public,另一个文件的访问类型是private。那么,如何遍历batman文件夹来更改access type的子文件呢?

代码:(它从 google 驱动器中获取 10 个文件名)

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


 const SCOPES = ['https://www.googleapis.com/auth/drive'];

 const TOKEN_PATH = 'token.json';

 // Load client secrets from a local file.
 fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  // Authorize a client with credentials, then call the Google Drive API.
 authorize(JSON.parse(content), listFiles);
  });



 function authorize(credentials, callback) {
  const {client_secret, client_id, redirect_uris} = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
  client_id, client_secret, redirect_uris[0]);

// Check if we have previously stored a token.
fs.readFile(TOKEN_PATH, (err, token) => {
if (err) return getAccessToken(oAuth2Client, callback);
oAuth2Client.setCredentials(JSON.parse(token));
callback(oAuth2Client);
});
}

function getAccessToken(oAuth2Client, callback) {
const authUrl = oAuth2Client.generateAuthUrl({
  access_type: 'offline',
  scope: SCOPES,
});
console.log('Authorize this app by visiting this url:', authUrl);
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
rl.question('Enter the code from that page here: ', (code) => {
  rl.close();
  oAuth2Client.getToken(code, (err, token) => {
    if (err) return console.error('Error retrieving access token', err);
    oAuth2Client.setCredentials(token);
    // Store the token to disk for later program executions
    fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
      if (err) return console.error(err);
      console.log('Token stored to', TOKEN_PATH);
    });
    callback(oAuth2Client);
  });
});
  }

function listFiles(auth) {
const drive = google.drive({version: 'v3', auth});
drive.files.list({
  pageSize: 10,
  fields: 'nextPageToken, files(id, name)',
}, (err, res) => {
  if (err) return console.log('The API returned an error: ' + err);
  const files = res.data.files;
  if (files.length) {
    console.log('Files:');
    files.map((file) => {
       console.log(`${file.name} (${file.id})`);
    });
  } else {
    console.log('No files found.');
  }
  console.log(files)
});
 }

【问题讨论】:

  • 如果您知道文件夹的id,则可以列出在q parameter 中指定的文件'id' in parents,以仅列出文件夹中的文件。
  • @ziganotschka 非常感谢您的回复,是的,我肯定会这样做,如果您能告诉我如何更改访问类型,这对我真的很有帮助吗?

标签: node.js api google-drive-api


【解决方案1】:

要更改某个文件/文件夹的访问类型,您必须考虑几个因素。 Share files, folders and drives 说明了所有可以更改的详细信息和参数。以编程方式进行。请按照以下步骤操作:

1) 列出文件:

使用q 参数列出您要更改的特定文件夹中的所有文件,不幸的是,google-api-nodejs-client 存在一个错误,其中q 参数不会返回文件。该错误报告为here,因此您可以发表评论或竖起大拇指,让 Google 知道您也有这个问题。作为一种解决方法,我建议您使用 axios。

const queryFoldersWithAxios = async () => {
  const params = {
    q: "'<YOUR_FOLDER_ID>' in parents",
    fields: "files(name,id)"
  };
  const headers = {
    "Authorization": "Bearer <YOUR_ACCESS_TOKEN>", 
    "Content-Type": "application/json"
  }
  return await axios.get("https://www.googleapis.com/drive/v3/files", {params, headers})
}

2) 创建权限

您只需传递文件 id 即可创建新权限。

const createPermissions = async (drive, fileId) => {
  // Return the Promise result after completing its task
  return new Promise((resolve, reject) => {
    const body = {
      "role": "reader",
      "type": "anyone"
    };
    return drive.permissions.create({ 
      fileId,
      resource: body 
    },(err, results) => err ? reject(err) : resolve(results));
  });
}

3) 列出文件权限

您可以通过列出文件的权限来验证文件中的所有权限,甚至可以获取权限的 ID。

const listFilePermissions = async (drive, fileId) => {
  // Return the Promise result after completing its task
  return new Promise((resolve, reject) => {
    return drive.permissions.list({ fileId }, {
      "fields": 'permissions'
    },(err, results) => err ? reject(err) : resolve(results))
  });
}

通知

以第二步为例说明您可以做什么,请阅读Share files, folders and drives 了解您可以做什么的所有可能组合。此外,您还可以使用 Try this API 来测试权限,然后在代码中实现它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多