0

ユーザーのプロフィール写真の直接リンクが欲しい

私は次のコードを持っています

    $img = file_get_contents("https://graph.facebook.com/" . $fid . "/picture?type=large");
    $file = dirname(__file__). "/" . $fid . ".jpg";
    file_put_contents($file, $img);

しかしhttps://graph.facebook.com/" . $fid . "/picture?type=large、リダイレクトがあります。リダイレクトをたどるにはどうすればよいですか? file_get_contents 経由でそれを行う方法はありますか? 私はそれを介してそれを行うことができることを知っていますが、それはcurl複雑に思えます。オンになっているエラーが発生し、safe_modeそれをオフにする方法がわかりません。

ありがとうございます

4

4 に答える 4

1

HTTP コンテキスト オプションを 1 に$context設定する 3 番目のパラメータを指定することで、file_get_contents でリダイレクトを追跡できるはずです。 follow_location

(ただし、これはすでにデフォルトになっているはずですが、私のテストでは、画像データの取得はすでに file_get_contents だけで機能していました。)

于 2012-09-14T14:54:16.160 に答える
1

彼女は私が使用しているコードであり、私にとって完璧に機能します。また、写真をサーバーに保存するので、ローカル URL を取得できます (同じユーザーのプロファイルに戻すか、別のユーザー/ページ/イベント/などのウォールに投稿できます)。 $user に値があり、問題なく動作するはずのコード内です。

<?
$uid = $user;


function GetTheImage($linky) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_URL, $linky);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    # ADDED LINE:
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}



$userpicture = "http://graph.facebook.com/$uid/picture?type=large";

$sourceurl = GetTheImage($userpicture);

$save = fopen("/home/arose/public_html/mydomain.com/tmp/$uid-large.jpg", "w"); //this is name of new file that i save
fwrite($save, $sourceurl);
fclose($save);

?>

<html>
<head>


</head>
<body>

<img src="./tmp/<? echo $uid; ?>-large.jpg" />

</body>
</html>
于 2012-09-15T15:06:59.803 に答える
0
        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);
于 2014-12-04T14:48:55.903 に答える