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


74

Facebook graph 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?


5
为什么您需要“真正的”

2
这样,我可以保存URL并直接调用它,而无需发出API请求?
ericbae 2010年

1
您仍然可以直接调用它。它仍然可以工作
ufk 2011年

@ufk,但是当用户更改其图片时,两者都会给出不同的结果。
Rana Deep

我意识到这已经是10年了(stackoverflow到底有多神奇?),但是URL返回的是封面照片,而不是用户的个人资料照片。
Marcello Romani

Answers:


72

第一个URL将HTTP 302(临时重定向)提供给第二个URL。因此,要以编程方式找到第二个URL,可以对第一个URL发出HTTP请求并获取Location响应的标头。

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


编辑:请注意,OP发布的CDN URL现在是404,因此我们知道我们不能依靠URL长期存在。另外,如果您要从<img>SSL安全页面上的链接到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 2010年

1
如果您正在做游戏排行榜,并且只想公开用户个人资料图片而不是他们的用户ID,从服务器发送cdn url是否有意义?我并不是说要依靠CDN,而是要使呼叫服务器端从客户端隐藏fbID详细信息。
罗素·阿舍

如何避免图片文件下载?图像URL似乎在返回200时由浏览器下载而不显示。可能是因为响应标头是content-disposition: attachmentcontent-type: image/jpeg
loretoparisi

36

2
返回小图片网址。
Vaiden

7
同上-这会返回较小的图像
斜线表示“ 2012年

23
如果您真的想以这种方式获取它,请使用graph.facebook.com/517267866/?fields=picture.type(large)–
andi

1
@andi您应该将其写成一个单独的答案:特定语法'fields = picture.type(large)'是我从Facebook获得大配置文件图像的URL作为JSON响应的唯一解决方案。
Visionscaper

<page_or_user_id> / picture?type = large或<page_or_user_id>?fields = picture.type(large)都对我有用...但是返回的图像与个人资料图像完全不同,我是否真正访问过该页面。
phpguru

16

我意识到这已经晚了,但是还有另一种获取个人资料图片网址的方法。

在原始网址中,您可以添加参数redirect=false以获得通常重定向到的图片的实际网址。

因此,新请求看起来像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的高质量个人资料图片的JSON,可以使用:

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

如果只需要图片,则不带参数重定向即可使用它:

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

517267866是以上示例之一的配置文件ID。放入您需要的Facebook ID

希望对您有所帮助


不知道这是否适用于每个Graph图像对象。在某些情况下,对于URL https://graph.facebook.com/XXXXX/picture?height=1024,浏览器将下载图像而不显示图像。知道为什么吗?
loretoparisi

我认为这取决于您使用的浏览器。但是,您可以在框架的任何图像组件(IOS,Android,HTTP图像...)中使用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

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

1
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 2013年

这是“上帝发送”。我已经尝试了几天了,然后在这里找到了答案。感谢@TheDayIsDone
user801347


0

嗯..i尝试了一切以获取用户图像的网址。完美的解决方案是像这样使用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
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之一

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.