检索 Google 用户照片

Posted

技术标签:

【中文标题】检索 Google 用户照片【英文标题】:Retrieving Google User Photo 【发布时间】:2014-10-17 12:09:30 【问题描述】:

我能够从 google admin SDK 的 user.list api 中检索 thumbnailPhotoUrl。但是,每当我尝试渲染图像时,Google 都会重定向到静态剪影图像。通过 API 检索到的 URL 如下所示

https://plus.google.com/_/focus/photos/private/AIbEiAIA.... 

如前所述,这最终会被重定向到:

https://ssl.gstatic.com/s2/profiles/images/silhouette200.png

但是,通过一些逆向工程,我可以通过将 /u/1/ 添加到 URL 路径的开头来查看照片,如下所示:

https://plus.google.com/u/1/_/focus/photos/private/AIbEiAIA...

根据我的研究,/u/1 与多个谷歌帐户有关,所以恐怕我无法依赖这种方法。谁能帮我理解这里发生了什么?

【问题讨论】:

【参考方案1】:

这是我的 10 美分...

最近我一直致力于为 Angular 构建 G Suite 用户选择器,但遇到了同样的问题。尽管如此,我一直在测试和研究,在我的一项测试中,我决定使用非管理员用户调用目录 api users list endpoint。 (头爆炸?)令我惊讶的是,谷歌允许这种类型的请求,虽然它提供非超级管理员数据但足以为用户获取私人缩略图 url。起初我认为这是一种无意的行为,如果你愿意的话,是某种错误。那是我遇到this documentation的时候。

虽然用户帐户只能由管理员修改,但域中的任何用户都可以读取用户配置文件。非管理员用户可以使用 viewType 参数等于 domain_public 发出 users.get 或 users.list 请求以检索用户的公共配置文件。范围 https://www.googleapis.com/auth/admin.directory.user.readonly 非常适合此用例。

所以这是一种预期的行为。那是它击中我的时候。检索用户数据时生成的私有 url 仅供请求用户使用。如果您将 url 提供给其他用户,它将重定向到匿名剪影。

由此我可以得出结论,如果我需要检索用户列表并需要能够查看他们的照片,我需要使用需要查看相应数据的用户的凭据调用目录 api 端点.这符合我正在构建的 G Suite 用户选择器小部件的目的。

【讨论】:

只是有同样的问题,有趣的解决方案,但似乎要求非管理员用户拥有 admin.directory 读取范围,否则请求为 403。 @DavidThomas 确实,但您应该授予只读范围以确保其安全。 是的,我为示例用户授予了该范围,但仍然无法请求照片,只能获得私人照片 URL。我最终使用其他用户照片 api 来获取所需的数据 developers.google.com/admin-sdk/directory/v1/reference/users/…【参考方案2】:

根据我自己的经验,我发现如果 thumbnailPhotoUrl 在 URL 上是私有的,那么照片不是公开的,即在域外无法查看,也可能是用户没有激活了他们的 Google+ 个人资料,我相信无论如何都会公开他们的照片。

如果 URL 上有私有路径,最好避免使用 thumbnailPhotoUrl。我认为使用Users.Photo API 将照片检索为 Web 安全的 base64 数据然后将其编码为内联 base64 CSS 图像更可靠。

这是我常用的sn-p代码:

    import com.google.common.io.BaseEncoding;
    import com.google.api.services.admin.directory.model.User;
    import com.google.api.services.admin.directory.model.UserPhoto;

public class PhotoUtils 

    public void loadPhoto() 
            // if the user have not signed up for Google+ yet then their thumbnail is private
            String thumbnailUrl = user.getThumbnailPhotoUrl();
            String photoData = "";
            if((thumbnailUrl != null) && (thumbnailUrl.indexOf("private") > -1)) 

                    UserPhoto photo = getUserPhoto(user.getId());
                    if(photo != null) 
                        photoData = getBase64CssImage(photo.getPhotoData(), photo.getMimeType());
                    
            

    

        public static String getBase64CssImage(String urlSafeBase64Data, String mimeType) 
            urlSafeBase64Data = new String(BaseEncoding.base64().encode(
                      BaseEncoding.base64Url().decode(urlSafeBase64Data)));
            return "data:" + mimeType + ";base64," + urlSafeBase64Data;
        

         public UserPhoto getUserPhoto(String userId) throws IOException 
            UserPhoto photo = null;
            try 
                photo = this.getClient().users().photos().get(userId).execute();

             catch(GoogleJsonResponseException e) 
                if(e.getMessage().indexOf(NOT_FOUND) == 0) 
                    log.warning("No photo is found for user: " + userId);

                 else 
                    throw e;
                
            
            return photo;
        

【讨论】:

以上是关于检索 Google 用户照片的主要内容,如果未能解决你的问题,请参考以下文章

如何检索 Google-talk 用户的 id

从 Google 照片库加载图像以进行裁剪

通过 API 访问 Google 照片的长期令牌?

检索用户的公开 google/gmail 图片

制作从 google 下载的圆形照片(google places,swift)

如何仅从 Google Photos 应用程序中选择图像? Android 谷歌照片意图