98

I know that lots of social network APIs provide a way to construct a url to the profile picture of a user, using their user_id or username. For Facebook it looks like this:

http://graph.facebook.com/user_id/picture?type=square

Now is there something like this for Google Plus? Or any other way to get user's pic without an API call??

ArVan
  • 4,225
  • 8
  • 36
  • 58
  • 3
    I opened a feature request which you can star to get updates if Google ever implements it. https://code.google.com/p/google-plus-platform/issues/detail?id=167 – abraham Feb 03 '12 at 18:44
  • Here's an example for the other way around. Embedding for instance your StackOverflow flair in your Google+ Profile: http://goo.gl/8EE4LT – Lorenz Lo Sauer Nov 06 '13 at 16:05
  • The answer to this question changed since 2012 too many times. I posted one answer that work in 2020 - don't know how much time :) – Leandro Bardelli Sep 26 '20 at 06:13

12 Answers12

103

Google had changed their policy so the old way for getting the Google profile image will not work now, which was

https://plus.google.com/s2/photos/profile/(user_id)?sz=150

New Way for doing this is

Request URL

https://www.googleapis.com/plus/v1/people/115950284...320?fields=image&key={YOUR_API_KEY}

That will give the Google profile image url in json format as given below

Response :

{
    "image": 
    {
         "url": "https://lh3.googleusercontent.com/-OkM...AANA/ltpH4BFZ2as/photo.jpg?sz=50"
    }
}

More parameters can be found to send with URL which you may need from here

For more detail you can also check the given question where I have answered for same type of problem How to get user image through user id in Google plus?

Leandro Bardelli
  • 10,561
  • 15
  • 79
  • 116
Deepak Goswami
  • 2,030
  • 1
  • 16
  • 22
94

UPDATE: The method below DOES NOT WORK since 2015

It is possible to get the profile picture, and you can even set the size of it:

https://plus.google.com/s2/photos/profile/<user_id>?sz=<your_desired_size>

Example: My profile picture, with size set to 100 pixels:

https://plus.google.com/s2/photos/profile/116018066779980863044?sz=100

Usage with an image tag:

<img src="https://plus.google.com/s2/photos/profile/116018066779980863044?sz=100" width="100" height="100">

Hope you get it working!

Emil Stenström
  • 13,329
  • 8
  • 53
  • 75
47

UPDATE: Google stopped support for this method, that now returns a 404 (not found) error.


All this urls fetch the profile picture of a user:

https://www.google.com/s2/photos/profile/{user_id}
https://plus.google.com/s2/photos/profile/{user_id}
https://profiles.google.com/s2/photos/profile/{user_id}

They redirect to the same image url you get from Google API, an ugly link as
lh6.googleusercontent.com/-x1W2-XNKA-A/AAAAAAAAAAI/AAAAAAAAAAA/ooSNulbLz8U/photo.jpg

The simplest is to directly use like image source:

<img src="https://www.google.com/s2/photos/profile/{user_id}">

Otherwise to obtain exactly the same url of a Google API call you can read image headers,
for example in PHP:

$headers = get_headers("https://www.google.com/s2/photos/profile/{user_id}", 1);
echo "<img src=$headers[Location]>";

as described in article Fetch Google Plus Profile Picture using PHP.

Salvador
  • 786
  • 8
  • 21
26

Approach 1: (no longer works)

https://plus.google.com/s2/photos/profile/<user_id>?sz=<your_desired_size>

Approach 2: (each request counts in your api rate limits which is 10k requests per day for free)

https://www.googleapis.com/plus/v1/people/<user_id>?fields=image&key={YOUR_API_KEY}

with the following response format:

{ "image": { "url": "lh5.googleusercontent.com/-keLR5zGxWOg/.../photo.jpg?sz=50"; } }

Approach 3: (donot require api key)

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

in the json response you get a property named "gphoto$thumbnail", which contains the profile picture url like the following:

http://lh6.ggpht.com/-btLsReiDeF0/AAAAAAAAAAI/AAAAAAAAAAA/GXBpycNk984/s64-c/filename.jpg

You may notice in the url the portion "s64-c" which means the image size to be 64, I've tried using other values like "s100-c" and they worked. Also if you remove the "s64-c" part and append the "?sz=100" parameter, that will also work as of now. Though this is not very good way of getting the profile picture of a gplus user, but the advantage is it do not require any api key.

Masum
  • 1,678
  • 15
  • 19
  • On Approach2 have you figured out how to set image size by API call? – Maca Mar 28 '14 at 07:31
  • @Maca you should get the api response like this: { "image": { "url": "https://lh5.googleusercontent.com/-keLR5zGxWOg/.../photo.jpg?sz=50" } } from where you can set the sz parameter for different image sizes – Masum Mar 28 '14 at 07:57
  • lol..google is going to have to hack every publicly available image link to come under their API for people to have no choice but to get an API key. – user1323136 Jun 21 '14 at 13:28
  • 2
    I wonder if there is something like picasaweb but you get the picture directly from the email and not google +. I just have a case of a user that has an image in your Gmail account but do not have a profile on google +, and does not bring image. Only can get an url like this http://lh3.googleusercontent.com/-k10Va1BdzL8/AAAAAAAAAAA/AAAAAAAAAAA/5vpJcwClcAA/s64-c/117785406588046698617.jpg – jose920405 Nov 25 '15 at 19:16
  • 2
    picasaweb.google.com api is depriciated and will be turned off by Jan 2019 https://developers.google.com/picasa-web/ – siddhesh Dec 27 '18 at 08:14
  • @siddhesh do you know of any other alternative then? – sbattou Jan 02 '19 at 03:32
  • @jose920405 did you ever figure it out? – sbattou Jan 02 '19 at 03:32
11

Google, no API needed:

$data = file_get_contents('http://picasaweb.google.com/data/entry/api/user/<USER_ID>?alt=json');
$d = json_decode($data);
$avatar = $d->{'entry'}->{'gphoto$thumbnail'}->{'$t'};

// Outputs example: https://lh3.googleusercontent.com/-2N6fRg5OFbM/AAAAAAAAAAI/AAAAAAAAADE/2-RmpExH6iU/s64-c/photo.jpg

CHANGE: the 64 in "s64" for the size

Shawn Rebelo
  • 1,027
  • 11
  • 14
  • 1
    This is fine, but does not return if the avatar is the default or a real user uploaded one. – Miguel Nov 13 '14 at 13:02
4

If you want to show the profile picture for the currently logged in user, you do not even need to know the {user_id}. Simply using https://plus.google.com/s2/photos/profile/me will be enough.

Danny Ruijters
  • 3,411
  • 2
  • 18
  • 21
4

2020 Solution Please comment if no longer available.

In order to get profile URL from authenticated user.

GET https://people.googleapis.com/v1/people/[THE_USER_ID_OF_THE_AUTHENTICATED_USER]?personFields=photos&key=[YOUR_API_KEY] HTTP/1.1

Authorization: Bearer [YOUR_ACCESS_TOKEN]
Accept: application/json

Response:

{
  "resourceName": "people/[THE_USER_ID_OF_THE_AUTHENTICATED_USER]",
  "etag": "12345",
  "photos": [
    {
      "metadata": {
        "primary": true,
        "source": {
          "type": "PROFILE",
          "id": "[THE_USER_ID_OF_THE_AUTHENTICATED_USER]"
        }
      },
      "url": "https://lh3.googleusercontent.com/a-/blablabla=s100"
    }
  ]
}

and the link can be used as:

<img src="https://lh3.googleusercontent.com/a-/blablabla=s100">
Leandro Bardelli
  • 10,561
  • 15
  • 79
  • 116
3

You can get the URL for the profile image using the people.get method of the Google+ API. That does require an extra round trip, but is the most reliable way to get the image.

You technically can also use the URL https://s2.googleusercontent.com/s2/photos/profile/{id}?sz={size} which will then redirect to the final URL. {id} is the Google user ID or one of the old Google Profiles usernames (they still exist for users who had them, but I don't think you can create new ones anymore). {size} is the desired size of the photo in pixels. I'm almost certain this is not a documented, supported feature, so I wouldn't rely on it for anything important as it may go away at anytime without notice. But for quick prototypes or small one-off applications, it may be sufficient.

Will Norris
  • 542
  • 2
  • 8
2

trying to access the /s2/profile/photo url works for most users but not all.

The only full proof method is to use the Google+ API. You don't need user authentication to request public profile data so it's a rather simple method:

  1. Get a Google+ API key on https://cloud.google.com/console

  2. Make a simple GET request to: https://www.googleapis.com/plus/v1/people/+< username >?key=

Note the + before the username. If you use user ids instead (the long string of digits), you don't need the +

  1. you will get a very comprehensive JSON representation of the profile data which includes: "image":{"url": "https://lh4.googleusercontent.com/..... the rest of the picture url...."}
Erwan
  • 3,733
  • 30
  • 25
2

If you use Flutter, then you can access it via people.googleapis.com endpoint, code uses google_sign_in library

import 'package:google_sign_in/google_sign_in.dart';

Future<String> getPhotoUrl(GoogleSignInAccount account, String userId) async {
  // final authentication = await account.authentication;
  final url = 'https://people.googleapis.com/v1/people/${userId}?personFields=photos';
  final response = await http.get(
    url,
    headers: await account.authHeaders
  );

  final data = json.decode(response.body);
  return data['photos'].first['url'];
}

You will get something like

{
  resourceName: people/998812322529259873423, 
  etag: %EgQBAzcabcQBAgUH, 
  photos: [{metadata: {primary: true, source: {type: PROFILE, id: 107721622529987673423}}, 
  url: https://lh3.googleusercontent.com/a-/abcdefmB2p1VWxLsNT9WSV0yqwuwo6o2Ba21sh_ra7CnrZ=s100}]
}

where url is an accessible image url.

onmyway133
  • 45,645
  • 31
  • 257
  • 263
1

Tried everything possible.. here is final piece of working code. Hope it helps someone who is looking for it.

    <?
$url='https://www.googleapis.com/plus/v1/people/116599978027440206136?fields=image%2Furl&key=MY_API_KEY&fields=image';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$d = json_decode($response);
$avatar_url = $d->{'image'}->{'url'};
echo $avatar_url;
?>
suraj jain
  • 1,012
  • 14
  • 26
-4

Simple answer: No

You will have to query the person API and the take the profile image.url data to get the photo. AFAIK there is no default format for that url that contains the userID.

Kolja
  • 2,307
  • 15
  • 23
  • You're sure? I wonder if they have any plans to make such thing? Thanks anyway. – ArVan Feb 03 '12 at 12:39
  • 1
    If you look at different profiles and look at the html output e.g. with "inspect element" in chrome you will see that they are all different and don't contain the userID. Also there is nothing on the official docs. – Kolja Feb 03 '12 at 12:44
  • 2
    It IS possible, both to get the image, and set a specific size to look for. See my answer below. – Emil Stenström Jun 27 '12 at 16:13
  • It was not possible when the question and this answer where posted :) – ArVan Mar 24 '14 at 12:28