Сохранить изображение профиля в Facebook, используя cURL - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь сохранить изображение профиля пользователя на 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);

?>

Ответы [ 4 ]

7 голосов
/ 13 марта 2012

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

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

но если у вас безопасный режим, если он включен, то:

// 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);
2 голосов
/ 13 марта 2012

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

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

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

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

1 голос
/ 14 октября 2014

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

$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, так что это больше не вариант.

1 голос
/ 13 марта 2012

комплект

CURLOPT_FOLLOWLOCATION до истинного

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

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...