如何使用Facebook Graph API显示用户的个人资料图片?

70

我想在我的应用画布页面中显示用户的个人资料图片,是否有一种方法可以使用图形API来实现?

我知道可以使用FBML来完成,但我还想将个人资料图片传递给我正在制作的Flash游戏,因此我需要从api获取个人资料图片并将其作为变量发送。以下是我目前拥有的代码:

$facebook = new Facebook(array(
    'appId'  => FACEBOOK_APP_ID,
    'secret' => FACEBOOK_SECRET_KEY,
    'cookie' => true,
    'domain' => 'myurl/facebook-test'
));

$session = $facebook->getSession();

        $uid = $facebook->getUser();
        $me = $facebook->api('/me');

        $updated = date("l, F j, Y", strtotime($me['updated_time']));

        echo "Hello " . $me['name'] . $me['picture'] . "<br />";
  echo "<div style=\"background:url(images/bg.jpg); width:760px; height:630px;\">" . "You last updated your profile on " . $updated . "</div>" . "<br /> your uid is" . $uid;

$me['picture'] 看起来无法工作,但我对图形api还很陌生,可能会犯一些非常业余的错误!

9个回答

125

如果我们知道用户ID,可以通过以下URL获取他们的个人资料图片:

http://graph.facebook.com/[UID]/picture

在这里,你需要将你的$uid变量放入[UID]的位置,然后将该URL传递给flash。


2
现在它似乎返回了一个重定向(302)响应,但是如果您跟随它,您将得到正确的图像。此外,您可以在URL中添加"?redirect=false"以获取包含图片最终URL的JSON响应。 - Gnomet
大家好,有人知道为什么从安卓设备调用时响应为空吗?我之前在我的应用程序中使用这个方法,但现在无法通过此方法获取图像。 - BSKANIA
还能用!如果你在使用Picasso,请确保使用https而不是http - xyz
已过时。现在需要使用OAuth。 - Yuki Matsukura
有没有办法找到大尺寸的个人资料图片? - user379888

81

为了获得不同的图片尺寸,您可以使用类型参数:

您可以通过type参数指定所需的图片大小,它应该是以下之一:square(50x50),small(50像素宽,高度可变)和large(大约200像素宽,高度可变):http://graph.facebook.com/squall3d/picture?type=large


谢谢!我似乎找不到这个信息,但我知道它是可能的! - Doug Molineux
2
更好的是,宽度/高度参数也可以使用,例如:width=140&height=140。 - Deepak Thomas

22

你可以通过提供以下参数来调整个人资料图片的大小。

https://graph.facebook.com/[UID]/picture?width=140&height=140

也可以起作用。


Facebook的文档 https://developers.facebook.com/docs/graph-api/reference/v2.1/user/picture 中提到,“当同时使用height和width参数时,图片会被缩放至最接近的尺寸,然后进行裁剪。”这是否意味着,当我请求150x150大小的图片时,他们会返回某个预定义的尺寸,比如123x123? - Dimitry K
1
实际上我自己找到了答案:当请求 /picture?width=450x450 时,我被重定向到图片:https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xap1/v/t1.0-1/c120.0.480.480/p480x480/10525666_10154418313275648_598202092662269872_n.jpg?somequerystring,这是一张 480x480 的图片。而当我请求 /picture?width=300&height=300 时,我被重定向到 https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xap1/v/t1.0-1/c80.0.320.320/p320x320/10525666_10154418313275648_598202092662269872_n.jpg,这是一张 320x320 的图片。所以你关于预定义尺寸的说法是正确的。 - Dimitry K

7
  //create the url
  $profile_pic =  "http://graph.facebook.com/".$uid."/picture";

 //echo the image out
 echo "<img src=\"" . $profile_pic . "\" />"; 

对我来说运行良好


4

1
这已经不再有效了 (#803) 无法通过用户名 (zuck) 查询用户 - Roni
1
@Roni 但是你仍然可以通过UID查询。对我来说,使用UID很有效。 - RredCat
1
@RredCat 我没有提到UID,只是用户名 - UID查询可能会长期有效。 - Roni
http://graph.facebook.com/[UID]/picture 可以使用!这个 API 调用次数有上限吗? - Darshan Chaudhary

3
这是对我有效的代码!
假设您已经有一个有效的会话,
//Get the current users id
$uid = $facebook->getUser();

//create the url
$profile_pic =  "http://graph.facebook.com/".$uid."/picture";

//echo the image out
echo "<img src=\"" . $profile_pic . "\" />";

感谢Raine,你太棒了!

1

我在使用CURL时遇到了获取个人资料照片的问题。我曾经认为我的Facebook API实现有问题,但后来发现需要在我的CURL中添加一些内容:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

1
一个非常重要的事情是,就像其他Graph API请求一样,你不会在响应中得到JSON数据,而是调用返回HTTP重定向到个人资料图片的URL。因此,如果您想获取URL,您需要读取响应HTTP头或使用FQLs。

-1

返回的数据是图像类型的二进制数据。如果您使用JavaScript检索用户照片,请在XMLHttpRequest中将照片数据作为blob类型获取,然后从响应中检索blob URL。供您参考:

 var request = new XMLHttpRequest;
 var photoUri=config.endpoints.graphApiUri + "/v1.0/me/photo/$value";
 request.open("GET",photoUri);
 request.setRequestHeader("Authorization","Bearer "+token);
 request.responseType = "blob";
 request.onload = function (){
        if(request.readyState == 4 && request.status == 200){
               var image = document.createElement("img");
               var url = window.URL || window.webkitURL;
               var blobUrl = url.createObjectURL(request.response);
               image.src = blobUrl;
               document.getElementById("UserShow").appendChild(image);
        }
 };
 request.send(null); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接