You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需OAuth2,仅用API密钥能否向公开Google文件夹/表格写入数据?

关于Google Drive API用API密钥写入公开资源的问题

很遗憾,仅靠API密钥是没法向公开的Google Drive文件夹/表格写入数据的。

为什么API密钥不行?

API密钥的核心作用只是用来标识你的应用身份,它的权限非常有限:只能对设置为公开可读的资源进行只读访问,完全没有写入、修改的权限。这是Google API的安全设计——要是随便一个API密钥就能改数据,那公开资源的安全根本没法保证。

符合你需求的替代方案:服务账号

你们想要「无需用户授权、不用共享令牌就能分发应用」的需求,其实可以用服务账号来实现。服务账号是Google专为无人值守/服务器端应用设计的身份,它不需要用户手动点授权,只要把目标公开文件夹(或表格)共享给服务账号的邮箱就行。

具体实现步骤(Python)

  1. 准备服务账号密钥:
    去Google Cloud控制台创建一个服务账号,下载对应的JSON密钥文件(这个文件要妥善保管,别泄露)。

  2. 安装依赖包:

    pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
    
  3. 替换原有OAuth代码为服务账号代码:
    下面是两个常见场景的示例:

    场景1:向公开Drive文件夹上传文件

    from google.oauth2 import service_account
    from googleapiclient.discovery import build
    from googleapiclient.http import MediaFileUpload
    
    # 配置参数
    SCOPES = ['https://www.googleapis.com/auth/drive.file']
    SERVICE_ACCOUNT_KEY_PATH = '你的服务账号密钥文件路径.json'
    TARGET_FOLDER_ID = '你的公开文件夹ID'
    
    # 加载服务账号凭证
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_KEY_PATH, scopes=SCOPES
    )
    
    # 构建Drive服务
    drive_service = build('drive', 'v3', credentials=credentials)
    
    # 上传文件
    file_metadata = {
        'name': '要上传的文件名.txt',
        'parents': [TARGET_FOLDER_ID]
    }
    media = MediaFileUpload('本地文件路径.txt', mimetype='text/plain')
    uploaded_file = drive_service.files().create(
        body=file_metadata, media_body=media, fields='id'
    ).execute()
    
    print(f"文件上传成功,ID: {uploaded_file['id']}")
    

    场景2:向公开Google Sheets写入数据

    from google.oauth2 import service_account
    from googleapiclient.discovery import build
    
    # 配置参数
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
    SERVICE_ACCOUNT_KEY_PATH = '你的服务账号密钥文件路径.json'
    SPREADSHEET_ID = '你的公开表格ID'
    WRITE_RANGE = 'Sheet1!A1:B2'  # 要写入的单元格范围
    
    # 加载服务账号凭证
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_KEY_PATH, scopes=SCOPES
    )
    
    # 构建Sheets服务
    sheets_service = build('sheets', 'v4', credentials=credentials)
    
    # 准备要写入的数据
    values = [
        ['第一行第一列', '第一行第二列'],
        ['第二行第一列', '第二行第二列']
    ]
    body = {'values': values}
    
    # 执行写入
    result = sheets_service.spreadsheets().values().update(
        spreadsheetId=SPREADSHEET_ID,
        range=WRITE_RANGE,
        valueInputOption='RAW',
        body=body
    ).execute()
    
    print(f"成功更新 {result['updatedCells']} 个单元格")
    
  4. 共享资源给服务账号:
    打开你的公开文件夹/表格,点击「共享」,输入服务账号JSON文件里的client_email字段值,给它编辑者权限,保存即可。

最后再强调一下

API密钥真的只能做只读操作,别再尝试用它写数据了。服务账号才是完全符合你需求的方案——不用用户授权,只要做好资源共享,部署应用时带上密钥文件就能正常工作。

内容的提问来源于stack exchange,提问作者steffres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:19:33