Как временно сохранить фотографию профиля в Facebook? - PullRequest
2 голосов
/ 02 мая 2011

Привет, ребята, я пытаюсь создать небольшое приложение, которое вытягивает изображение профиля пользователя, позволяет им манипулировать изображением, а затем публикует измененное изображение в альбом своих изображений профиля (в идеале, в качестве своего профиля, но я нене думаю, что это возможно ???).

Проблема, с которой я столкнулся, заключается в том, что используемый мной javascript для изменения изображения не будет работать, если только изображение не является локальным

, т.е.<img src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/[some_user_id].jpg" /> не будет работать, но <img src="img/image.jpg" /> будет ...

Есть ли способ достичь этого?

Метод, который я использую для получения пользовательской картинки, таков:

Для подключения к Facebook:

<?php
require_once 'library/facebook.php';

$app_id = "###";
$app_secret = "###";

$facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $app_secret,
    'cookie' => true
));

if(is_null($facebook->getUser()))
{
    header("Location:{$facebook->getLoginUrl(array('req_perms' => 'user_status,publish_stream,user_photos'))}");
    exit;
}

Затем отобразить изображение:

<?php

$aResponse = $facebook->api('/me', array(
    'fields' => 'picture',
    'type' => 'large'
));
echo "<img src='".$aResponse["picture"]."' />";
?>

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 02 мая 2011

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

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

интерфейс:

<img src="image_server.php?img=<?= urlencode($aResponse['picture']); ?>">

конец:

<?php
if (!empty($_GET['img']))
{
    //make sure this is a file on the facebook content delivery network
    //and not our /etc/passwd or database connection config, or something
    //else completely malicious.
    if (preg_match("#^https?://profile\.ak\.fbcdn\.net/#i", $_GET['img']))
    {
        $img_path = $_GET['img'];
    }
    else
    {
        //do something with someone that entered a bad image, probably just
        //display a "no image" image.
        die('bad user. bad.');
    }

    readfile($img_path);
    exit;
}
else
{
    //no image was specified. output an anonymous/no image image.
    die('an image file must be specified.');
}

Возможно, вы захотите немного сложнее, чем это ... но это основной смысл.

примечание: В коде php предполагается, что в вашем php.ini включены включенные обертки (поэтому вы можете включить веб-ссылки).

0 голосов
/ 04 декабря 2014
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

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/' . $fbid . '/picture?type=large';

    $file_handler = fopen('/img/avatar/'.$fbid.'.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);

// Happy Coding

0 голосов
/ 05 мая 2011

Спасибо Джиму за ваш ответ, я видел, как кто-то делал что-то очень похожее на это, но снова (только моя удача) у меня были проблемы с этим.Во всяком случае, мне удалось решить это так:

function save_image($inPath,$outPath)
{ //Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

// This is just pulling the user id to use for the filename
$id = $get_id['id'];

save_image($aResponse['picture'],'tmp/'.$id.'.jpg');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...