Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 从应用程序脚本获取完整的Google照片相册网页_Google Apps Script_Axios_Google Photos - Fatal编程技术网

Google apps script 从应用程序脚本获取完整的Google照片相册网页

Google apps script 从应用程序脚本获取完整的Google照片相册网页,google-apps-script,axios,google-photos,Google Apps Script,Axios,Google Photos,我一直在尝试从谷歌照片上抓取一本公开共享的相册:共享相册提供了一个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.

我一直在尝试从谷歌照片上抓取一本公开共享的相册:共享相册提供了一个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());
然而,响应并没有显示任何图像,似乎页面需要加载更多的图像,尽管我正在一个只有两张照片的相册上测试这一点。如果我手动查看页面,我可以清楚地看到lh3.googleusercontent.com格式的图像+图像链接。我应该如何更改取回请求

我见过其他使用Axios的实现(在应用程序脚本之外),它们成功地获得了我想要的URL,但还没有找到将Axios库导入应用程序脚本的方法。有什么想法吗

谢谢大家!

答复: 您可以在应用程序脚本中使用Google Photos API来获取共享相册的各个照片URL

更多信息:
UrlFetchApp.fetch()
在应用程序脚本中返回一个
HTTPResponse
对象,该对象包含标题、HTML内容和其他信息,如HTTP响应代码,就像是通过浏览器获取和加载页面一样。还有一组URL获取限制,详见“谷歌服务配额”页面,这会导致对足够大的页面的响应被截断

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

示例代码: 在中创建新项目后,您需要从
API&Services>Library
菜单项启用Photos API,然后通过转到脚本UI并遵循
Resources>Cloud Platform project
将其链接到您的应用程序脚本项目。添加刚刚在开发人员控制台中创建的项目的项目编号,然后按
Set project

下面是一个小代码段,它将从您的Google photos帐户返回照片,并将各个照片URL记录在日志记录器中:

函数logPhotoUrls(){
var url='1〕https://photoslibrary.googleapis.com/v1/mediaItems'; 
变量选项={
标题:{
授权:'Bearer'+ScriptApp.getOAuthToken()
},
方法:“get”,
muteHttpExceptions:false
};
var response=UrlFetchApp.fetch(url,选项);
对于(变量i=0;i<10;i++){
Logger.log(JSON.parse(response.getContentText()).mediaItems[i].productUrl);
}
}
您还需要编辑您的
appscript.json
,您可以通过以下
View>Show manifest file
查看该文件,以包括以下内容:

var response = UrlFetchApp.fetch("https://photos.app.goo.gl/{SOME_ID}");
Logger.log(response.getContentText());
{
“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分钟后过期,请再次参阅@seb,谷歌不允许对可嵌入链接进行脚本访问,这并不令人震惊。如果您想以编程方式嵌入内容,您可能还需要实际承载该内容。我不反对:)。然而,我也看到过其他人试图通过刮取页面来获取单独的URL。就算将来它可能会破裂。但在此过程中,我试图学习如何获取一个不完全从get go加载的页面,并在Apps脚本中执行此操作。最终的目标只是呈现我自己的照片,这些照片已经存在于谷歌照片中。具有讽刺意味的是,我能够(手动)将它们嵌入谷歌文档(通过插入图像选项),然后将其导出为HTML文件(通过应用程序脚本)——分析该页面可以清楚地显示那些静态lh3.googleusercontent.com链接。谷歌懒散加载媒体资源绝对不会让我感到震惊。您需要使用API或其他解决方案来实际呈现网页,并等待网络活动解决。哦,关于延迟加载以及为什么它有意义,我同意您的看法。我只是不知道如何准确地执行你所说的,等待网络活动解决——要么通过fetch,要么通过Axios(如果是Axios,那么如何将库导入Apps脚本)。再次感谢!您应该将您看到的其他解决方案链接起来。只要告诉UrlFetch在页面上“等待”,您就不能这样做。就使用来自Apps Script.gs文件的其他请求库而言,您不能。您可以尝试使用客户端HTML解决方案,在该解决方案中,您可以构建自己的应用程序脚本托管网页,并在其JS中,通过
标记使用或引用其他库,但在没有看到这些其他解决方案的情况下,我无法确定该方法是否可行。当然,我看到的两个选项是(1)(2)(请参阅“创建嵌入代码”)