从图形 API 获取“真正的”Facebook ID 图片 URL

Facebook 图形 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 获取第二个 URL?

133834 次浏览

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

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


编辑: 注意 OP 发布的 CDN URL 现在是404,所以我们知道我们不能依赖 URL 是长期存在的。另外,如果您在 SSL 安全的页面上从 <img>链接到 GraphAPI,请确保使用 https://graph.facebook.com


更新: 该 API 具有 添加了一个参数 & nash; redirect=false & nash; 这会导致返回 JSON 而不是重定向。返回的 JSON 包括 CDN URL:

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

同样,我不会依赖这个 CDN URL 是长期存在的。JSON 响应是通过允许的 CORS 头发送的,因此您可以在客户端使用 XHR 请求进行此操作。

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

嗯. . 我尝试了所有的方法来获得用户图片的网址。完美的解决方案是像这样使用 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'];

用大图片代替原图片,得到其他想要的结果。 希望能帮上忙。

我知道这有点晚了,但是还有另外一种方法可以获得配置文件图像的 URL。

对于您的原始 URL,您可以添加参数 redirect=false来获得通常会被重定向到的图像的实际 URL。

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

图片也将是您指定的大小。您还可以通过添加维度 http://graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=400来进行测试

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

对于其他想在 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 的文档,以及“ Scrumpful”的例子)。

现在,Facebook 需要 SSL

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

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

身份证号码是你的 身份识别码

这是唯一有效的方法:

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

其中 你喜欢的类型可以是下列其中之一: 小的,普通的,相册的,大的,正方形的

安卓系统:

根据最新的 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();

如果你想要一个带有 URL 的高质量的个人资料图片的 JSON,你可以使用:

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

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

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

517267866 是上面一个例子的配置文件 ID

希望能帮上忙