Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获得;“真正的”;来自graph API的Facebook个人资料图片URL_Facebook_Image_Profile - Fatal编程技术网

获得;“真正的”;来自graph API的Facebook个人资料图片URL

获得;“真正的”;来自graph API的Facebook个人资料图片URL,facebook,image,profile,Facebook,Image,Profile,Facebook graph API告诉我,我可以使用 这很好用。但是,在浏览器中键入上述URL时,图像的实际地址是 如何以编程方式使用第一个URL获取第二个URL?第一个URL向第二个URL提供HTTP 302(临时重定向)。因此,要以编程方式查找第二个URL,您可以对第一个URL发出HTTP请求,并获取响应的位置头 也就是说,不要依赖第二个URL是pemanent。稍微读懂HTTP响应代码(302而不是永久的301),Facebook可能会定期更改这些URL,以防止人们使用服务器托管图像

Facebook graph API告诉我,我可以使用

这很好用。但是,在浏览器中键入上述URL时,图像的实际地址是


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

第一个URL向第二个URL提供HTTP 302(临时重定向)。因此,要以编程方式查找第二个URL,您可以对第一个URL发出HTTP请求,并获取响应的
位置

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


编辑:请注意,OP发布的CDN URL现在是404,因此我们知道我们不能依赖URL的长寿命。此外,如果要从SSL安全页面上的
链接到Graph API,则必须添加并确保使用
https://graph.facebook.com


更新:API具有–
重定向=false
–这会导致返回JSON而不是重定向。重新运行的JSON包括CDN URL:

{
   "data": {
      "url": "http://profile.ak.fbcdn.net/...",
      "is_silhouette": false
   }
}
再说一次,我不会相信这个CDN URL是长期存在的。JSON响应是通过允许的CORS头发送的,因此您可以通过XHR请求在客户端执行此操作。

将返回JSON格式的URL

$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。

Hmm。我尝试了所有方法来获取用户图像的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替换为大的pic_正方形,以获得其他所需的结果。
希望它能有所帮助……

我意识到这已经很晚了,但还有另一种方法可以获取个人资料图像的URL

在原始url中,可以添加参数
redirect=false
,以获取通常重定向到的图像的实际url

因此,新请求看起来像。这将返回一个JSON对象,其中包含图片的URL和布尔值is_轮廓(如果图片是默认的Facebook图片,则为true)


图片也将是您指定的大小。您还可以通过添加维度来测试这一点:

对于任何希望在iOS中获取配置文件pic的人:

我这样做只是为了得到用户的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;
         }
     }];
}
if(FBSession.activeSession.isOpen){
[[FBRequest requestForMe]startWithCompletionHandler:
^(FBRequestConnection*连接,
NSDictionary*用户,
N错误*错误){
如果(!错误){
self.userName=user.name;
self.fbUserID=user.id;
}
}];
}

你需要一个活跃的FBSession(见Facebook的文档和“美味”的例子)。

现在,Facebook需要SSL

->重要的附加服务,https->

2014年6月的工程

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之一,这是唯一真正有效的:

me?fields=picture.type(*YOURTYPE*)
其中,您的类型可以是以下类型之一:
小的、普通的、相册的、大的、正方形的

适用于Android:

根据最新的Facebook SDK

首先,您需要调用
graphrequestapi
以获取用户的所有详细信息,其中
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();

如果您希望JSON具有高质量的配置文件图片和URL,您可以使用:

如果您只需要图片,请在不使用参数重定向的情况下使用:

517267866是上述示例之一的配置文件ID。输入您需要的facebook id


我希望这有帮助

为什么您需要“真实”的URL?这样我就可以保存URL并直接调用它,而无需发出API请求?您仍然可以直接调用它。还是会的work@ufk,但当用户更改图片时,两者都会给出不同的结果。我意识到这是10年后的事了(stackoverflow有多神奇?)。这是我所期望的。谢谢你的回复!如果你在做游戏排行榜,只想公开用户档案图片而不是用户ID,那么从服务器发送cdn URL有意义吗?我不是说依赖CDN,而是让呼叫服务器端对客户端隐藏fbID详细信息。如何避免图像文件下载?返回200时,图像url似乎由浏览器下载而不是显示。可能是因为响应标题是
内容处置:附件
内容类型:image/jpeg
。返回小图片URL。同上-这返回小图片如果您真的想用这种方式获取它,请使用@andi。您应该将其作为单独的答案编写:特定语法的“fields=picture.type(大)'是我从Facebook获取大型个人资料图像的URL作为JSON响应的唯一解决方案。/picture?type=large或?fields=picture.type(large)这两种方法都适用于我。。。但是返回的图像与我实际访问页面时看到的个人资料图像完全不同。picture?type=large是我在这里需要的唯一答案-谢谢。这是“上帝赐予的”。我已经试了好几天了,然后我在这里找到了答案。谢谢@TheDay不确定这是否适用于每个图形图像对象。在某些情况下
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();