检索用户的公开 google/gmail 图片
Posted
技术标签:
【中文标题】检索用户的公开 google/gmail 图片【英文标题】:Retrieving a user's public google/gmail picture 【发布时间】:2014-10-25 17:04:10 【问题描述】:我正在使用 gmail-api 编写一个基于电子邮件的应用程序,我需要检索来自谷歌的电子邮件地址的用户公共图像。 我见过其他应用程序这样做,但我似乎无法可靠地获取这些数据。
更多信息:
我正在使用 oauth2 让用户登录 - 我在那里请求任何类型的权限都没有问题。 我尝试使用 google+ api 检索图像 - 但它需要一个用户 ID - 我不知道如何获取电子邮件地址的用户 ID(gmail-api 不提供它,afaik) . 我尝试过使用联系人 API - 但它只提供用户联系人的图像,而电子邮件客户端也可以显示其他用户的图像。谢谢!
编辑:
如果我有其他用户的用户 ID,我知道我可以从 google plus 接收所需的图像。但是,我找不到基于电子邮件地址获取用户 ID 的方法。
【问题讨论】:
请提及您当前使用的编程语言?? 我正在使用 Objective C(但任何语言的答案都可以) @shaish 曾经解决过这个问题吗?我想知道同样的事情。 找到更新的答案***.com/questions/54179248/… 【参考方案1】:很简单
http://picasaweb.google.com/data/entry/api/user/<hereYourUserIdOrYourEmail>?alt=json
只是有点小问题。
您只能获取您的 Google+ 个人资料的图片,而不能直接从您的 gmail 获取。
更新:
此 API 已被弃用,将于 2019 年 1 月被拒绝。尽快迁移到 Google Photos Library API 以避免中断您的应用程序。
更多信息Here
【讨论】:
仅适用于 gmail 帐户,不适用于 Google Apps 帐户 @SebastiánRojas 提供完整的电子邮件地址后,我可以获得 Google Apps 帐户头像 如果用户没有 Google+ 或 Picasa 帐户,这将不起作用。 这太棒了。有人知道这是否/在哪里记录? 如何使用新 API 做到这一点?【参考方案2】:更新:
此 API 已被弃用,将于 2019 年 1 月被拒绝。尽快迁移到 Google Photos Library API 以避免中断您的应用程序。
信息Here
基于@jose920405 的回答,我编写了这个名为Pikmail API 的免费公共API 服务。这里有一些优势。
无需身份验证。 它完全免费且开源。 它是用 Kotlin 编写的。 您无需编写一些包装器来映射响应。这是关于how Pikmail API works internally的博文。
用法:
<img src="https://pikmail.herokuapp.com/eduardo.alejandro.pool.ake@gmail.com?size=50" >
Java 安卓
Picasso.with(context).load("https://pikmail.herokuapp.com/eduardo.alejandro.pool.ake@gmail.com?size=50").into(imageView);
随时与您一起提出拉取请求、打开错误或请求新功能here。
注意:此服务基于名为Pikmail 的独立库,可在您的Java 项目(服务器或android 应用程序)中用作Gradle 依赖项。
【讨论】:
真的很棒,它的工作原理是 osm !但这取决于 picassaweb,它将在 2019 年 1 月轮到。根据文档developers.google.com/picasa-web,那么在那之后 wt 会做吗? @Nikunj Paradva 这是一个很好的问题,可能不会有一个简单的解决方案,所以如果我们找不到解决方法,也许我最终会关闭该项目。跨度> 当您关闭该项目时,请在此处发表评论,这对于使用您的 api 的当前实时用户来说更好, @android developer 可能不会,但我们需要等到 2019 年 1 月才能知道,并检查可能的替代方案。 @epool 我问了一个替代方案,在这里:***.com/q/53714174/878126【参考方案3】:Google+ 是执行此操作的正确方法。这实际上与 Gmail API 无关。您不需要用户的用户 ID,只需要具有适当范围的有效访问令牌。
https://www.googleapis.com/plus/v1/people/me?access_token=YOUR_ACCESS_TOKEN_HERE
除非存在错误/无效令牌/等,否则这将返回一堆关于用户的 JSON 信息。此数据中包含用户个人资料图片的 URI。
编辑:
要根据电子邮件地址获取用户的头像,请先搜索用户
https://www.google.com/m8/feeds/contacts/default/thin?q=EMAIL_ADDRESS_HERE
然后,您可以从返回的 JSON 中检索该用户的正确用户 ID,并使用它来获取个人资料图像。
【讨论】:
这是为了获取当前登录用户的图像 - 没问题。但我需要获取其他用户的图像。 感谢您的编辑。但是,这只是给了我请求用户的联系人提要。那里有一张个人资料图片(不是正确的),但我在任何字段中都找不到 google+ 用户 ID。另外我认为它忽略了 q= 查询,但这可能很容易解决。 'YOUR_ACCESS_TOKEN_HERE
不会过期?【参考方案4】:
如果您使用 OAuth 2.0 API 通过 Google 对您的应用中的用户进行身份验证 - 例如使用护照 -> https://www.npmjs.com/package/passport-google-oauth20
您可以请求“个人资料”范围,它会为您提供从 displayName 到用户个人资料照片“profile.photos[0]”的大量信息
【讨论】:
是否可以在我的用户通过身份验证时向我的联系人请求某人的个人资料?【参考方案5】:几天来我一直在努力解决这个问题,因为所有答案似乎都不再奏效了。对未来的变化起作用并且看起来更健壮的是(它使用 jQuery):
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://apis.google.com/js/api.js"></script>
<script type="text/javascript">
function image_attach(GA)
user=GA.currentUser.get();
url = user.getBasicProfile().getImageUrl();
$('#thumbnail').attr('src', url);
function google_init()
gapi.load('auth2', function()
GA = gapi.auth2.init(
'client_id': 'YOUR_GOOGLE_CLIENT_ID',
'fetch_basic_profile': true,
);
GA.then(function ()
if (GA.isSignedIn.get())
image_attach(GA)
else
GA.signIn().then( function()
image_attach(GA)
)
)
);
</script>
您需要一个 Google OAuth2 客户端 ID - 有关详细信息,请参阅 https://developers.google.com/identity/protocols/OAuth2UserAgent。它似乎不适用于仅使用 API 密钥 - 从我得到的响应中,他们已将未经身份验证的 API 访问配额(即仅使用密钥而不是 ClientID)设置为零。
客户端 ID 可从链接中记录的云控制台获得 - 我认为您需要创建一个项目来创建凭据,但如果您不使用它,他们不会向您收费,所以这不是问题。用户确实需要登录 - 如果不是此代码将登录然后登录。但是如果您仍然没有使用 Google 登录您的页面 - 为什么要他们的缩略图?因为图像 URL 可从基本用户配置文件中获得。 - API 请求似乎不需要任何特定范围,代码中的 API 调用中也没有。
您需要在 Google 控制台中将调用页面的 URL 标识为您的客户端凭据的一部分 - 否则请求将被拒绝。有一个配额 - 我认为是每天 20,000 个 - 免费 API 调用,之后他们将向您收取使用 API 的费用。我能收集到的就这么多。
【讨论】:
更多解释会很酷(使用的 API、TOKENS 或任何需要的东西) 您需要一个 Google OAuth2 客户端 ID - 有关详细信息,请参阅 developers.google.com/identity/protocols/OAuth2WebServer。它似乎不适用于仅使用 API 密钥 - 从我得到的响应中,他们已将未经身份验证的 API 访问配额(即仅使用密钥而不是 ClientID)设置为零。 客户端 ID 可从云控制台获得,如链接中所述 - 我认为您需要创建一个项目来创建凭据,但如果您不使用它,他们不会向您收费,所以没问题。用户确实需要登录 - 如果不是,此代码将登录。但如果您仍然没有为您的页面使用 Google 登录 - 为什么要他们的缩略图?因为图像 URL 可从基本用户配置文件中获得。 - API 请求似乎不需要任何特定范围,代码中的 API 调用中也没有。 您需要在 Google 控制台中将您调用的页面的 URL 标识为您的客户端凭据的一部分 - 否则请求将被拒绝。有一个配额 - 我认为是每天 20,000 个 - 免费 API 调用,之后他们将向您收取使用 API 的费用。我能收集到的就这么多。 抱歉 - JS 版本的链接应该是 developers.google.com/identity/protocols/OAuth2UserAgent :(【参考方案6】:您可以使用谷歌应用配置文件 API
这是访问个人资料图片的示例代码
function getProfilePic(userName)
userName = 'yourusername@myDomain.com';
var scope = 'https://www.google.com/m8/feeds/';
var fetchArgs = googleOAuth_('Profile', scope);
fetchArgs.method = 'GET';
var domain = UserManager.getDomain();
var url = 'https://www.google.com/m8/feeds/photos/profile/'+domain+'/'+userName+'?v=3';
var rawData = UrlFetchApp.fetch(url, fetchArgs).getContentText();
//here you get data into rawData variable
//google oAuth
function googleOAuth_(name,scope)
var oAuthConfig = UrlFetchApp.addOAuthService(name);
oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oAuthConfig.setConsumerKey("anonymous");
oAuthConfig.setConsumerSecret("anonymous");
return oAuthServiceName:name, oAuthUseToken:"always";
您可以获取更多信息here
【讨论】:
如果我理解正确的话,这个 API 用于 google 域,而不是一般的 gmail 用户。此外,它已被弃用.. 并且新的 admin api 看起来也不能解决我的问题。【参考方案7】:回答问题可能为时已晚,但我发现最好的方法是首先使用 http://picasaweb.google.com/data/entry/api/user/?alt=json
从 JSON 响应中,您将获得作者部分,其中包含 uri: $t: https:picasaweb.google.com/0000000000000
现在末尾的数字是用户 ID,可用于使用此 API 检索用户配置文件
https:www.googleapis.com/plus/v1/people/userId
例如:https:www.googleapis.com/plus/v1/people/0000000000000
【讨论】:
除了格式问题,这个答案对我来说非常有效。另请注意,您需要谷歌控制台上的有效访问密钥来查询最后一个端点。?key=XXX
必须添加到该 URL。
Picasa API 自 2019 年 1 月起已弃用。您需要迁移到 Google Photos Library API【参考方案8】:
一个从谷歌获取公开个人资料图片的简单 javascript:
<html>
<body>
<script type="text/javascript">
function getPhoto()
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function()
if (this.readyState == 4 && this.status == 200)
myArr = JSON.parse(this.responseText);
try
profilePic = myArr["feed"]["entry"][0]["media$group"]["media$thumbnail"][0]["url"];
document.getElementById("demo").innerHTML="<img src='" + profilePic + "' width='160px' height='160px'>"
catch(err)
xmlhttp.open("GET", "https://picasaweb.google.com/data/feed/api/user/<EMAIL>?kind=album&alt=json", true);
xmlhttp.send();
</script>
<div id="demo" onclick="javascript:getPhoto();">click here to load photo</div>
</body>
</html>
【讨论】:
Picasa API 自 2019 年 1 月起已弃用。您需要迁移到 Google Photos Library API【参考方案9】:这里是获取 Google 个人资料图片的最有用的链接。
1) 配置项目 https://developers.google.com/identity/sign-in/web/sign-in#before_you_begin
2) 启用 GOOGLE 照片库 API https://developers.google.com/photos/library/guides/get-started
设置上述步骤后,您将在身份验证后获得用户的个人资料图片链接。
注意:启用谷歌照片库API后,您还会获得另一个Client ID和Client Secret,您可以使用以上步骤中的任意一个Client Secret和Client ID。确保您应该在上述两个步骤中提供重定向 URL,以便用户可以在成功验证后重定向到该 URL。
【讨论】:
【参考方案10】:你可以试试 :
<?php
$email = "YOUR_EMAIL_TO_FETCH";
$fetch_profile = "http://picasaweb.google.com/data/entry/api/user/".$email."?alt=json";
$jsonURL = file_get_contents($fetch_profile);
$json = json_decode($jsonURL);
$profile_img = get_object_vars($json->entry);
$profile_img = get_object_vars($profile_img['gphoto$thumbnail']);
$profile_img = $profile_img['$t'];
?>
我希望这会奏效。
【讨论】:
Picasa API 自 2019 年 1 月起已弃用。您需要迁移到 Google Photos Library API以上是关于检索用户的公开 google/gmail 图片的主要内容,如果未能解决你的问题,请参考以下文章
上传图片和 Firebase 显示“用户无权访问此对象”,即使存储设置是公开的
如何使用 java 和 google gmail-api 获取收到的邮件? [关闭]
如何使用 javascript 在 Liferay 中检索用户个人资料图片