0

0

通过Python API实现Google Drive文件夹的组织级共享

心靈之曲

心靈之曲

发布时间:2025-12-03 14:03:26

|

976人浏览过

|

来源于php中文网

原创

通过Python API实现Google Drive文件夹的组织级共享

本教程详细介绍了如何使用google drive v3 python api,以编程方式为整个组织(域)共享google drive文件夹。核心方法是将文件夹创建与权限设置解耦,通过`files().create`创建文件夹后,再利用`permissions().create`方法配置域级访问权限,确保组织内所有成员能够根据指定角色访问新建的共享文件夹。

引言

在企业环境中,经常需要将Google Drive中的特定文件夹共享给整个组织内的所有成员,而非仅仅是特定用户。虽然Google Drive界面提供了“通用访问”选项,但在使用Google Drive v3 Python API进行编程时,直接在文件夹创建时设置域级共享权限往往不生效。本文将详细阐述如何通过正确的API调用流程,实现Google Drive文件夹的组织级(域)共享。

核心概念:创建与授权分离

问题的关键在于,Google Drive API的设计将文件或文件夹的创建与权限设置视为两个独立的操作。files().create方法主要负责创建资源本身,而域级共享等复杂的权限管理则需要通过permissions().create方法来完成。

步骤一:创建Google Drive文件夹

首先,我们需要使用files().create方法来创建一个新的Google Drive文件夹。在这个阶段,我们主要关注文件夹的名称、MIME类型以及是否支持共享云端硬盘(Shared Drives)。

from apiclient import discovery
import httplib2 # 确保已安装 httplib2 库

# 假设 get_google_drive_credentials() 函数已正确实现,
# 用于获取并授权Google Drive API的凭据。
# 例如:
# from google.oauth2.credentials import Credentials
# from google_auth_oauthlib.flow import InstalledAppFlow
# from google.auth.transport.requests import Request
# import os
# import pickle
#
# SCOPES = ['https://www.googleapis.com/auth/drive']
#
# def get_google_drive_credentials():
#     creds = None
#     if os.path.exists('token.pickle'):
#         with open('token.pickle', 'rb') as token:
#             creds = pickle.load(token)
#     if not creds or not creds.valid:
#         if creds and creds.expired and creds.refresh_token:
#             creds.refresh(Request())
#         else:
#             flow = InstalledAppFlow.from_client_secrets_file(
#                 'credentials.json', SCOPES)
#             creds = flow.run_local_server(port=0)
#         with open('token.pickle', 'wb') as token:
#             pickle.dump(creds, token)
#     return creds

credentials = get_google_drive_credentials()
http = credentials.authorize(httplib2.Http())
drive_service = discovery.build('drive', 'v3', http=http)

# 定义文件夹体
folder_body = {
    'name': '我的组织共享文件夹',  # 文件夹名称
    'mimeType': "application/vnd.google-apps.folder", # 指定MIME类型为文件夹
}

# 创建文件夹,并指定支持共享云端硬盘
new_folder = drive_service.files().create(body=folder_body, supportsAllDrives=True).execute()
print(f"文件夹 '{new_folder['name']}' 创建成功,ID: {new_folder['id']}")

在上述代码中:

立即学习Python免费学习笔记(深入)”;

  • name: 指定了新建文件夹的名称。
  • mimeType: 必须设置为"application/vnd.google-apps.folder"以创建文件夹。
  • supportsAllDrives=True: 如果你希望在共享云端硬盘中创建或管理文件夹,此参数是必需的。

步骤二:设置域级共享权限

文件夹创建成功后,我们需要获取其ID,并使用permissions().create方法为该文件夹添加域级访问权限。

Otter.ai
Otter.ai

一个自动的会议记录和笔记工具,会议内容生成和实时转录

下载
# new_folder 变量来自上一步骤的执行结果

# 定义权限体
permission_body = {
    "role": "writer",  # 授予的权限角色,例如 "reader", "writer", "commenter"
    "type": "domain",  # 权限类型,指定为 "domain" 表示整个域
    "allowFileDiscovery": True, # 允许域内用户通过搜索发现此文件/文件夹
    "domain": "your-domain.com" # 替换为你的实际Google Workspace域名,例如 "example.com"
}

# 为新建文件夹创建权限
# fileId 参数指向要设置权限的文件夹ID
# supportsAllDrives=True 同样适用于权限设置,如果文件夹在共享云端硬盘中
res = drive_service.permissions().create(
    body=permission_body,
    fileId=new_folder["id"],
    supportsAllDrives=True,
    fields='*' # 请求返回所有字段以便查看结果
).execute()

print("域级权限设置结果:")
print(res)

在上述代码中:

立即学习Python免费学习笔记(深入)”;

  • role: 定义了组织成员的访问级别。常见角色包括:
    • reader: 仅查看。
    • writer: 查看、编辑、评论、添加和移除文件。
    • commenter: 仅评论。
  • type: 设置为"domain"是实现组织级共享的关键。
  • allowFileDiscovery: 如果设置为True,域内用户可以通过搜索找到此文件夹。
  • domain: 这是最重要的部分,必须替换为你的Google Workspace的实际域名。 例如,如果你的公司邮箱是user@example.com,那么域名就是example.com。

完整示例代码

将上述两个步骤整合,形成一个完整的Python脚本:

from apiclient import discovery
import httplib2
import os
import pickle
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# Google Drive API 授权范围
SCOPES = ['https://www.googleapis.com/auth/drive']

def get_google_drive_credentials():
    """
    获取并授权Google Drive API的凭据。
    此函数会尝试从 'token.pickle' 加载凭据,如果不存在或过期,
    则会通过 'credentials.json' 文件进行授权流程,并保存凭据。
    """
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    return creds

def create_and_share_folder_with_domain(folder_name, domain_name, role="writer"):
    """
    创建一个Google Drive文件夹并将其共享给整个域。

    Args:
        folder_name (str): 要创建的文件夹的名称。
        domain_name (str): 你的Google Workspace域名(例如 'example.com')。
        role (str): 授予域的权限角色(例如 'reader', 'writer')。
    """
    credentials = get_google_drive_credentials()
    http = credentials.authorize(httplib2.Http())
    drive_service = discovery.build('drive', 'v3', http=http)

    # 1. 创建文件夹
    folder_body = {
        'name': folder_name,
        'mimeType': "application/vnd.google-apps.folder",
    }
    try:
        new_folder = drive_service.files().create(body=folder_body, supportsAllDrives=True).execute()
        print(f"文件夹 '{new_folder['name']}' (ID: {new_folder['id']}) 创建成功。")
    except Exception as e:
        print(f"创建文件夹失败: {e}")
        return

    # 2. 创建域级权限
    permission_body = {
        "role": role,
        "type": "domain",
        "allowFileDiscovery": True,
        "domain": domain_name
    }
    try:
        res = drive_service.permissions().create(
            body=permission_body,
            fileId=new_folder["id"],
            supportsAllDrives=True,
            fields='*'
        ).execute()
        print(f"成功为域 '{domain_name}' 设置 '{role}' 权限。")
        print("权限设置详情:", res)
    except Exception as e:
        print(f"设置域级权限失败: {e}")

if __name__ == '__main__':
    # 请替换为你的实际文件夹名称和域名
    my_folder_name = "我的团队共享资料"
    my_domain = "your-domain.com" # !!! 替换为你的真实域名 !!!

    create_and_share_folder_with_domain(my_folder_name, my_domain, role="writer")

运行前准备:

  1. 启用Google Drive API: 访问Google Cloud Console,创建一个项目,启用Google Drive API。
  2. 创建OAuth 2.0客户端ID凭据: 在Google Cloud Console中创建OAuth 2.0客户端ID(桌面应用类型),下载credentials.json文件并将其放置在脚本同一目录下。
  3. 安装必要的库: pip install google-api-python-client google-auth-oauthlib google-auth-httplib2

注意事项

  • 权限要求: 执行此脚本的Google账号必须拥有在Google Drive中创建文件夹和管理权限的权限。对于域级共享,该账号通常需要是Google Workspace管理员或具有相应权限的用户。
  • Google Workspace域: type: "domain"权限仅适用于Google Workspace(原G Suite)环境下的域。
  • supportsAllDrives: 如果你的组织使用共享云端硬盘(Shared Drives),并且你希望在其中创建或管理文件夹,务必在files().create和permissions().create方法中都设置supportsAllDrives=True。
  • 错误处理: 在实际生产代码中,应添加更健壮的错误处理机制,例如捕获API调用可能抛出的异常。

总结

通过将Google Drive文件夹的创建与权限设置解耦,我们可以有效地利用Google Drive v3 Python API实现复杂的共享策略。核心在于先通过files().create创建文件夹,然后利用其返回的ID,通过permissions().create方法并指定type: "domain"和正确的domain参数来赋予整个组织访问权限。这种两步走的策略确保了灵活性和精确的权限控制。

参考资料

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

373

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

437

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

803

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

371

2025.07.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号