web-dev-qa-db-fra.com

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

J'écris une application basée sur la messagerie électronique à l'aide de gmail-api, et je dois récupérer des images publiques d'utilisateur pour une adresse électronique provenant de Google ... J'ai vu d'autres applications le faire, mais je ne peux pas sembler être un moyen pour obtenir de manière fiable ces données.

quelques informations supplémentaires:

  • j'utilise oauth2 pour connecter l'utilisateur - et je n'ai aucun problème à demander n'importe quel type de permission là-bas.
  • j'ai essayé de récupérer l'image à l'aide de l'API Google +, mais un identifiant utilisateur est nécessaire pour cela. Je ne sais pas comment obtenir l'identifiant utilisateur de l'adresse électronique (gmail-api ne le donne pas, autant que je sache).
  • j'ai essayé d'utiliser l'API Contacts - mais elle ne donne que des images pour les contacts de l'utilisateur, tandis que les clients de messagerie peuvent également afficher des images d'autres utilisateurs.

Merci!

Modifier:

Je sais que je peux recevoir les images requises de Google plus, si j'ai l'ID utilisateur de l'autre utilisateur. Cependant, je ne peux pas trouver un moyen d'obtenir l'ID utilisateur en fonction d'une adresse électronique.

32
shaish

C'est très facile

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

a juste un petit problème.

Vous pouvez uniquement obtenir la photo de votre profil Google+, pas directement à partir de votre compte Gmail.

METTRE À JOUR:

Cette API est obsolète et sera refusée en janvier 2019. Migrez vers l'API Google Photos Library dès que possible pour éviter toute perturbation de votre application.

Info Ici

Guide de migration

64
jose920405

METTRE À JOUR:

Cette API est obsolète et sera refusée en janvier 2019. Migrez vers l'API Google Photos Library dès que possible pour éviter toute perturbation de votre application.

Info Ici

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

  • Aucune authentification requise.
  • C'est totalement gratuit et open source.
  • C'est écrit en Kotlin.
  • Vous n'avez pas besoin d'écrire un wrapper pour mapper la réponse.

Voici l'article de blog sur comment l'API Pikmail fonctionne en interne .

Utilisation:

Html

<img src="https://pikmail.herokuapp.com/[email protected]?size=50" alt="Profile Picture">

Profile Picture

Java Android

Picasso.with(context).load("https://pikmail.herokuapp.com/[email protected]?size=50").into(imageView);

N'hésitez pas à contribuer avec vos demandes d'extraction, à ouvrir des bogues ou à demander de nouvelles fonctionnalités ici .

Remarque: Ce service repose sur une bibliothèque indépendante appelée Pikmail qui peut être utilisée comme dépendance Gradle dans vos projets Java (serveurs ou applications Android).

19
epool

Google+ est le bon moyen de le faire. Cela n'a en réalité rien à voir avec l'API Gmail. Vous n'avez pas besoin d'un ID utilisateur, mais simplement d'un jeton d'accès valide avec des portées appropriées.

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

À moins qu'il y ait une erreur/un jeton invalide/etc, cela retournera un tas d'informations sur l'utilisateur en JSON. Inclus dans ces données sera un URI pour l'image de profil de l'utilisateur.

MODIFIER:

Pour obtenir la photo de profil d’un utilisateur en fonction de son adresse e-mail, commencez par rechercher l’utilisateur.

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

Vous pouvez ensuite récupérer le bon ID utilisateur pour cet utilisateur à partir du JSON renvoyé et l'utiliser pour obtenir une image de profil.

6
James

un simple javascript pour récupérer une image de profil public à partir de google:

<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>
2
eyal

Je me suis cogné la tête pendant des jours, car aucune des réponses ne semblait plus fonctionner. Qu'est-ce qui a fonctionné et qui a semblé le 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 plus de détails. Cela ne semble pas fonctionner uniquement avec une clé d'API - d'après les réponses que j'ai reçues, ils ont défini le quota d'accès non authentifié à l'API (c'est-à-dire utilisant simplement la clé et non le ClientID). 

L'ID client est disponible à partir de la console cloud, comme indiqué sur le lien. Je pense que vous devez créer un projet pour créer les informations d'identification, mais si vous ne l'utilisez pas, ils ne vous factureront pas, ce qui ne pose aucun problème. L'utilisateur doit être connecté - si ce n'est pas le cas, ce code se connectera alors. Mais si vous n'utilisez pas de connexion Google pour votre page de toute façon - pourquoi voudriez-vous que leur vignette apparaisse? Parce que l'URL de l'image est disponible à partir du profil utilisateur de base. - la demande d'API ne semble pas avoir besoin d'étendue particulière et il n'y en a aucune dans l'appel d'API dans le code.

Vous devrez identifier l'URL de la page à partir de laquelle vous appelez dans les informations d'identification de votre client dans la console Google. Dans le cas contraire, la demande sera refusée. Il existe un quota - je pense que c'est 20 000 par jour - d'appels d'API gratuits, après quoi ils vous factureront pour l'utilisation de l'API. C'est tout ce que je peux rassembler.

2
Paul Harwood

Peut-être qu'il est trop tard pour répondre à la question, mais le meilleur moyen que j'ai trouvé était de commencer par l'utiliser http://picasaweb.google.com/data/entry/api/user/ ? Alt = json

À partir de la réponse JSON, vous obtiendrez une section auteur contenant uri: $ t: https: picasaweb.google.com/0000000000000.

maintenant les numéros à la fin est l'ID utilisateur qui peut être utilisé pour récupérer le profil utilisateur à l'aide de cette API

https: www.googleapis.com/plus/v1/people/userId

Ex: https: www.googleapis.com/plus/v1/people/0000000000000

2
Ricky

Vous pouvez utiliser l'API de profil d'application Google.

voici l'exemple de code pour accéder à la photo de profil

function getProfilePic(userName){
  userName = '[email protected]'; 
  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'informations ici

1
Satish Shinde

Après avoir été authentifié, vous pouvez obtenir vos informations d’utilisateur en utilisant l’URL: https://www.googleapis.com/oauth2/v1/userinfo?alt=json

0
Gregory Buiko

Vous pouvez essayer quelque chose comme :

<?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'];
?>

J'espère que cela fonctionnera.

0
JO JO

Si vous authentifiez des utilisateurs de votre application avec Google à l'aide de l'API OAuth 2.0 - Par exemple, avec passeport -> https://www.npmjs.com/package/passport-google-oauth20

Vous pouvez demander l'étendue "profile", qui vous donne un tas d'informations de displayName aux photos de profil de l'utilisateur "profile.photos [0]"

0
Dan Perry