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 phải cho phép ứng dụng cho phép ứng dụng)


257

Tôi đang làm việc trên một CMS lấy hình ảnh hồ sơ của người dùng từ URL Facebook của họ (nghĩa là http://facebook.com/usftimeunique_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?

Câu trả lời:


409

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

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

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

Bạn có thể sử dụng file_get_contentschức năng của PHP để đọc URL đó và xử lý dữ liệu được truy xuất.

Nguồ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ụng file_get_contentschức năng của PHP để đọc URL đó.


73
Nhìn qua trang đó hơn nữa, một điều hữu ích khác có thể là ?type=largechuỗi truy vấn bạn có thể thêm vào. Đạo cụ để đưa ra một câu trả lời hoàn toàn tốt hơn nhiều so với việc quét màn hình tôi đang gõ, BTW :).
Domenic

6
Sử dụng <img src="//graph.facebook.com/sarfraz.anees/picture" />nếu bạn thay đổi giữa HTTP và HTTPS ... giao thức được trình duyệt phát hiện và bạn sẽ không nhận được cảnh báo nội dung hỗn hợp trên HTTPS.
Chris Jacob

39
Cần nhấn mạnh, một số người dùng KHÔNG có tên người dùng được đặt cho tài khoản FB của họ. Khi gặp trường hợp này và bạn đang cố gắng thực hiện câu trả lời này, bạn sẽ nhận được ảnh đại diện mặc định của FB, dấu hỏi. Để dễ dàng tránh vấn đề này, hãy sử dụng FB ID của người dùng.
Josh

7
Cần lưu ý rằng trong V2 của biểu đồ api, điều này 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. Userid cũng thay đổi trên mỗi ứng dụng, do đó bạn sẽ phải có một số loại xác thực phù hợp để truy xuất một userid bạn có thể sử dụng. Về mặt kỹ thuật, pic hồ sơ vẫn ở chế độ công khai và có sẵn tại graph.facebook.com/v2.2/4/picture?redirect=0 tuy nhiên việc tìm ra userid (4 trong liên kết trước) dường như không thể chỉ dựa trên hồ sơ của người dùng. Url biểu đồ cũ vẫn hoạt động cho đến tháng 4 năm 2015.
sckd

36
Đó là năm 2015 và tôi đang nhận được (# 803) Không thể truy vấn người dùng bằng tên người dùng của họ (sarfraz.anees)
Santosh Kumar

268

Để 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:

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


6
Dưới đây là thông tin thêm về tham số loại: "Bạn có thể chỉ định kích thước hình ảnh bạn muốn với đối số loại, phải là một hình vuông (50x50), nhỏ (rộng 50 pixel, chiều cao thay đổi), bình thường (rộng 100 pixel, chiều cao thay đổi ) và lớn (rộng khoảng 200 pixel, chiều cao thay đổi) "Qua API đồ thị trên Facebook

3
Để sử dụng phương pháp này, bạn phải đặt allow_url_fopen thành bật. Theo mặc định, lệnh allow_url_fopen bị tắt. Bạn nên lưu ý đến ý nghĩa bảo mật của việc kích hoạt lệnh allow_url_fopen. Các tập lệnh PHP có thể truy cập các tệp từ xa có khả năng dễ bị tấn công mã tùy ý. Khi chỉ thị allow_url_fopen được bật, bạn có thể viết các tập lệnh mở các tệp từ xa như thể chúng là các tệp cục bộ.
Trước

Có vẻ hữu ích, vì vậy hãy cổ vũ trước, nhưng là một cấp độ quá mới để hiểu tôi muốn biết ngôn ngữ lập trình này là gì? Tôi đoán là PHP.
xin chào_there_andy

@hello_there_andy Yep! Đó là PHP (thực ra câu hỏi được gắn thẻ là PHP và đó là ngôn ngữ duy nhất tôi sử dụng 4 năm trước)
neiker

7
Vào tháng 7 năm 2015, tính năng này không còn hoạt động nữa (lỗi: "Không thể truy vấn người dùng theo tên người dùng của họ")
Flimm

164

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

ở đâu WIDTHHEIGHTlà giá trị kích thước yêu cầu của bạn.

Điều này sẽ trả về một hình ảnh hồ sơ với kích thước tối thiểu là WIDTHx HEIGHTtrong 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

nơi USER_IDcó 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

nơi SIZEnên được thay thế bằng một trong các 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ả về một URL cho một hình ảnh 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ỏ

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ề phản hồi JSON 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

Giải thích tuyệt vời, nhưng giá trị trả về của url bạn đã đưa ra (' graph.facebook.com/redbull/ Khăn ) phản hồi với url hình ảnh trong tiêu đề vị trí (' Vị trí: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/ trên ). không phải là JSON như {"data": {"url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/ ", "width": 148, "height" : 117, "is_sil Silhouette": false}}
Gökhan Barış Aker

Tôi vẫn nhận được phản hồi giống như trong câu trả lời của tôi. Bạn có thể dùng thử trong Trình khám phá đồ thị trên Nhà phát triển của Facebook tại developers.facebook.com/tools/explorer. Nhập 'redbull / hình ảnh? Width = 140 & height = 110' và xem phản hồi. Câu trả lời của tôi cho rằng bạn đang gọi điều này bằng một trong các phương thức yêu cầu / API SDK của Facebook, sẽ trả về phản hồi JSON.
Gunnar Karlsson

2
@GunnarKarlsson bạn đang thiếu &redirect=falseđể trả về dữ liệu JSON thay vì chuyển hướng đến hình ảnh
andrewtweber

@andrewtweber cảm ơn rất nhiều. Tôi đã thêm một giải thích cho câu trả lời.
Gunnar Karlsson

3
Đó là tháng 7 năm 2015 và điều này không còn hoạt động. (lỗi: "Không thể truy vấn người dùng theo tên người dùng của họ")
Flimm

20

Để 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/


1
Đó là tháng 7 năm 2015 và điều này không còn hoạt động nữa (lỗi: "Không thể truy vấn người dùng theo tên người dùng của họ")
Flimm

3
Bạn có tất cả bạn sai :) Đó là ID facebook của bạn, chứ không phải tên findmyfbid.com
NaturalBornCamper

1
Tốt nhất ở đây. Thật điên rồ, tôi đã cố gắng lấy dữ liệu trong cơ thể và sau đó dữ liệu xuất hiện trong tiêu đề @. @
Davuz

19

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.


Đó là tháng 7 năm 2015 và điều này không còn hoạt động nữa (lỗi: "Không thể truy vấn người dùng theo tên người dùng của họ")
Flimm

Có, các cuộc gọi v1.0 sẽ ngừng hoạt động sau ngày 30 tháng 4 năm 2015. Bạn không thể nhận được ID cụ thể của ứng dụng trừ khi người dùng đã ủy quyền cho ứng dụng của bạn
Armand

10

Đã 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 / nâng cấp / # nâng cấp212_user_ids ), do đó bạn sẽ phải có một số loại xác thực phù hợp để truy xuất một userid 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=0) tuy nhiên việc tìm ra userid tiêu chuẩn của người dùng dường như là không thể chỉ dựa trên hồ sơ của họ - ứng dụng của bạn sẽ cần 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ó đượ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.


9

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

  • 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 nó.


8

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

Giải pháp PHP hoạt động (HTTP GET) từ tháng 4 năm 2015 (không có SDK PHP 5):

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ỏ

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.


7

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ó.

Nhập mô tả hình ảnh ở đây

Đọ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/


1
Làm thế nào để trả lời câu hỏi này?
Flimm


4

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 SDK Facebook PHP. 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/


3

@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ề URL hình ảnh đại diện thô 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 đó!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.