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

3

你好,我正在尝试创建一个应用程序,该应用程序在其中使用用户的个人资料图片。因此,我编写了一段代码,从 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个回答

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

}


如果例如Location:头不是响应的最后一行(完全可能),那么这个解决方案将非常脆弱。更好的方法是让CURL库正确解析头文件,正如下面所提到的,它甚至可以为您跟随重定向。 - IMSoP

2

尝试设置请求的用户代理标头。 Facebook和许多其他服务经常拒绝未设置用户代理的请求。

编辑:可以像这样完成:

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

编辑2: 关于重定向的部分也是正确的。要让cURL自动处理重定向,可以这样做:

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);

@user392406:已更新,请参见上面的示例。 - Kaivosukeltaja

0

听起来像是一个重定向。这些不能通过PHP处理,你需要找出图片的真实地址并使用GetImageFromUrl函数。


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

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