如何使用google-api-python-client通过Python调用Google Photos API
解决Google Photos API Python客户端库使用问题
我完全懂你此刻的困惑——明明按要求装了google-api-python-client,却找不到任何和Photos API直接相关的模块或文件。这其实是因为Google Photos Library API的客户端是通过动态发现机制构建的,而非预生成的独立模块。下面是具体的解决步骤,帮你用官方客户端库而非手动调用REST API:
第一步:补全必要依赖
除了google-api-python-client,你还需要安装认证相关的库(现在Google官方推荐使用google-auth系列套件):
pip install google-api-python-client google-auth google-auth-oauthlib google-auth-httplib2
第二步:构建Photos Library API服务对象
Google Photos Library API不会在安装后直接生成可见的本地模块,而是通过discovery.build()方法动态创建服务实例。这里是完整的实操流程:
1. 完成OAuth2认证配置
首先你需要在Google Cloud Console创建项目、启用Photos Library API,并下载OAuth2凭据文件(通常命名为credentials.json)。然后用以下代码完成认证流程:
from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request import pickle import os.path # 根据你的业务需求调整权限范围,这里以只读权限为例 SCOPES = ['https://www.googleapis.com/auth/photoslibrary.readonly'] 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)
2. 构建服务并调用API接口
通过discovery.build创建服务对象后,你就可以像调用普通Python方法一样调用Photos API的各种接口了:
from googleapiclient.discovery import build # 动态构建Photos Library API服务实例 service = build('photoslibrary', 'v1', credentials=creds) # 示例:调用API列出用户的前10个相册 results = service.albums().list(pageSize=10).execute() albums = results.get('albums', []) if not albums: print('未找到任何相册。') else: print('用户相册列表:') for album in albums: print(f"{album['title']} (ID: {album['id']})")
关键说明
- 为什么看不到Photos相关模块?因为
google-api-python-client采用发现式API设计,像Photos Library这类相对小众的API不会预生成本地模块,而是在运行时通过Google的API发现文档动态构建服务方法。 - 你可以通过
service.__dict__查看所有可用的API方法,也可以对照官方API文档的REST端点,对应转换为服务对象的调用方式(比如REST的GET /v1/albums就对应service.albums().list().execute())。
内容的提问来源于stack exchange,提问作者Ido Ran
相关产品推荐
相关产品推荐

