获取Facebook真实个人资料图片的URL

11
根据 Facebook 图形 API,我们可以通过以下方式请求用户的头像图片(示例): https://graph.facebook.com/1489686594/picture 由于这是公共信息,我们不需要任何令牌。
但是,前一个链接的实际图像 URL 是: http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg 如果您在浏览器中输入第一个链接,它将重定向到第二个链接。
是否有一种方法可以使用 PHP 获取完整的 URL(第二个链接),只知道第一个链接?
我有一个从 URL 获取图像以存储在数据库中的函数,但它只能在获取到完整图像 URL 时工作。
谢谢。

是的,你可以做到。http://w-shadow.com/blog/2008/07/05/how-to-get-redirect-url-in-php/ - Ben
哦,太棒了,非常感谢Ben,它完美地运行了。我正在使用它,这样当用户在我的网站上连接Facebook时,我可以获取他们的Facebook个人资料图片,并将其设置为默认图片。谢谢 :) - kire
@kire,Facebook开发者API是否为您提供了官方解决方案来完成此操作?我以前从未使用过它,但我认为他们有。经常在没有达成协议的情况下占用其他网站资源可能会导致IP封禁。 - Ben
@Ben,你说的“未经同意占用其他网站资源”是什么意思?你是说使用或改编别人分享的函数来帮助他人是不好的吗?我认为分享服务器端函数的人并不希望别人在使用和理解他的函数时必须征得他的同意... - kire
@kire,我不是指我给你的函数,而是指Facebook的资源。如果图像的来源不知道正在发生什么事情,那么热链接图像通常被视为一种不良做法和/或粗鲁行为。请阅读Facebook的服务条款和Facebook开发者条款,以确保您可以在不使用API的情况下执行此操作。 - Ben
@Ben 对不起,我误解了。我不会直接链接图片 :) 我只是试图为那些通过他们的Facebook账户连接的用户提供更加用户友好的体验。例如,不需要重新上传他们的照片。因此,他们的Facebook头像被复制到新网站上。当然,用户可以选择保留或不保留。我注意到一些应用程序也这样做,比如FriendFeed(尽管现在它属于Facebook :)) - kire
6个回答

20

kire 是正确的,但对于你的使用情况,以下解决方案更好:

    // get the headers from the source without downloading anything
    // there will be a location header wich redirects to the actual url
    // you may want to put some error handling here in case the connection cant be established etc...
    // the second parameter gives us an assoziative array and not jut a sequential list so we can right away extract the location header
    $headers = get_headers('https://graph.facebook.com/1489686594/picture',1);
    // just a precaution, check whether the header isset...
    if(isset($headers['Location'])) {
        $url = $headers['Location']; // string
    } else {
        $url = false; // nothing there? .. weird, but okay!
    }
    // $url contains now the url of the profile picture, but be careful it might very well be only temporary! there's a reason why facebok does it this way ;)
    // the code is untested!

请考虑添加有关通过Facebook Graph API获取JSON位置信息的信息。 - Samveen

7
您可以使用FQL获取它:
select pic_square from user where uid=1489686594

返回:

[
  {
    "pic_square": "http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg"
  }
]

此外,您可以改进通过URL获取图片的功能。如果使用curl,它可以自动跟随重定向标头。


我尝试了类似的解决方案,但是Facebook的"pic_square"属性返回的是50px*50px的大小,在我的情况下,我需要稍微大一点才能不失去质量。我只能通过请求这个表单来使用图形API完成:https://graph.facebook.com/xxxxxxxxx/picture?type=large但是非常感谢,现在得到了一个好的解决方案。 - kire
3
@kire,这里提供了4张不同的图片,请选择您需要的:http://developers.facebook.com/docs/reference/fql/user - serg
哦,是的,没找到那个页面!现在我的问题是要知道是更好地请求Graph API URL并获取真实图片URL,还是使用FQL。也许第一种解决方案对我来说会更简单,因为我可以将其添加到我的Facebook类中,并在需要时随时调用它,而不需要任何JavaScript之类的东西。你们真的很擅长你们所做的事情 :) - kire
抱歉,我可以通过查询此页面获得相同的结果:https://api.facebook.com/method/fql.query?query=SELECT pic_big FROM user WHERE uid = 1489686594嗯,看起来更简单了... - kire
@kire,我喜欢Facebook上有人实际使用“xxxxxxxxx”作为用户名,而你的示例链接解析到了他的个人资料图片。 - apfelbox

2

@The Surrican,
代码很棒!这里有一个干净简洁的代码函数可以用于此过程!

function get_raw_facebook_avatar_url($uid)
{
    $array = get_headers('https://graph.facebook.com/'.$uid.'/picture?type=large', 1);
    return (isset($array['Location']) ? $array['Location'] : FALSE);
}

这将返回原始的Facebook头像图片URL。随意使用它!

2
请注意,Surrican的答案(可能还有其他人)会极大地增加您的脚本响应时间(对于我的服务器来说大约增加了500毫秒)。这是因为服务器会向Facebook发出请求(因为使用了get_headers()),而执行时间(不包括计算时间)从以下时间延长:
  • 浏览器 -> 服务器
  • 服务器 -> 浏览器
到以下时间:
  • 浏览器 -> 服务器
  • 服务器 -> Facebook(请求:get_headers)
  • Facebook -> 服务器(响应:get_headers)
  • 服务器 -> 浏览器
这会增加500毫秒的延迟。您可能应该考虑在服务器上缓存真实的URL或通过JavaScript加载个人资料图片。至少在之前和之后查看您的响应时间;)

1
关于响应时间的观察非常棒。结合Graph API的JSON结果,JavaScript绝对是最好的答案。 - Samveen

0

0

您可以使用以下的iframe将图像嵌入到您的页面中:

<iframe src="https://graph.facebook.com/<username>/picture"> </iframe> 

将“username”替换为个人资料的用户名。


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