it-swarm-vi.com

API Facebook - Làm cách nào để có được hình ảnh hồ sơ của người dùng Facebook thông qua API Facebook (mà không yêu cầu người dùng "Cho phép" ứng dụng)

Tôi đang làm việc trên CMS để lấy hình ảnh hồ sơ của người dùng từ Facebook của họ URL (nghĩa là, http://facebook.com/users_unique_url ). Làm thế nào tôi có thể thực hiện điều này? Có cuộc gọi API Faceboook nào tìm nạp URL hình ảnh hồ sơ của người dùng mà không cần người dùng cần Cho phép ứng dụng không?

254
John Himmelman

Chỉ cần tìm nạp dữ liệu qua đây URL :

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

Thay thế userid_here bằng id của người dùng bạn muốn nhận ảnh. Bạn cũng có thể sử dụng HTTPS.

Bạn có thể sử dụng hàm file_get_contents của PHP để đọc URL đó và xử lý dữ liệu đã truy xuất.

Tài nguyên:

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

Lưu ý: Trong php.ini, bạn cần đảm bảo rằng tiện ích mở rộng OpenSSL được bật để sử dụngfile_get_contents chức năng của PHP để đọc URL đó.

408
Sarfraz

Để hiển thị:

50x50 pixel

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

Chiều rộng 200 pixel

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

Để lưu (sử dụng PHP)

LƯU Ý: Không sử dụng cái này. Xem bình luận của @ Premever bên dưới.

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

Trong đó $ fid là id người dùng của bạn trên Facebook.

LƯU Ý: Trong trường hợp hình ảnh được đánh dấu là "18+", bạn sẽ cần access_token hợp lệ từ người dùng 18+:

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

CẬP NHẬT 2015:

Không thể truy vấn API đồ thị v2.0 bằng tên người dùng, bạn nên sử dụng userId luôn.

265
neiker

CẬP NHẬT:

Bắt đầu từ cuối tháng 8 năm 2012, API đã được cập nhật để cho phép bạn truy xuất ảnh tiểu sử của người dùng ở các kích cỡ khác nhau. Thêm các trường chiều rộng và chiều cao tùy chọn làm tham số URL:

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

trong đó WIDTHHEIGHT là các giá trị thứ nguyên được yêu cầu của bạn.

Điều này sẽ trả về ảnh hồ sơ với kích thước tối thiểu là WIDTH x HEIGHT trong khi cố gắng duy trì tỷ lệ khung hình. Ví dụ,

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

trả lại

    {
      "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
      }
   }

CẬP NHẬT KẾT THÚC

Để có ảnh đại diện của người dùng, hãy gọi

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

trong đó USER_ID có thể là số id người dùng hoặc tên người dùng.

Để có được hình ảnh hồ sơ người dùng có kích thước cụ thể, hãy gọi

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

trong đó SIZE nên được thay thế bằng một trong những từ

square
small
normal
large

tùy thuộc vào kích thước bạn muốn.

Cuộc gọi này sẽ trả lại URL cho một hình ảnh duy nhất với kích thước của nó dựa trên tham số loại bạn đã chọn.

Ví dụ:

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

trả về một URL cho một phiên bản nhỏ của hình ảnh.

API chỉ chỉ định kích thước tối đa cho hình ảnh hồ sơ, không phải kích thước thực tế.

Quảng trường:

chiều rộng và chiều cao tối đa 50 pixel.

Nhỏ bé

chiều rộng tối đa 50 pixel và chiều cao tối đa 150 pixel.

Bình thường

chiều rộng tối đa 100 pixel và chiều cao tối đa 300 pixel.

Lớn

chiều rộng tối đa 200 pixel và chiều cao tối đa 600 pixel.

Nếu bạn gọi USER_ID/hình ảnh mặc định, bạn sẽ có được loại hình vuông.

LÀM RÕ

Nếu bạn gọi (theo ví dụ trên)

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

nó sẽ trả về JSON reply nếu bạn đang sử dụng một trong các phương thức yêu cầu SDK của Facebook . Nếu không nó sẽ trả lại hình ảnh chính nó. Để luôn lấy JSON, hãy thêm:

&redirect=false

như vậy

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

Để lấy URL hình ảnh, KHÔNG phải nội dung nhị phân:

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

Bạn phải sử dụng ID FACEBOOK của mình, KHÔNG phải USERNAME. Bạn có thể lấy id facebook của mình ở đó:

http://findmyfbid.com/

20
NaturalBornCamper

Mã một dòng đơn giản để lưu hình ảnh hồ sơ kích thước ĐẦY ĐỦ trên máy chủ của bạn.

<?php

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

?>

Điều này sẽ chỉ hoạt động nếu openssl được kích hoạt trong php.ini.

19
Armand

Đã thêm điều này như một nhận xét cho câu trả lời được chấp nhận, nhưng cảm thấy nó xứng đáng được giải thích lâu hơn. Bắt đầu từ khoảng tháng 4 năm 2015, điều này có thể sẽ được nâng lên một vài lần.

Kể từ V2 của đồ thị api, câu trả lời được chấp nhận không còn hoạt động bằng tên người dùng. Vì vậy, bây giờ bạn cần userid trước và bạn không còn có thể sử dụng tên người dùng để có được điều này. Để làm phức tạp thêm vấn đề, vì lý do riêng tư, Facebook hiện đang thay đổi userid trên mỗi ứng dụng (xem https://developers.facebook.com/docs/graph-api/reference/v2.2/user/https://developers.facebook.com/docs/apps/upgrad/#upgrad_v2_0_user_ids ), vì vậy bạn sẽ phải có một số loại xác thực phù hợp để truy xuất người dùng mà bạn có thể sử dụng. Về mặt kỹ thuật, ảnh hồ sơ vẫn ở chế độ công khai và có sẵn tại/userid/hình ảnh (xem tài liệu tại https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture và người dùng ví dụ này: http://graph.facebook.com/v2.2/4/picture?redirect= ) tuy nhiên việc tìm ra một userid tiêu chuẩn của người dùng dường như không thể chỉ dựa trên hồ sơ của họ - ứng dụng sẽ cần phải khiến họ chấp thuận tương tác với ứng dụng cho trường hợp sử dụng của tôi (chỉ hiển thị ảnh hồ sơ bên cạnh liên kết hồ sơ FB của họ) là quá mức cần thiết.

Nếu ai đó đã tìm ra cách để có được ảnh hồ sơ dựa trên tên người dùng hoặc cách khác, làm thế nào để có một userid (thậm chí là một thay thế) để sử dụng để lấy ảnh hồ sơ, vui lòng chia sẻ! Trong khi đó, url biểu đồ cũ vẫn hoạt động cho đến tháng 4 năm 2015.

10
sckd

Một cách là sử dụng mã Gamlet đã đăng trong câu trả lời của anh ấy:

  • Lưu nó dưới dạng curl.php

  • Sau đó, trong tập tin của bạn:

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

Tôi nghĩ rằng tôi sẽ đăng bài này, vì tôi đã mất một chút thời gian để tìm hiểu chi tiết ... Mặc dù hình ảnh hồ sơ là công khai, bạn vẫn cần phải có mã thông báo truy cập trong đó để có được nó khi bạn cuộn tròn nó.

9
benjaminlotan

Giải pháp PHP (HTTP GET) hoạt động từ tháng 4 năm 2015 (không có 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'];
}

Bạn có thể thay đổi 'loại' trong parametr:

Quảng trường:

chiều rộng và chiều cao tối đa 50 pixel.

Nhỏ bé

chiều rộng tối đa 50 pixel và chiều cao tối đa 150 pixel.

Bình thường

chiều rộng tối đa 100 pixel và chiều cao tối đa 300 pixel.

Lớn

chiều rộng tối đa 200 pixel và chiều cao tối đa 600 pixel.

8
Xawier

Có cách để làm điều đó;)

Cảm ơn " 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
Gamlet

Tôi đã suy nghĩ - có lẽ ID sẽ là một công cụ hữu ích. Mỗi khi người dùng tạo một tài khoản mới, nó sẽ nhận được ID cao hơn. Tôi đã googled và thấy rằng có một phương pháp để ước tính ngày tạo tài khoản theo ID và Massoud Seifi từ metadatascience.com đã thu thập một số dữ liệu tốt về nó.

Enter image description here

Đọc bài viết này:

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

Và đây là một số ID để tải xuống:

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

7
Erroid

Bài đăng trên blog Lấy hình ảnh của đối tượng đồ thị Facebook có thể cung cấp một hình thức giải pháp khác. Sử dụng mã trong hướng dẫn cùng với thư viện API API và thư viện SDK PHP của Facebook.

... Và cố gắng không sử dụng file_get_contents (trừ khi bạn sẵn sàng đối mặt với hậu quả - xem file_get_contents vs curl ).

6
moostring

Bạn có quan tâm về kích thước hình ảnh hồ sơ? tại thời điểm thực hiện đăng nhập bằng Facebook bằng PHP. Chúng tôi sẽ chỉ cho bạn cách đơn giản để có được ảnh đại diện kích thước lớn trong Facebook PHP SDK. Ngoài ra, bạn có thể nhận được hình ảnh kích thước tùy chỉnh của hồ sơ Facebook.

Đặt kích thước hình ảnh hồ sơ bằng cách sử dụng dòng mã sau đây.

$ userProfile = $ facebook-> api ('/ me? Field = hình ảnh. Băng thông (400) .height (400)');

kiểm tra bài đăng này: http: //www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/

4
sagar jethi

@NaturalBornCamper,

Mã đẹp! Đây là một chức năng mã sạch cho quá trình như vậy!

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);
}

Điều này sẽ trả về raw URL hình ảnh đại diện của Facebook. Hãy thoải mái làm bất cứ điều gì bạn muốn với nó sau đó!

3
tfont
URI  = https://graph.facebook.com/{}/picture?width=500'.format(uid)

Bạn có thể lấy URI hồ sơ thông qua công cụ Tìm kiếm id trên facebook trực tuyến

Bạn cũng có thể chuyển loại param với các giá trị có thể nhỏ, bình thường, lớn, vuông.

Tham khảo tài liệu chính thức

3
user2119554