如何通过Service Account与API访问共享Google Drive文件夹
使用Google服务账号无登录访问Drive公开文件夹图片
核心逻辑
服务账号是Google专为服务器端无交互场景设计的授权方式,能彻底避开OAuth登录弹窗,关键要做好服务账号权限配置和代码授权逻辑替换。
第一步:服务账号配置(必做)
- 登录Google Cloud控制台,创建服务账号并下载对应的
credentials.json密钥文件 - 将目标公开Drive文件夹的查看权限授予服务账号的邮箱(格式为
xxx@xxx.iam.gserviceaccount.com,在服务账号详情页可找到)——哪怕文件夹是公开状态,这一步也不能省,否则服务账号无法通过API读取内容
第二步:代码修改(替换原有OAuth登录逻辑)
假设你原有代码采用OAuth桌面授权流,现在替换为服务账号授权逻辑:
依赖安装(未安装则执行)
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
核心代码替换
删除原有弹出登录窗口的OAuth代码,改用以下服务账号授权逻辑:
from google.oauth2 import service_account from googleapiclient.discovery import build # 替换为你的服务账号密钥文件路径 SERVICE_ACCOUNT_FILE = 'credentials.json' # 仅需只读权限,范围不要随意扩大 SCOPES = ['https://www.googleapis.com/auth/drive.readonly'] # 构建服务账号凭证 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) # 初始化Drive API服务 drive_service = build('drive', 'v3', credentials=credentials) # 获取指定文件夹下所有图片 def fetch_folder_images(folder_id): # 筛选条件:属于目标文件夹、MIME类型为图片 query = f"'{folder_id}' in parents and mimeType contains 'image/'" results = drive_service.files().list( q=query, fields="files(id, name, webContentLink)" ).execute() return results.get('files', []) # 调用示例:替换为你的公开文件夹ID target_folder_id = 'your_public_folder_id' images = fetch_folder_images(target_folder_id) for img in images: print(f"图片名称: {img['name']}, 直接下载链接: {img['webContentLink']}")
关键注意事项
- 服务账号必须被添加为文件夹查看者:即使文件夹是公开的,服务账号作为独立身份,仍需被明确授予权限才能通过API访问
- 权限范围仅用
drive.readonly即可:避免使用更高权限范围,减少权限风险 - 关于文档中"Authorization optional":这指的是匿名访问公开文件,但匿名访问有请求频次限制,且无法稳定批量读取,服务账号是更可靠的无登录解决方案
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

