2012-03-13 2 views
0

Я пытаюсь сохранить изображение профиля пользователя на 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 перенаправляет браузер, изображение сохраняется без проблем. Что я здесь делаю неправильно?Сохранить изображение профиля facebook с помощью cURL

<?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); 

?>

+0

Это может помочь: http://stackoverflow.com/questions/5429964/how-to-save-users-profile-pic-in-facebook-using-php –

ответ

7

Существует редирект, так что вы должны добавить эту опцию для завитка

// safemode if off: 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

, но если у вас есть SafeMode если дальше, то:

// 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); 
+0

Спасибо за ваш ответ! Hovwewer, Кажется, это не работает для меня. Вероятно, я что-то напортачил. Я получаю эту ошибку: Предупреждение: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION не может быть активировано, когда safe_mode включен или открыт open_basedir в /home/web81206/domains/utvecklingtesttco.se/public_html/fb/index.php on line 83 Любые предложения? – user1009453

+0

darn. попробуйте эту функцию вместо этого: http://au.php.net/manual/ro/function.curl-setopt.php#71313 – deadrunk

+0

Нет, не могу заставить это работать, это довольно простая вещь, которую я хочу сделать, и все же я, похоже, не нашел никакого действительного кода.Какая странная вещь! Спасибо за вашу помощь! – user1009453

1

набор

CURLOPT_FOLLOWLOCATION истинной

так, что она следует за 301/302 перенаправления считывает файл изображения из конечного местоположения. т.е.

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
+0

Благодарим за ваш ответ! Hovwewer, Кажется, это не работает для меня. Вероятно, я что-то напортачил. Я получаю эту ошибку: Предупреждение: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION не может быть активировано, когда safe_mode включен или открыт open_basedir в /home/web81206/domains/utvecklingtesttco.se/public_html/fb/index.php в строке 83 – user1009453

+0

попробуйте вместо этого использовать 'file_get_contents', который будет выполнять эту роль автоматически. – DhruvPathak

2

Если вы можете не обрабатывайте перенаправление, попробуйте это вместо:

Задать вопрос https://graph.facebook.com/<USER ID>?fields=picture a nd проанализируйте ответ, который будет в формате JSON и будет выглядеть так: для Zuck вы получите такой ответ:

{ 
    "picture": "http://profile.ak.fbcdn.net/hprofile-ak-snc4/157340_4_3955636_q.jpg" 
} 

Затем сделайте свой локон запрос непосредственно, чтобы получить изображение с этого URL облако хранения

+0

Хорошо, я тоже попробую это решение, хотя мне было дано еще одно приятное решение от @deadrunk – user1009453

0

мне удалось сделать это таким образом, работает прекрасно:

$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), и вы можете указать ширину и высоту.

Вы можете также добавить «перенаправлять = ложь» в URL, чтобы получить объект JSON с URL (например:. https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpa1..)

CURLOPT_FOLLOWLOCATION был удален в PHP5.4, так подмигнули не действительно вариант больше.

Смежные вопросы