从graphicsAPI获取“真实”的Facebook个人资料图片url

FacebookgraphicsAPI告诉我,我可以得到一个用户使用的个人资料图片

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

这工作正常。 但是,当您在浏览器中键入上述URL时,图像的实际地址是

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

如何以编程方式使用第一个URL?

第一个URL给第二个HTTP 302(临时redirect)。 因此,要编程查找第二个URL,可以为第一个URL发出HTTP请求,并获取响应的Location标题。

也就是说,不要依靠第二个URL是永久的。 稍微阅读一下HTTP响应代码(而不是一个永久的301),Facebook可能会定期更改这些URL,以防止人们使用他们的服务器来托pipe图像。


编辑:请注意,OP发布的CDNurl现在是404,所以我们知道我们不能依赖长期存在的URL。 此外,如果您从SSL保护页上的<img>链接到Graph API, 则必须添加一个参数 ,确保使用http s ://graph.facebook.com


更新: API 添加了一个参数 – redirect=false – 这会导致返回JSON而不是redirect。 重新生成的JSON包括CDN URL:

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

再次,我不会依赖这个长期存在的CDNurl。 JSON响应使用宽容的CORS标头发送,因此您可以自由地在XHR请求的客户端执行此操作。

我意识到这是晚,但有另一种方式来获取configuration文件图像的url。

对于原始url,您可以添加参数redirect=false以获取您通常redirect到的图像的实际URL。

所以,新的请求看起来像http://graph.facebook.com/517267866/picture?type=large&redirect=false 。 这将返回一个包含图片URL和布尔is_silhouette的JSON对象(如果图片是默认的Facebook图片,则为true)。

图片的大小也是你指定的大小。 您可以通过添加尺寸进行testing: http : //graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=400

对于想要在iOS中获取个人资料照片的其他人:

我只是这样做,以获得用户的Facebook图片:

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

其中“fbUserID”是Facebook用户的configuration文件ID。

这样,我总是可以在profilePicURL中调用url来获取图像,而且我总是可以得到它,没问题。 如果您已经拥有用户ID,则不需要任何API请求,只需在facebook.com/后将该ID粘贴到url中即可。

仅供参考谁需要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的文档和“可爱”的例子)。

如果您想要一个质量良好的个人资料图片的JSON与您可以使用的URL:

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

如果你只是需要图片使用它没有参数redirect:

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

517267866是以上示例之一的configuration文件ID。 把你需要的Facebook标识

我希望有帮助

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

这将返回你问的url,并通过Facebook更改url的问题并不重要,因为你是从原始的urldynamic调用url。

这是唯一真正有效的方法:

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

其中YOURTYPE可以是下列之一:小,正常,专辑,大,广场

对于Android:

根据最新的Facebook SDK,

首先,您需要调用GraphRequest API以获取其中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(); 
 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); 

现在,Facebook需要SSL

– >重要添加S,https – > https://graph.facebook.com/userId/?fields=picture&type=large

在2014年6月工作

嗯..我尝试了一切,以获得url的用户image.The完美的解决scheme是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_squarereplacepic来获得其他想要的结果。 希望它帮助….

 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是您的个人资料ID