从图形API获取“真实”的Facebook个人资料图片URL

74

5
为什么你需要“真正”的那个? - dockeryZ
2
我可以直接保存URL并调用它,而不必进行API请求吗? - ericbae
1
你仍然可以直接调用它,它仍然可以正常工作。 - ufk
@ufk,但是当用户更改他的图片时,两者会给出不同的结果。 - Rana Deep
我意识到现在已经过去了10年(stackoverflow真是太神奇了!),但是该URL返回的是封面照片而不是用户的个人资料图片。 - Marcello Romani
12个回答

72
第一个URL会给出HTTP 302(临时重定向)到第二个URL。因此,为了在程序中找到第二个URL,您可以发出第一个URL的HTTP请求并获取响应的Location头。但是,请注意不要依赖第二个URL是永久的。阅读一下HTTP响应代码(302而不是永久301),Facebook可能会定期更改这些URL以防止人们使用他们的服务器来托管图像等内容。

编辑:注意,原帖中的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请求在客户端执行此操作。


2
很有道理。这正是我所期望的。感谢您的回复! - ericbae
2
如果你正在进行游戏排行榜,并且只想公开用户的个人资料图片而不是他们的用户ID,那么从服务器发送CDN URL是否有意义?我并不是说要依赖CDN,而是在服务器端进行调用以隐藏客户端的fbID详细信息。 - Russell Asher
如何避免图像文件下载?似乎图像URL返回200时,浏览器会下载它而不是显示它。可能是因为响应头是content-disposition: attachmentcontent-type: image/jpeg - loretoparisi

36

2
返回小图片的URL。 - Vaiden
7
同上 - 这返回小图片。 - slashwhatever
23
如果你真的想用这种方式获取它,那就使用https://graph.facebook.com/517267866/?fields=picture.type(large)。 - andi
1
@andi 你应该将这个作为一个单独的答案写出来:在我的情况下,特定的语法“fields=picture.type(large)”是我从Facebook获取JSON响应中大型个人资料图片URL的唯一解决方案。 - Visionscaper
<page_or_user_id>/picture?type=large 或 <page_or_user_id>?fields=picture.type(large) 都可以使用…但是返回的图片与我实际访问页面看到的个人资料图片完全不同。 - phpguru

16

我知道这有点晚了,但还有另一种方法可以获取个人资料图片的URL。

在原始的URL后面添加参数redirect=false,即可获取通常会被重定向到的实际图片的URL。

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

图片也将是您指定的尺寸。 您可以通过添加宽度和高度进行进一步测试:http://graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=400


7

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

我刚刚通过以下步骤获取了用户的Facebook照片:

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

其中'fbUserID'是Facebook用户的个人资料ID。

这样,我总是可以调用profilePicURL中的url来获取图像,并且我总是能够获得它,没有问题。如果您已经拥有用户ID,则不需要进行任何API请求,只需将该ID插入到facebook.com/后面的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的文档和“Scrumptious”示例)。

6

不确定对于每个图像对象都适用。在某些情况下,对于URL https://graph.facebook.com/XXXXX/picture?height=1024,浏览器将下载该图像而非显示它。有任何想法为什么会这样? - loretoparisi
我认为这取决于您正在使用的浏览器。但是,您可以在框架的任何图像组件(IOS、Android、HTTP Image等)中使用Facebook图像URL。 - Kasas

3
$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的问题并不重要,因为您是从原始URL动态调用URL。


2
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);

这里我只需要的答案是picture?type=large - 谢谢。 - pedromillers
这真是个“天赐之物”。我已经试图寻找如何做这件事好几天了,然后我在这里找到了答案。谢谢@TheDayIsDone。 - user801347

2

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

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

其中YOURTYPE可以是以下之一:small、normal、album、large、square。


2

针对Android:

根据最新的Facebook SDK,

首先您需要调用GraphRequest API来获取用户的所有详细信息,其中API还会提供当前个人资料图片的URL

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();

1

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