使用 google-api-python-client 通过 Python 访问 Google Photo API

2024-03-20

根据Google API 客户端库 https://developers.google.com/api-client-library/python/apis/photoslibrary/v1页面可以使用 python 客户端库访问 Google Photos API,但在安装后使用pip install -t lib/ google-api-python-client我没有看到任何与照片 API 相关的内容。

如何使用 Google 构建的客户端库而不是手动调用 REST API?


谢谢Ido Ran https://github.com/ido-ran/google-photos-api-python-quickstart/blob/master/quickstart.py's and brillb https://stackoverflow.com/a/54000367/8641798的例子,我终于也解决了我的问题。上面给出的一些文档链接不再有效。尝试增强上面的示例,我找到了该页面Google 照片 API https://developers.google.com/photos/library/reference/rest/v1/mediaItems最有用。它不仅记录了 API,还允许您以交互方式测试您的请求 - 如果没有这种测试功能,我可能永远无法让它工作。输入请求后,您可以看到 cURL、HTTP 或 JAVASCRIPT 中的编码示例 - 但没有 Python 的编码示例。

除了制作我的专辑列表之外,我还对

  • 每个专辑的链接,
  • 图像列表(在相册中或不在相册中),
  • 链接到我的每个媒体项目以及查找它们的 URL

为了获得专辑的链接,您可以简单地通过检索来扩展上面的示例item['productUrl']。然而,很多时候该 URL 在 Firefox、IE 或 Edge 中不起作用(非常简单地显示专辑后出现 404 错误),但在 Chrome 和 Opera 中却起作用(谁知道为什么)。

专辑封面照片的 URL 似乎更可靠:item['coverPhotoMediaItemId']您可以在下面找到专辑的链接Info.

而不是使用albums方法,您还可以访问sharedAlbums(并指定results.get('sharedAlbums', [])。我希望能够得到shareableUrl,但从未找到过ShareInfo资源作为结果的一部分。

对于图像列表,您可以选择两种方法:mediaItems.list and mediaItems.search。我不认为前者有用,因为它返回一长串all您的图像,而搜索允许按日期限制结果,但照片是拍摄的(未上传!)。还有一个get and batchGet,我从未尝试过,因为您需要知道 Google 照片赋予图像的项目 ID。

每种方法都有一个限制(pageSize) 以获得要返回的最大条目数。如果超过这个数量,它还会发送一个pageToken,您可以用来请求下一部分。

我最终想出了这个例子:

from os.path import join, dirname
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
SCOPES = 'https://www.googleapis.com/auth/photoslibrary.readonly'

store = file.Storage(join(dirname(__file__), 'token-for-google.json'))
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets(join(dirname(__file__), 'client_id.json', SCOPES))
    creds = tools.run_flow(flow, store)
google_photos = build('photoslibrary', 'v1', http=creds.authorize(Http()))

day, month, year = ('0', '6', '2019')  # Day or month may be 0 => full month resp. year
date_filter = [{"day": day, "month": month, "year": year}]  # No leading zeroes for day an month!
nextpagetoken = 'Dummy'
while nextpagetoken != '':
    nextpagetoken = '' if nextpagetoken == 'Dummy' else nextpagetoken
    results = google_photos.mediaItems().search(
            body={"filters":  {"dateFilter": {"dates": [{"day": day, "month": month, "year": year}]}},
                  "pageSize": 10, "pageToken": nextpagetoken}).execute()
    # The default number of media items to return at a time is 25. The maximum pageSize is 100.
    items = results.get('mediaItems', [])
    nextpagetoken = results.get('nextPageToken', '')
    for item in items:
            print(f"{item['filename']} {item['mimeType']} '{item.get('description', '- -')}'"
                      f" {item['mediaMetadata']['creationTime']}\nURL: {item['productUrl']}")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 google-api-python-client 通过 Python 访问 Google Photo API 的相关文章

随机推荐

  • 使用XPATH,如何选择包含特定字符串的任何节点

    假设我有一个如下所示的 XML 文件
  • 如果其他参数为 null,SQL 正确的连接方式

    我有这段代码及其临时表 因此您可以运行它 create table student id int identity 1 1 firstname varchar 50 lastname varchar 50 create table quiz
  • 根据判别器的子集获取判别联合的子集

    打字稿问题 给定一个受歧视的联合类型 interface A discriminator A data string interface B discriminator B data string interface C discrimin
  • 在 R 中使用 download.file 下载时跳过错误文件

    我有大量 pdf 文件的链接 我想在 for 循环中使用 download file 下载这些文件 我的解决方案工作正常 但在遇到错误时停止 许多文件不起作用 我想在 download file 函数中添加一个功能 告诉 R 在下载产生错误
  • 如何强制 Rails ActiveRecord 提交事务刷新

    是否可以强制 ActiveRecord 推送 刷新事务 或只是保存 创建 我有一个时钟工作人员 它在后台为多个任务工作人员创建任务 问题是 时钟工作人员有时会在时钟工作人员信息完全刷新到数据库之前创建一个任务并将其推送给任务工作人员 这会导
  • Linux 中上下文切换需要多长时间?

    我很好奇在 Linux 中更改上下文需要多少个周期 我专门使用 E5405 Xeon x64 但我也很想看看它与其他平台的比较 有一个名为 LMBench 的免费应用程序 由 Larry McVoy 和朋友编写 它提供了一系列操作系统和硬件
  • 初始化词汇表外 (OOV) 标记

    我正在为 NLP 任务构建 TensorFlow 模型 并且使用预训练的 Glove 300d 词向量 嵌入数据集 显然 有些标记无法解析为嵌入 因为它们没有包含在词向量嵌入模型的训练数据集中 例如罕见的名字 我可以用 0 向量替换这些标记
  • 无法验证 的证书,因为它不包含任何 IP SAN

    我正在开发一个 GitLab CI 管道 它将部署我的 docker 堆栈 我正在尝试将 DOCKER HOST 设置为tcp DROPLET IP 2377 但我收到一条错误消息 指出我的证书不包含任何 IP SAN 我正在使用 Digi
  • IDEA插件'github copilot'无法登录github

    我的IDEA插件 GitHub 副驾驶 无法登录 GitHub 正在等待 GitHub 身份验证 但 我的VSCode可以成功登录 另请确保您已成功注册并提供付款方式 https github com features copilot ht
  • UNet随机断开

    对于基本的网络场景 两个玩家变换和偶尔的 RPC 我经常遇到 UNet 丢失的情况 连接因超时而断开 连接会在 5 分钟内可靠地断开 大多数情况下会在 30 秒内断开 我在网上看到 UNet 经常这样做 我尝试过增加NetworkDropT
  • Java HashMap 在 for 循环中的“put”方法

    我在使用时遇到问题HashMap在 for 循环中 我做错了什么吗 我需要做出什么改变吗 下面是代码及其输出 Code public static void main String args ArrayList
  • 自动 Cookie 处理 C#/.NET HttpWebRequest+HttpWebResponse

    有没有办法使用 HttpWebRequest HttpWebResponse 对象自动处理 NET 中的 cookie 我最好只在 NET 环境中寻找 LWP UserAgent 及其行为 perl 的等效项 有什么建议或建议吗 我想你正在
  • 不兼容的库版本:XXX需要2.0.0或更高版本,但Runes提供1.0.0版本

    我试图在 iPhone 上运行 iOS 应用程序 项目编译得很好 但是当应用程序启动时 XCode 控制台显示 dyld Library not loaded rpath Runes framework Runes Referenced f
  • 使用 Apache POI 根据 csv 工作表更新 Excel 工作表值

    我对java还是个新手 我在 java 语法方面遇到了一些问题 我的程序应该执行以下过程 1 它以csv文件作为输入 2 它以excel文件作为输入 3 它应该迭代写入日期的两个文件的第一列 4 通过添加 csv 工作表中的信息来更新 ex
  • Firebase 托管 Flask 应用程序

    我正在尝试在黑客马拉松项目上托管一个简单的 Flask 应用程序 但遇到了一个无法识别路线的问题 例如 假设我的烧瓶路线是 app route helloWorld methods POST def index inputted name
  • 有没有办法从 Java 中的文件扩展名生成 Content-Type 标头?

    我有一个 Java 应用程序 有时必须仅从文件名生成 Content Type 标头 有没有办法估计常见扩展的内容类型 例如 pdf 映射到 application pdf 等 Yes URLConnection guessContentT
  • iPhone模拟器突然开始运行很慢

    我已经在 iPhone 模拟器中开发一个应用程序几个星期了 到目前为止它一直运行良好 但突然在加载内容和动画时开始运行非常慢 自从上次成功测试以来 我没有对代码进行任何更改 我尝试重新启动模拟器 多次 并删除应用程序并进行完全干净的重建 但
  • Laravel 4 - 将 OnChange 分配给 Form::select

    有没有办法将 OnChange 事件分配给 Form Select 字段 我现在已经设法解决这个问题 但它非常混乱 我想更改它 以便我所有的 ajax 请求都在一个文件中 还有其他人遇到过这个吗 Thanks 设法修复它 Form sele
  • Android XML 布局文件和命名空间

    Android 布局是在 XML 中定义的 并在根元素中声明此命名空间 xmlns android http schemas android com apk res android 元素示例
  • 使用 google-api-python-client 通过 Python 访问 Google Photo API

    根据Google API 客户端库 https developers google com api client library python apis photoslibrary v1页面可以使用 python 客户端库访问 Google