如何通过R编程使用谷歌照片库API

292 阅读1分钟

这篇文章解释了如何通过R编程使用谷歌照片库API。你可以使用这个API来创建新的相册和上传图片到该相册,并与他人分享。你还可以获取你可以访问的相册的信息。 请确保你能访问以下R库。如果你没有访问它们的权限,你可以使用install.packages("packagename") 。一旦安装完毕,你可以通过命令加载库,library(packagename)

  • library(httr)

  • library(jsonlite)

  • library(dplyr)

  • library(glue)

  • library(googleAuthR)

谷歌照片库的API需要以下两个范围的oauth2.0认证

www.googleapis.com/auth/photos…

www.googleapis.com/auth/photos… 要获取oauth2.0令牌,你可以按照googleAuthR R包的文档进行。一旦你完成了认证,你可以使用以下命令获取令牌。


k <- gargle::token_fetch(token = gar_token())
authorization = paste('Bearer ', k$credentials$access_token)

R wrapper for Google Photos API

列出用户可以访问的所有相册

下面的程序返回所有的相册,包括它们的标题和URL,以及相册中的图片数量。它还给出了相册是否可以共享的信息。

getalbum <-
  GET(glue("https://photoslibrary.googleapis.com/v1/albums"),
      add_headers(
        'Authorization' = authorization,
        'Accept'  = 'application/json')) %>% 
  content(., as = "text", encoding = "UTF-8") %>%
  fromJSON(., flatten = TRUE) %>% 
  data.frame()

创建新专辑

在这里,我正在创建一个新的相册,标题为Myblog 。你可以把它改成你想要的任何名字。


Album <- POST("https://photoslibrary.googleapis.com/v1/albums",
              add_headers(
                'Authorization' = authorization,
                'Content-Type'  = 'application/json'),
              body = list("album" = list("title" = "Myblog")),
              encode = "json") %>%
  content(., as = "text", encoding = "UTF-8") %>%
  fromJSON(., flatten = TRUE) %>%
  data.frame()

分享相册

在下面的代码中,你需要在API中提供 albumID https://photoslibrary.googleapis.com/v1/albums/{albumId}:share.我使用的是上一步的 albumID,在这一步中我创建了一个新的相册。


request0 <- POST(glue('https://photoslibrary.googleapis.com/v1/albums/{Album[1,1]}:share'),
                 add_headers(
                   'Authorization' = authorization,
                   'Content-Type'  = 'application/json'),
                 body = list("sharedAlbumOptions" = list(
                   "isCollaborative" = "true",
                   "isCommentable" = "true")),
                 encode = "json")

shareableUrl <-
  content(request0, as = "text", encoding = "UTF-8") %>%
  fromJSON(., flatten = TRUE) %>%
  .[["shareInfo"]] %>%
  .[["shareableUrl"]]

上传图片

上传图片需要两个步骤--首先你需要上传token到谷歌服务器。一旦完成,你就可以继续上传图片了。在这里,我使用存储在我当前工作目录中的图片myimage.png


imageFile <- "myimage.png"
request <- POST("https://photoslibrary.googleapis.com/v1/uploads",
                add_headers(
                  'Authorization' = authorization,
                  'Content-Type'  = 'application/octet-stream',
                  'X-Goog-Upload-File-Name' = imageFile,
                  'X-Goog-Upload-Protocol' = 'raw'),
                body=upload_file(imageFile))

response <- content(request, as = "text", encoding = "UTF-8")

仅仅是前一步并没有上传图片。你还需要上传令牌。请参考下面的程序。


request2 <- POST("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate",
                add_headers(
                  'Authorization' = authorization,
                  'Content-Type'  = 'application/json'),
                body = list(
                  "albumId" = Album[1,1],
                  'newMediaItems' = list(
                    list("description" = "test upload",
                      "simpleMediaItem" = list("uploadToken" = response)
                    )
                  )
                ),
                encode = "json"  
              )

result <- content(request2, as = "text", encoding = "UTF-8") %>% 
    fromJSON(., flatten = TRUE) %>%
    data.frame()

列出一个相册的所有图片

如果你想看到一个相册的每张图片的URL,你可以使用和运行下面的程序。你可以增加pageSize 参数来查看超过25个图像/视频文件。


getmedia <-
  POST(glue("https://photoslibrary.googleapis.com/v1/mediaItems:search"),
    add_headers(
      'Authorization' = authorization,
      'Accept'  = 'application/json'),
    body = list("albumId" = Album[1,1],
                "pageSize" = 25),
    encode = "json"
    ) %>% 
  content(., as = "text", encoding = "UTF-8") %>%
  fromJSON(., flatten = TRUE) %>% 
  data.frame()