Facebook API-Facebook API를 통해 Facebook 사용자의 프로필 이미지를 얻는 방법 (사용자가 응용 프로그램을 "허용"하지 않아도 됨)


257

내가 일하고 있어요 CMS 자신의 페이스 북에서 사용자의 프로필 이미지를 가져 URL (즉, http://facebook.com/users_unique_url ). 어떻게하면됩니까? 사용자가 애플리케이션 을 허용 할 필요없이 사용자의 프로필 이미지 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 의 기능 을 사용하여 해당 URL을 읽을 수 있도록 OpenSSL 확장이 활성화되어 php.ini있는지 확인해야합니다 .file_get_contents


73
해당 페이지를 자세히 살펴보면 ?type=large추가 할 수 있는 쿼리 문자열이 유용 할 수 있습니다 . 내가 입력 한 화면 긁기보다 BTW :)보다 완전히 더 나은 대답을 제시하기위한 소품.
Domenic

6
<img src="//graph.facebook.com/sarfraz.anees/picture" />HTTP와 HTTPS 사이를 변경하는 경우 사용 합니다 ... 프로토콜이 브라우저에 의해 감지되고 HTTPS에 혼합 된 내용 경고가 표시되지 않습니다.
Chris Jacob

39
일부 사용자에게는 FB 계정에 대한 사용자 이름이 설정되어 있지 않습니다 . 이 경우이 답변을 구현하려고하면 FB의 기본 프로필 사진 인 물음표를 받게됩니다. 이 문제를 쉽게 피하려면 대신 사용자의 FB ID를 사용하십시오.
조쉬

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)
산토 쉬 쿠마

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

유용하게 보이므로 미리 응원하십시오. 그러나 이해하기에는 너무 새로운 수준입니다. 이것이 어떤 프로그래밍 언어인지 알고 싶습니다. 내 생각 엔 PHP입니다.
hello_there_andy

@hello_there_andy p! 그것은 PHP입니다 (실제로 질문은 PHP로 태그되어 있으며 4 년 전에 사용한 유일한 언어였습니다)
neiker

7
2015 년 7 월 더 이상 작동하지 않습니다 (오류 : "사용자 이름으로 사용자를 쿼리 할 수 ​​없습니다")
Flimm

164

업데이트 :

2012 년 8 월 말부터 다양한 크기의 사용자 프로필 사진을 검색 할 수 있도록 API가 업데이트되었습니다. 선택적 너비 및 높이 필드를 URL 매개 변수로 추가하십시오.

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

요청한 측정 기준 값은 어디 WIDTH이며HEIGHT

가로 세로 비율을 유지하는 동안 최소 WIDTHx 크기의 프로필 사진이 반환됩니다 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 요청 방법 중 하나를 사용하는 경우 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)의 이미지 URL로 응답합니다. /c0.19.180.142/… ). { "data"와 같은 JSON이 아님 : { "url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/… ", "width": 148, "height" : 117, "is_silhouette": false}}
Gökhan Barış Aker

나는 여전히 내 대답과 동일한 응답을 얻습니다. 페이스 북 개발자 (developers.facebook.com/tools/explorer)의 그래프 탐색기에서 사용해 볼 수 있습니다. 'redbull / picture? width = 140 & height = 110'을 입력하고 응답을보십시오. 내 대답은 Facebook SDKs API / 요청 메소드 중 하나를 사용하여 이것을 호출한다고 가정합니다 .JSON 응답을 반환합니다.
Gunnar Karlsson

2
@GunnarKarlsson 당신은 &redirect=false이미지로 리디렉션하는 대신 JSON 데이터를 반환하는 누락되었습니다
andrewtweber

@andrewtweber 감사합니다. 답변에 설명을 추가했습니다.
Gunnar Karlsson

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";

USERNAME이 아닌 FACEBOOK ID를 사용해야합니다. 당신은 당신의 페이스 북 ID를 얻을 수 있습니다 :

http://findmyfbid.com/


1
2015 년 7 월
인데

3
당신은 모든 잘못된 친구를 얻었다 :) 그것은 사용자 이름 findmyfbid.com이
NaturalBornCamper

1
여기 최고입니다. 정말 미친 짓이다. 나는 몸에 데이터를 가져오고 데이터를 헤더 @. @에
나타냈다

19

서버에 전체 크기 프로필 이미지를 저장하는 간단한 한 줄 코드.

<?php

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

?>

이것은 php.ini에서 openssl이 활성화 된 경우에만 작동합니다.


2015 년 7 월
인데

예, 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

한 가지 방법은 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를 가져와야합니다. 나는 googled하고 metadatascience.com에서 ID와 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


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.