Récupération de l'image publique google/gmail d'un utilisateur

je suis en train d'écrire une application basée sur le courrier électronique en utilisant l'api gmail, et j'ai besoin de récupérer des images publiques de l'utilisateur pour l'adresse e-mail provenant de google. J'ai vu d'autres applications le faire, mais je ne vois pas comment obtenir ces données de manière fiable.

un peu plus d'information:

  • j'utilise oauth2 pour signer l'utilisateur in - et je n'ai aucun problème à demander n'importe quel type de permissions là-bas.
  • j'ai essayé de récupérer l'image en utilisant l'api google+ - mais il faut un userID pour cela - et je ne sais pas comment obtenir l'userId pour l'adresse email (gmail-api doesn't give it, afaik).
  • j'ai essayé D'utiliser l'API contacts - mais elle ne donne que des images pour les contacts de l'utilisateur, alors que les clients de messagerie peuvent afficher des images d'autres utilisateurs aussi bien.

Merci!

Edit:

je sais que je peux recevoir les images de google plus, si j'ai l'autre utilisateur userid. cependant, je ne peux pas trouver un moyen d'obtenir la nom d'utilisateur basé sur une adresse de courriel.

26
demandé sur shaish 2014-09-01 16:52:54

8 réponses

c'Est très facile

http://picasaweb.google.com/data/entry/api/user/<hereYourUserIdOrYourEmail>?alt=json

juste un petit problème.

Vous ne pouvez obtenir l'image de votre Profil Google+, pas directement à partir de votre gmail

58
répondu jose920405 2016-06-16 21:59:20

basé sur la réponse de @jose920405, j'ai écrit ce service D'API public gratuit appelé API Pikmail. Voici quelques avantages.

  • aucune authentification requise.
  • c'est totalement libre et open source.
  • c'est écrit en Kotlin.
  • vous n'avez pas besoin d'écrire un wrapper pour cartographier la réponse.
comment fonctionne L'API Pikmail en interne.

Utilisation:

Html

<img src="/images/content/25606322/adbc8fb6c5b4a4c48d5668c770c4ba62.com" alt="Profile Picture">

Profile Picture

Java Android

Picasso.with(context).load("/images/content/25606322/adbc8fb6c5b4a4c48d5668c770c4ba62.com").into(imageView);

N'hésitez pas à contribuer en tirant des requêtes, en ouvrant des bogues ou en demandant de nouvelles fonctionnalités ici.

Remarque: Ce service est basé sur une bibliothèque indépendante appelée Pikmail qui peut être utilisé comme une dépendance Grad dans votre projets java (serveurs ou applications Android).

16
répondu epool 2018-02-14 17:23:11

Google+ est la bonne façon de le faire. Cela n'a en fait rien à voir avec L'API Gmail. Vous n'avez pas besoin de l'utilisateur userid, juste un jeton d'accès valide avec la portée.

https://www.googleapis.com/plus/v1/people/me?access_token=YOUR_ACCESS_TOKEN_HERE

à moins qu'il n'y ait une erreur/un token invalide/etc, cela retournera un tas d'informations sur l'utilisateur en tant que JSON. Ces données comprendront une URI pour l'image du profil de l'utilisateur.

EDIT:

Pour obtenir l'image de profil pour un utilisateur basé sur le adresse de courrier électronique, recherche pour l'utilisateur

https://www.google.com/m8/feeds/contacts/default/thin?q=EMAIL_ADDRESS_HERE

vous pouvez alors récupérer le nom d'utilisateur correct pour cet utilisateur à partir du JSON retourné, et l'utiliser pour obtenir une image de profil.

6
répondu James 2014-09-02 22:51:44

je me suis cogné la tête contre cette pour les jours, car aucune réponse ne semblait fonctionner. Ce qui a fonctionné et semble plus robuste face aux changements futurs était (il utilise 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>

Vous avez besoin D'un identifiant de client Google OAuth2-voir https://developers.google.com/identity/protocols/OAuth2UserAgent pour les détails. Il ne semble pas fonctionner seulement avec une clé API - à partir des réponses que je recevais, ils ont fixé le quota pour les non authentifiés accès à L'API (C'est-à-dire: juste en utilisant la clé et pas le ClientID) à zéro.

L'ID du Client est disponible à partir de la console cloud comme documenté sur le lien - je pense que vous devez créer un projet pour créer les justificatifs d'identité, mais si vous ne l'utilisez pas ils ne vous factureront pas de sorte que ce n'est pas un problème.L'utilisateur doit être connecté - si ce n'est pas le cas, ce code se connecte. Mais si vous n'utilisez pas de connexion Google pour votre page de toute façon-pourquoi voudriez-vous leur vignette? Parce que le l'URL de l'image est disponible à partir du profil de base de l'utilisateur . - la requête API ne semble pas avoir besoin d'une portée particulière et il n'y en a aucune dans l'appel API dans le code.

vous aurez besoin d'identifier l'url de la page à partir de laquelle vous appelez dans le cadre des justificatifs d'identité de votre client dans la console Google - sinon la demande sera rejetée. Il y a un quota - je pense qu'il est de 20 000 par jour - d'appels API gratuits après quoi ils vous factureront pour l'utilisation de l'API. C'est autant que je le peux rassembler.

2
répondu Paul Harwood 2018-05-04 18:42:46

Vous pouvez utiliser L'API googleapp profile

voici l'exemple de code pour accéder au profil pic

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

vous pouvez obtenir plus d'information ici

1
répondu Satish Shinde 2014-09-09 08:54:13

il est peut-être trop tard pour répondre à la question, mais la meilleure façon que j'ai trouvée était d'utiliser d'abord http://picasaweb.google.com/data/entry/api/user/