user_idを使用してGoogle+プロフィール写真のURLを取得する


92

多くのソーシャルネットワークAPIが、user_idまたはusernameを使用して、ユーザーのプロフィール写真へのURLを構築する方法を提供していることを知っています。Facebookの場合、次のようになります。

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

Google Plusにこのようなものはありますか?または、API呼び出しなしでユーザーの写真を取得する他の方法は?


3
Googleが実装した機能にリクエストを送信して、Googleが実装した場合にアップデートを取得できます。code.google.com/p/google-plus-platform/issues/detail?id=167
アブラハム

これが逆の例です。たとえば、StackOverflowをGoogle+プロフィールに埋め込む
Lorenz Lo Sauer

回答:


100

Googleはポリシーを変更したため、Googleプロフィール画像を取得するための古い方法は現在機能しません。

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

これを行う新しい方法は

リクエストURL

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

以下のように、json形式のGoogleプロフィール画像のURLが表示されます

対応:

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


あなたがここから必要とするかもしれないURLで送信するより多くのパラメータが見つかります

詳細については、同じタイプの問題について私が回答した所与の質問を確認することもでき ます。

ハッピーコーディング!!


1
それはまだリダイレクトではなく、<img>タグ内では使用できません
Kirill Kulakov

2
これがJSON形式で言及されている理由です。変更があるため、以前のようにすべてが機能することは期待できません。@ KirillKulakov
TheMohanAhuja

1
@rgorayaあなたはAPI呼び出しで要求することはできませんが、確かにあなたが得た画像URLでサイズを追加することができます.../-OkM...AANA/ltpH...as/photo.jpg?sz=512
TheMohanAhuja

1
不正なリクエストエラーが発生しました。開発者コンソールでどのAPIを有効にする必要がありますか
Earwin delos Santos

3
将来的に非推奨となるため、google plus apiなしでユーザーのプロフィール写真を取得する方法はありますか
Saurabh Verma

94

更新:2015年以降、以下の方法は機能しません

プロフィール写真を取得することが可能で、サイズを設定することもできます:

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

例:サイズを100ピクセルに設定したプロフィール写真:

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

画像タグでの使用:

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

うまくいきますように!


1
はい、今は機能していません。それが一時的な問題か永続的な問題かを誰かが知っていますか?
セシリアアバディ

1
この方法は機能しなくなりました。404エラーが発生します。Chrome、Safari、FireFoxでテストしました。
Justin

2
上記の方法が数日前から機能しないことを反映するように、回答を更新しました。
EmilStenström2014年

1
@CeciliaAbadie:メソッドがまだ機能していることを確認できますか?いくつかのバリエーションを試してみましたが、私のユーザーIDで機能させることができませんでした(上記の回答を参照)。あなたはできる?
EmilStenström2014年

2
@rgoraya:しかし、xxxxxxの部分を自動的にどのように計算しますか?
EmilStenström2014年

47

更新:Googleはこのメソッドのサポートを停止し、404(見つかりません)エラーを返すようになりました


このすべてのURLはユーザーのプロフィール写真を取得します。

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}

これらは、
lh6.googleusercontent.com / -x1W2-XNKA-A / AAAAAAAAAAA / AAAAAAAAAAA / ooSNulbLz8U / photo.jpgのような醜いリンクである、Google APIから取得したのと同じ画像URLにリダイレクトされます。

最も簡単なのは、画像ソースのように直接使用することです。

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

それ以外の場合、Google API呼び出しとまったく同じURLを取得するには
、たとえばPHPで画像ヘッダーを読み取ることができます。

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

記事「PHPを使用してGoogle Plusプロフィール画像を取得する」で説明されています


1
リクエストごとにHTTPリクエストを行う必要はありません。私の回答を参照してください。
EmilStenström12年

1
これはどこかに文書化されていますか?
Jonas Alves

1
これは完全に機能しますが、公式ドキュメントがどこにも見当たらないため、Googleがこれのサポートを停止する可能性があるため、私はこの方法を採用しません
Lefteris

以下に完全な証明の答えを追加しました
Erwan

以下に、ユーザーIDでGoogleプロフィール画像を取得する新しいソリューションを追加しました。これは404エラーを返さないため、確認してください。
Deepak Goswami

26

アプローチ1:(機能しなくなります)

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

アプローチ2:(各リクエストは、無料で1日あたり10,000リクエストであるAPIレート制限にカウントされます)

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

次の応答フォーマットで:

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

アプローチ3:(APIキーは不要)

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

jsonレスポンスでは、「gphoto $ thumbnail」という名前のプロパティを取得します。これには、次のようなプロフィール写真のURLが含まれています。

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

画像サイズが64であることを意味する「s64-c」の部分のURLに気づくかもしれませんが、「s100-c」のような他の値を使用してみましたが、それらは機能しました。また、「s64-c」の部分を削除して「?sz = 100」パラメータを追加すると、現在も機能します。これはgplusユーザーのプロフィール画像を取得するのにあまり良い方法ではありませんが、APIキーを必要としないという利点があります。


Approach2で、API呼び出しによって画像サイズを設定する方法を理解しましたか?
マカ2014年

@Maca次のようなAPI応答を取得する必要があります:{"image":{"url": " lh5.googleusercontent.com/-keLR5zGxWOg/.../photo.jpg?sz=50 "}}設定可能な場所から異なる画像サイズのszパラメータ
Masum

lol..googleは、人々がAPIキーを取得する以外に選択肢がないために、APIの下に公開されているすべての画像リンクをハックする必要があります。
user1323136 2014年

2
picasawebのようなものがあるかどうか疑問に思いますが、Google +ではなくメールから直接画像を取得します。Gmailアカウントに画像があり、google +にプロファイルがなく、画像が表示されないユーザーのケースがあります。これだけのようなURLを取得することができますlh3.googleusercontent.com/-k10Va1BdzL8/AAAAAAAAAAA/AAAAAAAAAAA/...
jose920405

2
picasaweb.google.com APIはdepriciatedされ、2019年1月でオフになりますdevelopers.google.com/picasa-web
siddhesh

11

Google、APIは不要:

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

//出力例:https : //lh3.googleusercontent.com/-2N6fRg5OFbM/AAAAAAAAAAI/AAAAAAAAADE/2-RmpExH6iU/s64-c/photo.jpg

変更:サイズの「s64」の64


1
これは問題ありませんが、アバターがデフォルトの場合、または実際のユーザーがアップロードした場合は返されません。
ミゲル

4

現在ログインしているユーザーのプロフィール写真を表示したい場合は、{user_id}を知る必要すらありません。単に使用https://plus.google.com/s2/photos/profile/meするだけで十分です。


おかげで、残念ながら現在ログインしているユーザーは対象外です
ArVan

問題は、user_idを使用してプロフィール写真を取得することでした。
makki

3

people.getを使用して、プロフィール画像のURLを取得できますGoogle+ APIのメソッドをます。これには追加の往復が必要ですが、イメージを取得する最も信頼できる方法です。

技術的にはhttps://s2.googleusercontent.com/s2/photos/profile/{id}?sz={size}、最終的なURLにリダイレクトするURL を使用することもできます。 {id}GoogleユーザーIDまたは古いGoogleプロフィールのユーザー名の1つです(これらはまだそれらを持っているユーザーのために存在しますが、新しいものを作成することはもうできないと思います)。 {size}ピクセル単位の写真の必要なサイズです。これが文書化され、サポートされている機能ではないことはほぼ間違いないので、重要なことはいつでも予告なしになくなる可能性があるため、この機能に依存することはありません。ただし、迅速なプロトタイプまたは小規模な1回限りのアプリケーションの場合は、それで十分な場合があります。


これはどこかに文書化されていますか?
Jonas Alves

うん、ジャスティンは正しいようです...これはもはや機能しません。
ノリス

2

/ s2 / profile / photoのURLにアクセスしようとすると、ほとんどのユーザーで機能しますが、すべてのユーザーで機能するわけではありません。

唯一の完全な証明方法は、Google + APIを使用することです。パブリックプロファイルデータを要求するのにユーザー認証は必要ないので、これはかなり単純な方法です。

  1. https://cloud.google.com/consoleで Google+ APIキーを取得します

  2. https://www.googleapis.com/plus/v1/people/+ <ユーザー名>?key = への簡単なGETリクエストを作成します

ユーザー名の前の+に注意してください。代わりにユーザーID(数字の長い文字列)を使用する場合、+は必要ありません。

  1. "image":{"url": " https://lh4.googleusercontent.com/ .....残りの画像のURL ... を含む、プロファイルデータの非常に包括的なJSON表現を取得します。"}

2

Flutterを使用している場合は、people.googleapis.comエンドポイント経由でアクセスできます。コードはgoogle_sign_inライブラリを使用します

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

次のようなものになります

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

どこurl親近感のURLです。


2

レガシーGoogle+ APIは2019年3月7日をもって閉鎖されました。一部の開発者への影響を軽減するために、最近シャットダウン計画が変更されました。


1

可能なすべてのものを試してみました..これが作業コードの最後の部分です。それがそれを探している誰かを助けることを願っています。

    <?
$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;
?>

-5

簡単な答え:いいえ

写真を取得するには、person APIをクエリし、プロフィールのimage.urlデータを取得する必要があります。私の知る限り、userIDを含むそのURLのデフォルトの形式はありません。


よろしいですか?彼らはそのようなことをする計画はあるのでしょうか?とにかくありがとう。
ArVan

1
さまざまなプロファイルを見て、HTMLの出力を見ると、たとえばchromeの「inspect element」で、それらはすべて異なり、userIDが含まれていないことがわかります。また、公式ドキュメントには何もありません。
Kolja

2
画像を取得することも、特定のサイズを設定して検索することも可能です。以下の私の答えを参照してください。
EmilStenström12年

質問とこの回答が投稿されたときに不可能でした:)
ArVan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.