Я пытаюсь сохранить изображение профиля пользователя на facebook с помощью CURL. Когда я использую приведенный ниже код, я сохраняю jpeg-образ, но в нем есть нулевые байты. Но если я обмениваю значение url на https://fbcdn-profile-a.akamaihd.net/hprofile-ak-snc4/211398_812269356_2295463_n.jpg , где находится http://graph.facebook.com/ '. $ user_id. '/ picture? type = large перенаправляет браузер, изображение сохраняется без проблем. Что я здесь делаю неправильно?
<?php $url = 'http://graph.facebook.com/' . $user_id . '/picture?type=large'; $file_handler = fopen('pic_facebook.jpg', 'w'); $curl = curl_init($url); curl_setopt($curl, CURLOPT_FILE, $file_handler); curl_setopt($curl, CURLOPT_HEADER, false); curl_exec($curl); curl_close($curl); fclose($file_handler);
?>
Существует перенаправление, поэтому вам нужно добавить этот параметр для завивки
// safemode if off: curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
но если у вас есть safemode if on, тогда:
// safemode if on: <?php function curl_redir_exec($ch) { static $curl_loops = 0; static $curl_max_loops = 20; if ($curl_loops++ >= $curl_max_loops) { $curl_loops = 0; return FALSE; } curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); @list($header, $data) = @explode("\n\n", $data, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) { $matches = array(); preg_match('/Location:(.*?)\n/', $header, $matches); $url = @parse_url(trim(array_pop($matches))); if (!$url) { //couldn't process the url to redirect to $curl_loops = 0; return $data; } $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)); if (!$url['scheme']) $url['scheme'] = $last_url['scheme']; if (!$url['host']) $url['host'] = $last_url['host']; if (!$url['path']) $url['path'] = $last_url['path']; $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . (@$url['query']?'?'.$url['query']:''); return $new_url; } else { $curl_loops=0; return $data; } } function get_right_url($url) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); return curl_redir_exec($curl); } $url = 'http://graph.facebook.com/' . $user_id . '/picture?type=large'; $file_handler = fopen('pic_facebook.jpg', 'w'); $curl = curl_init(get_right_url($url)); curl_setopt($curl, CURLOPT_FILE, $file_handler); curl_setopt($curl, CURLOPT_HEADER, false); curl_exec($curl); curl_close($curl); fclose($file_handler);
Если вы не можете обработать перенаправление, попробуйте это вместо:
Сделайте запрос на https://graph.facebook.com/<USER ID>?fields=picture
и проанализируйте ответ, который будет в формате JSON и будет выглядеть следующим образом: например, для Zuck вы получите этот ответ:
{ "picture": "http://img.ruphp.com/php/157340_4_3955636_q.jpg" }
Затем сделайте свой запрос на завивание напрямую, чтобы получить изображение с этого URL облачного хранилища
задавать
CURLOPT_FOLLOWLOCATION
– true
так что он следует 301/302 перенаправить чтение файла изображения из конечного местоположения. т.е.
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
Мне удалось это сделать, прекрасно работает:
$data = file_get_contents('https://graph.facebook.com/[App-Scoped-ID]/picture?width=378&height=378&access_token=[Access-Token]'); $file = fopen('fbphoto.jpg', 'w+'); fputs($file, $data); fclose($file);
Вам просто нужен токен доступа к приложениям (APPID. '|'. APPSECRET), и вы можете указать ширину и высоту.
Вы также можете добавить «redirect = false» к URL-адресу, чтобы получить объект JSON с URL-адресом (например: https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpa1 … )
CURLOPT_FOLLOWLOCATION
было удалено в PHP5.4, так что это уже не вариант.