【问题标题】:Fetching complete Google Photos album webpage from Apps Script从 Apps 脚本获取完整的 Google 相册网页
【发布时间】:2020-01-10 04:01:03
【问题描述】:

我一直在尝试抓取我在 Google 相册上公开共享的相册:共享相册会提供一个格式为 photos.app.goo.gl/{SOME_ID} 的链接。目标是能够检索单个照片 URL(不会过期的 URL,遵循 lh3.googleusercontent.com 格式,然后可以嵌入到标签内的任何其他网站上)。

我想在 Google Apps 脚本中执行此操作并尝试了以下方法:

var response = UrlFetchApp.fetch("https://photos.app.goo.gl/{SOME_ID}");
Logger.log(response.getContentText());

但是,响应没有显示任何图像,就好像页面需要再加载一些一样,即使我在一张只有 2 张照片的相册上进行测试。如果我手动检查页面,我可以清楚地看到沿 lh3.googleusercontent.com 格式的图像 + 图像链接。我应该对我的获取请求进行哪些更改?

我见过使用 Axios 的其他实现(在 Apps 脚本之外)设法获取我想要的 URL,但还没有找到将 Axios 库导入 Apps 脚本的方法。

【问题讨论】:

  • 对于 Google 延迟加载媒体资源,我绝对不会感到震惊。您将需要使用 API 或其他一些实际呈现网页并等待网络活动解决的解决方案。
  • 哦,我同意你关于延迟加载以及它为什么有意义的问题。我只是不知道如何准确地按照您所说的去做,等待网络活动解决——通过 fetch 或 Axios(如果是 Axios,那么如何将库导入 Apps 脚本)。再次感谢!
  • 你应该链接你见过的其他解决方案。至于告诉 UrlFetch 在页面上“等待”,您不能。至于使用 Apps Script .gs 文件中的其他请求库,您不能。您可以尝试使用客户端 HTML 解决方案,您可以在其中构建自己的应用程序脚本托管网页并在其 JS 中,可以通过<script> 标签使用或引用其他库,但看不到这些其他解决方案我不能说这种方法是否可行。
  • 当然:我看到的两个选项是 (1) medium.com/@ValentinHervieu/… (2) publicalbum.org/blog/embedding-google-photos-albums(参见“创建嵌入代码”)

标签: google-apps-script axios google-photos


【解决方案1】:

答案:

您可以在 Apps 脚本中使用 Google Photos API 来获取共享相册的各个照片 URL。

更多信息:

UrlFetchApp.fetch() 在 Apps 脚本中返回一个 HTTPResponse 对象,其中包含标题、HTML 内容和其他信息(例如 HTTP 响应代码),就像通过浏览器获取和加载页面一样。还有一组 URL Fetch 限制,详见“Google 服务配额”页面,这会导致您在足够大的页面上收到截断的响应。

但是,Photos API 具有专门为您所描述的目的而设计的方法,并且可以从 mediaItems REST 资源中检索此数据。但是请记住,这会返回所有照片,而不是特定相册中的照片;需要从那里进行进一步的处理。

示例代码:

Developers Console 中创建新项目后,您需要从APIs & Services > Library 菜单项启用照片API,然后通过转到脚本UI 并关注Resources > Cloud Platform project 将其链接到您的Apps 脚本项目。在 Developer's Console 中添加刚刚创建的项目的项目号,然后按Set Project

这是一个小代码 sn-p,它将从您的 Google 照片帐户返回照片,并将各个照片的 URL 记录在 Logger 中:

function logPhotoUrls() { 
  var url = 'https://photoslibrary.googleapis.com/v1/mediaItems'; 
  var options = {
    headers: {
      Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
    },
    method: 'get',
    muteHttpExceptions: false
  };
  
  var response = UrlFetchApp.fetch(url, options);
  for (var i = 0; i < 10; i++) {
    Logger.log(JSON.parse(response.getContentText()).mediaItems[i].productUrl);
  }
}

您还需要编辑您的appscript.json,您可以通过关注View &gt; Show manifest file 来查看它以包含以下内容:

{
  "oauthScopes": ["https://www.googleapis.com/auth/photoslibrary.readonly", 
                  "https://www.googleapis.com/auth/script.external_request"]
}

参考资料:

【讨论】:

  • 这太好了,谢谢你,拉法。然而,这确实是我尝试过的第一个解决方案......我不得不放弃它,因为 mediaItems[i].productUrl 不提供图像本身的 URL,而是提供该图像的 Google Photos 容器(照片。 google.com/lr/album/{some_ID}) – 这意味着图像不能嵌入到其他地方。这就是我选择获取尝试的原因,因为 lh3.googleusercontent.com/{some_ID} 会链接到实际的 JPG。你明白我在做什么吗?
  • @seb 使用baseUrl?如果您查看MediaItem 的 API 参考,则表明此 URL 可用于访问实际内容。
  • @tehhowch 谢谢建议,可惜baseUrl会在60分钟后过期,见developers.google.com/photos/library/guides/…
  • @seb 同样,对于 Google 不允许脚本访问可嵌入链接并不感到震惊。如果您想以编程方式嵌入内容,您可能还需要实际托管该内容。
  • 我不反对 :)。但是,我看到其他人设法抓取页面以获取各个 URL。当然,它可能会在未来破裂。但在此过程中,我正在尝试学习如何获取一个从一开始就没有完全加载的页面,并在 Apps 脚本中执行此操作。最终目标只是渲染我自己的照片,这些照片已经存在于 Google 照片中。具有讽刺意味的是,我能够(手动)将它们嵌入到 Google 文档中(通过插入图像选项),然后我将其导出为 HTML 文件(通过 Apps 脚本)——分析该页面清楚地显示了那些静态 lh3.googleusercontent.com 链接。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2019-04-27
相关资源
最近更新 更多