获得;“真正的”;来自graph API的Facebook个人资料图片URL
Facebook graph API告诉我,我可以使用 这很好用。但是,在浏览器中键入上述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,以防止人们使用服务器托管图像
如何以编程方式使用第一个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();