如何使用PHP在Facebook中保存用户的个人资料照片

时间:2011-03-25 08:10:02

标签: php facebook

您好我正在尝试创建使用用户个人资料照片的应用程序。所以我编写代码从facebook上读取配置文件图片并将其保存在我的服务器上。我使用以下代码

function GetImageFromUrl($link){
   $ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch,CURLOPT_URL,$link);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
return $result;
}

$userpicpath = "http://graph.facebook.com/$uid/picture?type=normal";

$sourcecode = GetImageFromUrl($userpicpath);
$savefile = fopen("$uid-normal.jpg", "w"); //this is name of new file that i save
fwrite($savefile, $sourcecode);
fclose($savefile);

这里$ uid是用户的id。

上述代码无效。

但是当我在浏览器中复制$ userpicpath(即http://graph.facebook.com/ $ uid / picture?type = normal)并按回车键时,它会返回我在地址栏中的新图像路径,并向我显示我想要的正确图像。如果我将地址栏中的这个新路径传递给我的函数,它会保存我想要的图像文件。

为什么会这样?我是如何获得第二个图像路径并将其传递给程序中的函数。请帮助我。

感谢。

4 个答案:

答案 0 :(得分:3)

Facebook使用重定向允许在网站上轻松嵌入。它通过发送HTTP 302重定向头来实现此目的。由于我发现你使用的是CURL,我根据我在网上找到的指南编写了我的例子。我还发布了如何通过cURL发送用户代理。这是我的getFBResponse()函数,可以用来替换$ userpicpath的赋值。试试这个:$ userpicpath = getFBRedirect();

// Only calling the head
curl_setopt($ch, CURLOPT_HEADER, true); // header will be at output
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD'

$content = curl_exec ($ch);

// The response should be:
/*
HTTP/1.1 302 Found
Location: http://www.iana.org/domains/example/
*/
// So splitting on "Location: " should give an array of index 2, the URL you want being the second index (1)
$theUrl = split($content, "Location: ");
return $content[1];

}

答案 1 :(得分:2)

尝试为您的请求设置User-Agent标头。 FB和许多其他服务通常拒绝提供请求而没有设置User-Agent。

编辑:可以这样做:

curl_setopt($ch,CURLOPT_HTTPHEADER,array('User-Agent: AnythingYouLikeHere'));

编辑2:关于重定向的部分也是如此。要让cURL自动处理重定向处理,您可以执行以下操作:

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);

答案 2 :(得分:0)

听起来像是重定向。这些不能由PHP处理,您需要找出要使用的图片的真实地址GetImageFromUrl

答案 3 :(得分:0)

您可以通过设置CURLOPT_FOLLOWLOCATION选项告诉CURL遵循Facebook服务器返回的重定向;以下内容应符合要求:

function GetImageFromUrl($link) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_URL, $link);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    # ADDED LINE:
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    $result = curl_exec($ch);
    curl_close($ch);

    return $result;
}