您好我正在尝试创建使用用户个人资料照片的应用程序。所以我编写代码从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)并按回车键时,它会返回我在地址栏中的新图像路径,并向我显示我想要的正确图像。如果我将地址栏中的这个新路径传递给我的函数,它会保存我想要的图像文件。
为什么会这样?我是如何获得第二个图像路径并将其传递给程序中的函数。请帮助我。
感谢。
答案 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;
}