检索Google用户照片

时间:2014-08-23 23:40:34

标签: google-admin-sdk

我可以从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与多个谷歌帐户有关,所以我担心我无法依赖这种方法。谁能帮助我了解这里发生了什么?

2 个答案:

答案 0 :(得分:2)

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

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

这是我经常使用的代码段:

    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;
        }
}

答案 1 :(得分:0)

这是我的10美分...

最近,我一直在为Angular构建G Suite用户选择器,但遇到了同样的问题。尽管如此,我仍在进行测试和研究,在其中一项测试中,我决定使用NON-ADMIN用户来调用目录api users list endpoint。 (爆炸的头)令我惊讶的是,尽管Google提供了非超级管理员数据,但足以为用户提供私有缩略图网址,因此Google允许这种类型的请求。起初,我认为这是一种意想不到的行为,如果您愿意的话,会出现某种错误。那是我遇到this documentation的时候。

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

所以这是预期的行为。那是它打到我的时候。检索用户数据时生成的专用URL仅应由发出请求的用户使用。如果将URL提供给其他用户,它将重定向到匿名剪影。

由此我可以得出结论,如果我需要检索用户列表并需要查看其照片的能力,则需要使用需要查看各自数据的用户凭据来调用目录api端点。 。这通过我正在构建的G Suite用户选择器小部件达到了我的目的。