Привет, я пытаюсь создать приложение, использующее в нем профиль пользователя. Поэтому я пишу код, который читает профиль pic из 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 – это идентификатор пользователя.
Вышеприведенный код работает неправильно.
Но когда я копирую $ userpicpath (т.е. http://graph.facebook.com/ $ uid / picture? Type = normal) в браузере и нажимаю Enter, он вернет мне новый путь к изображению в адресной строке и покажет мне правильный образ, который Я хочу. Если я передал этот новый путь в адресной строке моей функции, он сохранит файл изображения, который я хочу.
Почему это происходит? Как получить второй путь изображения и передать его моей функции в программе. Пожалуйста помогите.
Благодарю.
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];
}
Попробуйте настроить заголовок User-Agent для вашего запроса. FB и многие другие службы часто отказываются обслуживать запрос без набора User-Agent.
EDIT: Это можно сделать так:
curl_setopt($ch,CURLOPT_HTTPHEADER,array('User-Agent: AnythingYouLikeHere'));
РЕДАКТИРОВАТЬ 2: Также включена часть о перенаправлении. Чтобы cURL автоматически выполнял обработку перенаправления, вы можете сделать это:
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
Звучит как перенаправление. С помощью PHP нельзя обрабатывать реальный адрес картинки, используя GetImageFromUrl
Вы можете сообщить CURLOPT_FOLLOWLOCATION
о CURLOPT_FOLLOWLOCATION
перенаправлении, возвращенном сервером Facebook, установив параметр CURLOPT_FOLLOWLOCATION
; нижеследующее должно работать по желанию:
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; }