web-dev-qa-db-ja.com

グラフAPIから「実際の」Facebookプロフィール画像URLを取得する

FacebookグラフAPIを使用して、ユーザーのプロフィール写真を取得できることがわかります

http://graph.facebook.com/517267866/picture?type=large

正常に動作します。ただし、ブラウザに上記のURLを入力すると、画像の実際のアドレスは

http://profile.ak.fbcdn.net/profile-ak-snc1/v227/560/83/n517267866_1928.jpg

最初のURLをプログラムで使用して2番目のURLを取得するにはどうすればよいですか?

75
ericbae

最初のURLは、2番目のURLにHTTP 302(一時リダイレクト)を提供します。したがって、2番目のURLをプログラムで見つけるには、最初のURLに対してHTTPリクエストを発行し、応答のLocationヘッダーを取得できます。

ただし、2番目のURLが永続的であることに依存しないでください。 HTTPレスポンスコード(パーマネント301ではなく302)を少し読むと、Facebookが定期的にそれらのURLを変更して、人々がサーバーを使用して画像をホストできないようにすることができます。


Edit:OPが投稿したCDN URLが404になっていることに注意してください。したがって、URLの寿命は長くなりません。また、SSLで保護されたページの<img>からGraph APIにリンクしている場合、 パラメータがあります 追加する必要があります 必ずhttps://graph.facebook.comを使用してください。


更新:APIには パラメーターを追加redirect=false –リダイレクトではなくJSONが返されます。再構築されたJSONにはCDN URLが含まれます。

{
   "data": {
      "url": "http://profile.ak.fbcdn.net/...",
      "is_silhouette": false
   }
}

繰り返しますが、私はこのCDN URLが長持ちすることに依存しません。 JSONレスポンスは寛容なCORSヘッダーで送信されるため、XHRリクエストを使用してこのクライアント側を自由に行うことができます。

73
josh3736
36
Adfsd

私はこれが遅いことに気付きますが、プロフィール画像のURLを取得する別の方法があります。

元のURLにパラメーターredirect=falseを追加して、通常リダイレクトされる画像の実際のURLを取得できます。

したがって、新しいリクエストは http://graph.facebook.com/517267866/picture?type=large&redirect=false のようになります。これにより、画像のURLとis_silhouetteブール値を含むJSONオブジェクトが返されます(画像がデフォルトのFacebook画像の場合はtrue)。

画像も指定したサイズになります。寸法を追加することで、これをさらにテストできます。 http://graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=4

16
joanna

iOSでプロフィール写真を取得したい他の人:

ユーザーのFacebook写真を取得するためにこれを実行しました。

NSString *profilePicURL = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture?type=large", fbUserID];

ここで、「fbUserID」はFacebookユーザーのプロファイルIDです。

このように、常にprofilePicURLのurlを呼び出すだけで画像を取得でき、常に問題なく取得できます。既にユーザーIDを取得している場合は、APIリクエストは必要ありません。facebook.com/の後のURLにIDを貼り付けるだけです。

参考までに、iOSでfbUserIDが必要な人は誰でも:

if (FBSession.activeSession.isOpen) {
    [[FBRequest requestForMe] startWithCompletionHandler:
     ^(FBRequestConnection *connection,
       NSDictionary<FBGraphUser> *user,
       NSError *error) {
         if (!error) {
             self.userName = user.name;
             self.fbUserID = user.id;
         }
     }];
}

これを機能させるには、アクティブなFBSessionが必要です(Facebookのドキュメントと「Scrumptious」の例を参照)。

7
Fateh Khalsa

URLを含む良質のプロファイル画像のJSONが必要な場合は、それを使用できます。

http://graph.facebook.com/517267866/picture?height=1024&redirect=false

ピクチャが必要な場合は、パラメータリダイレクトなしで使用します。

http://graph.facebook.com/517267866/picture?height=1024

517267866は、上記の例のいずれかのプロファイルIDです。必要なFacebook IDを入力してください

それがお役に立てば幸いです

6
Kasas
$url = 'http://graph.facebook.com/100000771470028/picture?type=large';
$rray=get_headers($url);
$hd = $rray[4];
echo(substr($hd,strpos($hd,'http')));

これにより、要求したURLが返されます。元のURLからURLを動的に呼び出すため、facebookでURLを変更する問題は問題になりません。

3
KAS

これが実際に機能する唯一のものです。

me?fields=picture.type(*YOURTYPE*)

ここで、YOURTYPEは、次のいずれかです:small、normal、album、large、square

2
Fabio Napodano

Androidの場合:

最新のFacebook SDKによると、

最初に、APIGraphRequest APIも与えるユーザーの詳細をすべて取得するために、URL of current Profile Pictureを呼び出す必要があります。

Bundle params = new Bundle();
params.putString("fields", "id,email,gender,cover,picture.type(large)");
new GraphRequest(token, "me", params, HttpMethod.GET,
        new GraphRequest.Callback() {
            @Override
            public void onCompleted(GraphResponse response) {
                if (response != null) {
                    try {
                        JSONObject data = response.getJSONObject();
                        if (data.has("picture")) {
                            String profilePicUrl = data.getJSONObject("picture").getJSONObject("data").getString("url");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
}).executeAsync();
2
Rajesh

今、FacebookはSSLが必要です

->重要なS、httpsを追加-> https://graph.facebook.com/userId/?fields=picture&type=large

2014年6月の作品

1
luizfelipetx
function getFacebookImageFromURL($url)
{
  $headers = get_headers($url, 1);
  if (isset($headers['Location']))
  {
    return $headers['Location'];
  }
}

$url = 'https://graph.facebook.com/zuck/picture?type=large';
$imageURL = getFacebookImageFromURL($url);
1
TheDayIsDone

Hmm..iはユーザー画像へのURLを取得するためにあらゆることを試みました。完璧な解決策は、このようなfqlの使用でした->

    $fql_b = 'SELECT pic from user where uid = ' . $user_id;
    $ret_obj_b = $facebook->api(array(
                               'method' => 'fql.query',
                               'query' => $fql_b,
                             ));


             $dp_url =$ret_obj_b[0]['pic'];

他の望ましい結果を得るには、picをbig、pic_squareに置き換えます。助けてください...

0
Priyanshu
ImageView user_picture;
userpicture=(ImageView)findViewById(R.id.userpicture);
URL img_value = null;
img_value = new URL("http://graph.facebook.com/"+id+"/picture?type=large");
Bitmap mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream());
userpicture.setImageBitmap(mIcon1);

IDは1ですプロファイルID

0
madhu sudhan