使用 google 驱动器 API 更新 file/folder 的 "shared" 状态

Update "shared" state of a file/folder with google drive API

我无法解决如何使用 google 驱动器 API.

"shared" 状态更改为 false

这是我的做法:

  1. 我获取所有文件夹和文件 public [this 一个][1] (我使用 q:"'me' in owners and visibility != 'limited'" 过滤器)

  2. 我拿了file/folder个ID放在[这个另一个][2]里面 在响应对象中,我得到了我想更改的这一行:"shared": true

我不知道在哪里可以将其设置为 false,有人知道吗?

祝你有愉快的一天


编辑:我使用 NodeJs(netlify 函数),这是我获取文件和文件夹的代码:

const { google } = require('googleapis')
const CLIENT_ID = process.env.CLIENT_ID
const CLIENT_SECRET = process.env.CLIENT_SECRET
const REDIRECT_URI = 'https://developers.google.com/oauthplayground'

const REFRESH_TOKEN = process.env.REFRESH_TOKEN

exports.handler = async () => {
  const oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)
  oauth2Client.setCredentials({ refresh_token: REFRESH_TOKEN })

  const drive = google.drive({
    version: 'v3',
    auth: oauth2Client,
  })

  try {
    const result = await drive.files.list({
      q:"'me' in owners and visibility != 'limited'"
    })

    return {
      statusCode: 200,
      headers: {
        'Access-Control-Allow-Origin': '*',

      },
      body: JSON.stringify({ ...result, Body: result.toString('utf-8') })
    }
  } catch (e) {
    console.log(e.message)
    return { statusCode: 500, body: e.message }
  }
}

更改可见性(“共享”:true -> “共享”:false), 我尝试了 @Tanaike 的回答:

const fetch = require('node-fetch')

const API_ENDPOINT_A = 'DELETE https://www.googleapis.com/drive/v3/files/'
const API_ENDPOINT_B = '/permissions/anyoneWithLink'

exports.handler = async (event) => {
  try {
    const itemId = '1-7ESYk_zKJ5Sdfg_z-XiuoXxrKKpHwSa' // event.queryStringParameters.itemId
    const response = await fetch(API_ENDPOINT_A + itemId + API_ENDPOINT_B)
    const data = await response.json()
    return {
      statusCode: 200,
      headers: {
        'Access-Control-Allow-Origin': '*'
      },
      body: JSON.stringify({ data })
    }
  } catch (error) {
    console.log(error)
    return {
      statusCode: 500,
      body: JSON.stringify({ error: 'Failed fetching data' })
    }
  }
}

但我不知道如何传递我的私人信息(api 密钥...),我使用 OAuth 2 进行提取,我是否也应该使用它来进行编辑可见性? [1]: https://developers.google.com/drive/api/v2/reference/files/list [2]: https://developers.google.com/drive/api/v2/reference/files/patch

如果我没理解错的话,您看不到可以将文件更改为“共享”的地方:是的。如果是这样,在您从官方文档提供的同一个 link 中,您可以在“请求正文”中找到它。

I fetch all my folders & files witch are public with this one (I use q:"'me' in owners and visibility != 'limited'" filter)开始,当您想将公开共享的权限更改为受限时,您可以使用Drive API实现,如下所示。

要求:

Permissions: delete 已使用。

DELETE https://www.googleapis.com/drive/v3/files/###fileId###/permissions/anyoneWithLink

示例卷曲:

curl --request DELETE \
  -H 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  'https://www.googleapis.com/drive/v3/files/###fileId###/permissions/anyoneWithLink'
  • 如果文件是公开共享的,不与其他特定用户共享,当此请求为运行时,"shared": true更改为"shared": false

注:

  • 如果要取消特定用户的权限,可以按如下方式实现。

    1. 使用权限列表检索权限 ID。

       curl \
         -H 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
         'https://www.googleapis.com/drive/v3/files/###fileId###/permissions'
      
    2. 使用检索到的权限 ID,您可以按如下方式删除权限。

       curl --request DELETE \
         -H 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
         'https://www.googleapis.com/drive/v3/files/###fileId###/permissions/###permissionId###'
      

参考文献:

已添加:

根据您的以下回复,

I actualy use nodejs for drive API, I tried the http solution, but idk how can i pass my clientId and secretId (error 500), You can find my code on my question, i edited it

当你想实现对Node.js的googleapis删除权限时,可以使用如下脚本。在这种情况下,请包括 https://www.googleapis.com/auth/drive.

的范围

示例脚本:

const fileId = "###"; // Please set your file ID.

const drive = google.drive({ version: "v3", auth }); // Please use your client here.
drive.permissions.delete(
  {
    fileId: fileId,
    permissionId: "anyoneWithLink",
  },
  (err, res) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log(res.data); // In this case, no values are returned.
  }
);
  • 在此示例脚本中,删除了公开共享文件的权限。

我使用以下代码得到了它:

const result = await drive.permissions.delete({
      fileId:"YOUR FILE ID",
      permissionId:"anyoneWithLink"
    })

这是完整的更新代码:

const { google } = require('googleapis')
const CLIENT_ID = process.env.CLIENT_ID
const CLIENT_SECRET = process.env.CLIENT_SECRET
const REDIRECT_URI = 'https://developers.google.com/oauthplayground'

const REFRESH_TOKEN = process.env.REFRESH_TOKEN

exports.handler = async () => {
  const oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)
  oauth2Client.setCredentials({ refresh_token: REFRESH_TOKEN })

  const drive = google.drive({
    version: 'v3',
    auth: oauth2Client,
  })

  try {
    const result = await drive.permissions.delete({
      fileId:"YOUR FILE ID",
      permissionId:"anyoneWithLink"
    })

    return {
      statusCode: 200,
      headers: {
        'Access-Control-Allow-Origin': '*',

      },
      body: JSON.stringify({ ...result, Body: result.toString('utf-8') })
    }
  } catch (e) {
    console.log(e.message)
    return { statusCode: 500, body: e.message }
  }
}