Facebook API-Facebook APIを介してFacebookユーザーのプロフィール画像を取得するには(ユーザーにアプリケーションの「許可」を要求せずに)


257

FacebookのURL(つまり、http://facebook.com/users_unique_url)からユーザーのプロフィール画像を取得するCMSに取り組んでいます。どうすればこれを達成できますか?ユーザーがアプリケーションを許可する必要なく、ユーザーのプロフィール画像のURLをフェッチするFaceboook API呼び出しはありますか?

回答:


409

このURLからデータを取得するだけです。

http://graph.facebook.com/userid_here/picture

userid_here写真を取得したいユーザーのIDに置き換えます。HTTPSを使用することもできます。

PHPのfile_get_contents関数を使用してそのURLを読み取り、取得したデータを処理できます。

資源:

http://developers.facebook.com/docs/api

注:ではphp.ini、PHP の関数を使用してそのURLを読み取るには、OpenSSL拡張機能が有効になっていることを確認する必要がありfile_get_contentsます。


73
そのページをさらに詳しく見てみると、?type=large追加できるクエリ文字列がもう1つの便利なものになるでしょう。ちなみに、私が入力していた画面のスクレイピングよりもはるかに優れた答えを出すための小道具、BTW :)。
ドメニック

6
<img src="//graph.facebook.com/sarfraz.anees/picture" />HTTPとHTTPSを切り替える場合に使用します...プロトコルはブラウザーによって検出され、HTTPSで混合コンテンツの警告は表示されません。
クリスジェイコブ

39
強調する必要があります。一部のユーザーは、FBアカウントにユーザー名を設定していません。この場合、この回答を実装しようとすると、FBのデフォルトのプロフィール写真である疑問符が表示されます。この問題を簡単に回避するには、代わりにユーザーのFB IDを使用します。
Josh

7
グラフAPIのV2では、これはユーザー名を使用して機能しないことに注意してください。したがって、最初にユーザーIDが必要になり、ユーザー名を使用してこれを取得することはできなくなりました。ユーザーIDもアプリごとに変化するため、使用できるユーザーIDを取得するには、何らかの適切な認証が必要になります。技術的には、プロファイルの写真はまだ公開されており、graph.facebook.com / v2.2 / 4 / picture?redirect = 0で入手できますが、ユーザーのプロファイルだけに基づいてユーザーID(前のリンクの4)を特定することは不可能のようです。古いグラフのURLはまだ2015年4月まで働く
SCKD

36
それは2015年であり、私は取得しています(#803)ユーザー名(sarfraz.anees)でユーザーをクエリできません
Santosh Kumar

268

表示するには:

50x50ピクセル

<img src="//graph.facebook.com/{{fid}}/picture">

幅200ピクセル

<img src="//graph.facebook.com/{{fid}}/picture?type=large">

保存するには(PHPを使用)

注:これは使用しないでください。以下の@Foreeverのコメントを参照してください。

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

$ fidはFacebookのユーザーIDです。

注:「18+」とマークされた画像の場合、18 +ユーザーからの有効なaccess_tokenが必要になります。

<img src="//graph.facebook.com/{{fid}}/picture?access_token={{access_token}}">

2015年更新:

ユーザー名を使用してGraph API v2.0をクエリすることはできません。常に使用する必要がありますuserId


6
typeパラメータの詳細は次のとおりです。「type引数で必要な画像サイズを指定できます。これは、正方形(50x50)、小(幅50ピクセル、高さ可変)、標準(幅100ピクセル、高さ可変)のいずれかである必要があります。 )、そして大きい(幅約200ピクセル、高さは可変) " FacebookのGraph API

3
このメソッドを使用するには、allow_url_fopenをonに設定する必要があります。allow_url_fopenディレクティブはデフォルトで無効になっています。allow_url_fopenディレクティブを有効にすることによるセキュリティへの影響を認識する必要があります。リモートファイルにアクセスできるPHPスクリプトは、任意のコードインジェクションに対して潜在的に脆弱です。allow_url_fopenディレクティブを有効にすると、リモートファイルをローカルファイルのように開くスクリプトを作成できます。
Foreever

便利そうに見えるので、前もって乾杯しますが、理解するには1レベルが新しすぎるので、これがどのプログラミング言語にあるのか知りたいですか?私の推測ではPHPです。
hello_there_andy 2014

@hello_there_andyうん!それはPHPです(実際、質問にはPHPのタグが付けられており、それは私が4年前に使用した唯一の言語でした)
neiker

7
2015年7月、これは機能しなくなりました(エラー:「ユーザー名でユーザーをクエリできません」)
Flimm

164

更新

2012年8月末から、APIが更新され、さまざまなサイズのユーザーのプロフィール写真を取得できるようになりました。オプションの幅と高さのフィールドをURLパラメータとして追加します。

https://graph.facebook.com/USER_ID/picture?width=WIDTH&height=HEIGHT

どこWIDTHHEIGHTディメンション値を要求しています。

これにより、アスペクト比を維持しようとするWIDTHときに、最小サイズxのプロフィール写真が返さHEIGHTれます。例えば、

https://graph.facebook.com/redbull/picture?width=140&height=110

戻り値

    {
      "data": {
        "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/s148x148/2624_134501175351_4831452_a.jpg",
        "width": 148,
        "height": 117,
        "is_silhouette": false
      }
   }

更新を終了

ユーザーのプロフィール写真を取得するには、

https://graph.facebook.com/USER_ID/picture

ここUSER_IDで、ユーザーID番号またはユーザー名を指定できます。

特定のサイズのユーザープロフィール写真を取得するには、

https://graph.facebook.com/USER_ID/picture?type=SIZE

どこSIZEの単語に置き換える必要があります

square
small
normal
large

あなたが望むサイズに応じて。

この呼び出しは、選択したタイプパラメータに基づいたサイズの単一の画像へのURLを返します。

例えば:

https://graph.facebook.com/USER_ID/picture?type=small

画像の小さいバージョンへのURLを返します。

APIは、実際のサイズではなく、プロファイル画像の最大サイズのみを指定します。

平方:

幅と高さの最大値は50ピクセルです。

小さい

最大幅50ピクセル、最大高さ150ピクセル。

正常

最大幅100ピクセル、最大高さ300ピクセル。

最大幅200ピクセル、最大高さ600ピクセル。

デフォルトのUSER_ID / pictureを呼び出すと、正方形のタイプになります。

明確化

呼び出す場合(上記の例のように)

https://graph.facebook.com/redbull/picture?width=140&height=110

Facebook SDKリクエストメソッドの1つを使用している場合はJSONレスポンスを返します。それ以外の場合は、画像自体を返します。常にJSONを取得するには、以下を追加します。

&redirect=false

そのようです:

https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false

すばらしい説明ですが、指定したURLの戻り値( ' graph.facebook.com/redbull/…)は、ロケーションヘッダー(' Location:fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/…)。{"data":{"url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/… "、 "width":148、 "height"のようなJSONではない:117、 "is_silhouette":偽}}
グーカン・バリスアーカー

それでも私の回答と同じ応答が得られます。Facebookデベロッパーのグラフエクスプローラーのdeveloper.facebook.com/tools/explorerで試すことができます。「redbull / picture?width = 140&height = 110」と入力して、応答を確認します。私の答えは、JSON応答を返すFacebook SDK API /リクエストメソッドの1つを使用してこれを呼び出すことを想定しています。
Gunnar Karlsson 2012

2
@GunnarKarlssonあなたは&redirect=false画像にリダイレクトする代わりにJSONデータを返すために欠落しています
andrewtweber

@andrewtweberに感謝します。回答に説明を追加しました。
Gunnar Karlsson 2013年

3
2015年7月になり、現在は機能していません。(エラー:「ユーザー名でユーザーを照会することはできません」)
Flimm

20

バイナリコンテンツではなく、画像のURLを取得するには:

$url = "http://graph.facebook.com/$fbId/picture?type=$size";

$headers = get_headers($url, 1);

if( isset($headers['Location']) )
    echo $headers['Location']; // string
else
    echo "ERROR";

ユーザー名ではなく、FACEBOOK IDを使用する必要があります。Facebook IDはそこで取得できます。

http://findmyfbid.com/


1
2015年7月で、これは機能しません(エラー:「ユーザー名でユーザーを照会できません」)
Flimm

3
間違った友達になりました:)ユーザー名findmyfbid.com
NaturalBornCamper

1
ここの最高。間違いなくクレイジーです。データを本文で取得しようとすると、データがヘッダー@。@に表示されます
Davuz

19

フルサイズのプロファイル画像をサーバーに保存する簡単な1行のコード。

<?php

copy("https://graph.facebook.com/FACEBOOKID/picture?width=9999&height=9999", "picture.jpg");

?>

これは、phps.iniでopensslが有効になっている場合にのみ機能します。


2015年7月で、これは機能しません(エラー:「ユーザー名でユーザーを照会できません」)
Flimm

はい、v1.0の通話は2015年4月30日以降は機能しなくなります。ユーザーがアプリを承認しない限り、アプリ固有のIDを取得できません
Armand

10

受け入れられた回答へのコメントとしてこれを追加しましたが、より長い説明に値すると感じました。2015年4月頃から、これはおそらく数回引き上げられます。

グラフAPIのV2以降、受け入れられた回答はユーザー名を使用して機能しなくなりました。したがって、最初にユーザーIDが必要になり、ユーザー名を使用してこれを取得することはできなくなりました。さらに複雑なことに、プライバシー上の理由から、FacebookはアプリごとにユーザーIDを変更していますhttps://developers.facebook.com/docs/graph-api/reference/v2.2/user/およびhttps://developers.facebookを参照).com / docs / apps / upgrading /#upgrading_v2_0_user_ids)、そのため、使用できるユーザーIDを取得するには、何らかの適切な認証が必要になります。技術的には、プロフィール写真はまだ公開されており、/ userid / pictureで入手できます(https://developers.facebook.com/docs/graph-api/reference/v2.0/user/pictureのドキュメントと、このサンプルユーザーのhttp:を参照してください: //graph.facebook.com/v2.2/4/picture?redirect=0)ただし、ユーザーの標準のユーザーIDをプロファイルに基づいて把握することは不可能に思われます。私のユースケースでは(FBプロファイルのリンクの横にプロファイルの写真を表示するだけ)やりすぎであるアプリとの対話をアプリに承認させる必要があります。

誰かがユーザー名に基づいてプロフィール写真を取得する方法を見つけた場合、または代わりに、プロフィール写真を取得するために使用するユーザーID(代替の場合でも)を取得する方法を見つけたら、共有してください!それまでの間、古いグラフのURLは2015年4月まで機能します。


9

1つの方法は、彼の回答に投稿されたGamletコードを使用することです。

  • 名前を付けて保存 curl.php

  • 次に、ファイルで:

    require 'curl.php';
    
    $photo="https://graph.facebook.com/me/picture?access_token=" . $session['access_token'];
    $sample = new sfFacebookPhoto;
    $thephotoURL = $sample->getRealUrl($photo);
    echo $thephotoURL;

詳細を理解するのに少し時間がかかったので、これを投稿すると思いました...プロフィール写真は公開されていますが、カールするときに取得するにはアクセストークンが必要です。


8

それを行う方法があります;)

" http://it.toolbox.com/wiki/index.php/Use_curl_from_PHP_-_processing_response_headers "に感謝します

<?php

    /**
     * Facebook user photo downloader
     */

    class sfFacebookPhoto {

        private $useragent = 'Loximi sfFacebookPhoto PHP5 (cURL)';
        private $curl = null;
        private $response_meta_info = array();
        private $header = array(
                "Accept-Encoding: gzip,deflate",
                "Accept-Charset: utf-8;q=0.7,*;q=0.7",
                "Connection: close"
            );

        public function __construct() {
            $this->curl = curl_init();
            register_shutdown_function(array($this, 'shutdown'));
        }

        /**
         * Get the real URL for the picture to use after
         */
        public function getRealUrl($photoLink) {
            curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header);
            curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, false);
            curl_setopt($this->curl, CURLOPT_HEADER, false);
            curl_setopt($this->curl, CURLOPT_USERAGENT, $this->useragent);
            curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($this->curl, CURLOPT_TIMEOUT, 15);
            curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
            curl_setopt($this->curl, CURLOPT_URL, $photoLink);

            //This assumes your code is into a class method, and
            //uses $this->readHeader as the callback function.
            curl_setopt($this->curl, CURLOPT_HEADERFUNCTION, array(&$this, 'readHeader'));
            $response = curl_exec($this->curl);
            if (!curl_errno($this->curl)) {
                $info = curl_getinfo($this->curl);
                var_dump($info);
                if ($info["http_code"] == 302) {
                    $headers = $this->getHeaders();
                    if (isset($headers['fileUrl'])) {
                        return $headers['fileUrl'];
                    }
                }
            }
            return false;
        }


        /**
         * Download Facebook user photo
         *
         */
        public function download($fileName) {
            curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header);
            curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($this->curl, CURLOPT_HEADER, false);
            curl_setopt($this->curl, CURLOPT_USERAGENT, $this->useragent);
            curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($this->curl, CURLOPT_TIMEOUT, 15);
            curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
            curl_setopt($this->curl, CURLOPT_URL, $fileName);
            $response = curl_exec($this->curl);
            $return = false;
            if (!curl_errno($this->curl)) {
                $parts = explode('.', $fileName);
                $ext = array_pop($parts);
                $return = sfConfig::get('sf_upload_dir') . '/tmp/' . uniqid('fbphoto') . '.' . $ext;
                file_put_contents($return, $response);
            }
            return $return;
        }

        /**
         * cURL callback function for reading and processing headers.
         * Override this for your needs.
         *
         * @param object $ch
         * @param string $header
         * @return integer
         */
        private function readHeader($ch, $header) {

            //Extracting example data: filename from header field Content-Disposition
            $filename = $this->extractCustomHeader('Location: ', '\n', $header);
            if ($filename) {
                $this->response_meta_info['fileUrl'] = trim($filename);
            }
            return strlen($header);
        }

        private function extractCustomHeader($start, $end, $header) {
            $pattern = '/'. $start .'(.*?)'. $end .'/';
            if (preg_match($pattern, $header, $result)) {
                return $result[1];
            }
            else {
                return false;
            }
        }

        public function getHeaders() {
            return $this->response_meta_info;
        }

        /**
         * Cleanup resources
         */
        public function shutdown() {
            if($this->curl) {
                curl_close($this->curl);
            }
        }
    }

8

2015年4月のPHP(HTTP GET)ソリューション(PHP 5 SDKなし):

function get_facebook_user_avatar($fbId){
        $json = file_get_contents('https://graph.facebook.com/v2.5/'.$fbId.'/picture?type=large&redirect=false');
        $picture = json_decode($json, true);
        return $picture['data']['url'];
}

パラメータで「タイプ」を変更できます:

平方:

幅と高さの最大値は50ピクセルです。

小さい

最大幅50ピクセル、最大高さ150ピクセル。

正常

最大幅100ピクセル、最大高さ300ピクセル。

最大幅200ピクセル、最大高さ600ピクセル。


7

IDは便利なツールになると思いました。ユーザーが新しいアカウントを作成するたびに、より高いIDを取得する必要があります。私はグーグルで調べ、IDでアカウント作成日を推定する方法があることを発見し、metadatascience.comからMassoud Seifiがいくつかの優れたデータを収集しました。

ここに画像の説明を入力してください

この記事を読む:

http://metadatascience.com/2013/03/11/inferring-facebook-account-creation-date-from-facebook-user-id/

そしてここにダウンロードするいくつかのIDがあります:

http://metadatascience.com/2013/03/14/lookup-table-for-inferring-facebook-account-creation-date-from-facebook-user-id/


1
これはどのように質問に答えますか?
Flimm

6

ブログの投稿「Facebookグラフオブジェクトの画像を取得」は、別の形式のソリューションを提供する可能性があります。チュートリアルのコードをFacebookのGraph APIとそのPHP SDKライブラリと共に使用します。

...そして、file_get_contentsを使用しないようにします(結果に直面する準備ができている場合を除きます-file_get_contentsとcurlを参照してください)。


4

プロフィール写真のサイズが気になりますか?PHPを使用してFacebookへのログインを実装する時点。Facebook PHP SDKで大きなサイズのプロフィール写真を取得する簡単な方法を紹介します。また、Facebookプロフィールのカスタムサイズの画像を取得できます。

次のコード行を使用して、プロフィール画像の寸法を設定します。

$ userProfile = $ facebook-> api( '/ me?fields = picture.width(400).height(400)');

この投稿を確認してください:http://www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/


3

@NaturalBornCamper、

素敵なコード!ここにそのようなプロセスのためのクリーンカットコード関数があります!

function get_raw_facebook_avatar_url($uid)
{
    $array = get_headers('https://graph.facebook.com/'.$uid.'/picture?type=large', 1);
    return (isset($array['Location']) ? $array['Location'] : FALSE);
}

これにより、未加工の Facebookアバター画像URL が返されます。その後、自由に好きなことをしてください!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.