Facebook API - Bagaimana cara saya mendapatkan gambar profil pengguna Facebook melalui Facebook API (tanpa mengharuskan pengguna untuk "Izinkan" aplikasi)

257

Saya sedang mengerjakan CMS yang mengambil gambar profil pengguna dari URL Facebook mereka (yaitu, http://facebook.com/users_unique_url ). Bagaimana saya bisa mencapai ini? Apakah ada panggilan Faceboook API yang mengambil URL gambar profil pengguna tanpa pengguna perlu Izinkan aplikasi?

John Himmelman
sumber

Jawaban:

409

Cukup ambil data melalui URL ini :

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

Ganti userid_heredengan id pengguna yang ingin Anda foto. Anda juga dapat menggunakan HTTPS.

Anda dapat menggunakan fungsi PHP file_get_contentsuntuk membaca URL itu dan memproses data yang diambil.

Sumber:

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

Catatan: Di php.ini, Anda perlu memastikan bahwa ekstensi OpenSSL diaktifkan untuk menggunakan file_get_contentsfungsi PHP untuk membaca URL itu.

Sarfraz
sumber
73
Melihat lebih jauh halaman itu, hal lain yang bermanfaat mungkin adalah ?type=largequerystring yang bisa Anda tambahkan. Alat peraga untuk menghasilkan jawaban yang jauh lebih baik daripada goresan layar yang saya ketikkan, BTW :).
Domenic
6
Gunakan <img src="//graph.facebook.com/sarfraz.anees/picture" />jika Anda mengubah antara HTTP dan HTTPS ... protokol terdeteksi oleh browser, dan Anda tidak akan mendapatkan peringatan konten campuran di HTTPS.
Chris Jacob
39
Harus ditekankan, beberapa pengguna TIDAK memiliki set nama pengguna untuk akun FB mereka. Ketika hal ini terjadi, dan Anda mencoba menerapkan jawaban ini, Anda akan menerima gambar profil default FB, tanda tanya. Untuk menghindari masalah ini dengan mudah, gunakan ID FB pengguna.
Josh
7
Perlu dicatat bahwa dalam V2 grafik api ini tidak lagi berfungsi menggunakan nama pengguna. Jadi sekarang Anda perlu userid terlebih dahulu, dan Anda tidak bisa lagi menggunakan nama pengguna untuk mendapatkan ini. Userid juga berubah per aplikasi, jadi Anda harus memiliki semacam otentikasi yang tepat untuk mengambil userid yang dapat Anda gunakan. Secara teknis gambar profil masih tersedia untuk umum dan tersedia di graph.facebook.com/v2.2/4/picture?redirect=0 namun mencari tahu userid (4 di tautan sebelumnya) tampaknya mustahil berdasarkan hanya pada profil pengguna. URL grafik lama masih berfungsi hingga April 2015.
sckd
36
Ini tahun 2015 dan saya mendapatkan (# 803) Tidak dapat meminta pengguna dengan nama pengguna mereka (sarfraz.anees)
Santosh Kumar
268

Memperlihatkan:

50x50 piksel

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

Lebar 200 piksel

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

Untuk menyimpan (menggunakan PHP)

CATATAN: Jangan gunakan ini . Lihat komentar @ Foreever di bawah ini.

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

Di mana $ fid adalah id pengguna Anda di Facebook.

CATATAN: Jika ada gambar yang ditandai "18+", Anda akan memerlukan access_token yang valid dari pengguna 18+:

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

PEMBARUAN 2015:

Grafik API v2.0 tidak dapat ditanyakan menggunakan nama pengguna, Anda harususerId selalu menggunakan .

neiker
sumber
6
Berikut ini info lebih lanjut tentang parameter tipe: "Anda dapat menentukan ukuran gambar yang Anda inginkan dengan argumen tipe, yang harus berupa kuadrat (50x50), kecil (lebar 50 piksel, tinggi variabel), normal (lebar 100 piksel, tinggi variabel) ), dan besar (sekitar 200 piksel lebar, tinggi variabel) "Melalui Grafik API di Facebook
3
Untuk menggunakan metode ini, Anda harus mengatur allow_url_fopen ke aktif. Direktif allow_url_fopen dinonaktifkan secara default. Anda harus mengetahui implikasi keamanan dari mengaktifkan direktif allow_url_fopen. Skrip PHP yang dapat mengakses file jarak jauh berpotensi rentan terhadap injeksi kode arbitrer. Ketika direktif allow_url_fopen diaktifkan, Anda dapat menulis skrip yang membuka file jarak jauh seolah-olah itu adalah file lokal.
Foreever
Terlihat bermanfaat, jadi bersorak di muka, tetapi menjadi satu tingkat terlalu baru untuk memahami Saya ingin tahu bahasa pemrograman ini? Dugaan saya adalah PHP.
hello_there_andy
@hello_there_andy Yap! Ini PHP (sebenarnya pertanyaannya ditandai sebagai PHP dan itu satu-satunya bahasa yang saya gunakan 4 tahun yang lalu)
neiker
7
Pada bulan Juli 2015 ini tidak lagi berfungsi (kesalahan: "Tidak dapat meminta pengguna dengan nama pengguna mereka")
Flimm
164

PEMBARUAN :

Mulai akhir Agustus 2012, API telah diperbarui untuk memungkinkan Anda mengambil gambar profil pengguna dalam berbagai ukuran. Tambahkan bidang lebar dan tinggi opsional sebagai parameter URL:

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

di mana WIDTHdan HEIGHTadalah nilai dimensi yang Anda minta.

Ini akan mengembalikan gambar profil dengan ukuran minimum WIDTHx HEIGHTsaat mencoba mempertahankan rasio aspek. Sebagai contoh,

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

kembali

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

AKHIR PEMBARUAN

Untuk mendapatkan gambar profil pengguna, hubungi

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

di mana USER_IDbisa menjadi nomor id pengguna atau nama pengguna.

Untuk mendapatkan gambar profil pengguna dengan ukuran tertentu, hubungi

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

di mana SIZEharus diganti dengan salah satu kata

square
small
normal
large

tergantung pada ukuran yang Anda inginkan.

Panggilan ini akan mengembalikan URL ke satu gambar dengan ukurannya berdasarkan pada parameter tipe yang Anda pilih.

Sebagai contoh:

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

mengembalikan URL ke versi kecil gambar.

API hanya menentukan ukuran maksimum untuk gambar profil, bukan ukuran sebenarnya.

Kotak:

lebar dan tinggi maksimum 50 piksel.

Kecil

lebar maksimum 50 piksel dan tinggi maksimum 150 piksel.

Normal

lebar maksimum 100 piksel dan tinggi maksimum 300 piksel.

Besar

lebar maksimum 200 piksel dan tinggi maksimum 600 piksel.

Jika Anda memanggil USER_ID / gambar default, Anda mendapatkan tipe persegi.

KLARIFIKASI

Jika Anda menelepon (seperti contoh di atas)

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

itu akan mengembalikan respons JSON jika Anda menggunakan salah satu metode permintaan SDK Facebook . Kalau tidak, itu akan mengembalikan gambar itu sendiri. Untuk selalu mengambil JSON, tambahkan:

&redirect=false

seperti itu:

https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false
Gunnar Karlsson
sumber
Penjelasan hebat, tetapi nilai pengembalian url yang Anda berikan (' graph.facebook.com/redbull/… ) merespons dengan url gambar di header lokasi (' Lokasi: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/… ). bukan sebagai JSON seperti {"data": {"url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/… ", "lebar": 148, "tinggi" : 117, "is_silhouette": false}}
Gökhan Barış Aker
Saya masih mendapatkan respons yang sama dengan jawaban saya. Anda dapat mencobanya di Graph Explorer di Facebook Developers di developers.facebook.com/tools/explorer. Masukkan 'redbull / picture? Width = 140 & height = 110' dan lihat jawabannya. Jawaban saya menganggap Anda memanggil ini menggunakan salah satu API SDK Facebook / metode permintaan, yang akan mengembalikan respons JSON.
Gunnar Karlsson
2
@GunnarKarlsson Anda kehilangan &redirect=falseuntuk mengembalikan data JSON alih-alih mengarahkan ulang ke gambar
andrewtweber
@ andrewtweber terima kasih banyak. Saya telah menambahkan klarifikasi untuk jawabannya.
Gunnar Karlsson
3
Ini Juli 2015 dan ini tidak lagi berfungsi. (kesalahan: "Tidak dapat meminta pengguna dengan nama pengguna mereka")
Flimm
20

Untuk mendapatkan URL gambar, BUKAN konten biner:

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

Anda harus menggunakan ID FACEBOOK Anda, BUKAN USERNAME. Anda bisa mendapatkan id facebook Anda di sana:

http://findmyfbid.com/

NaturalBornCamper
sumber
1
Ini Juli 2015 dan ini tidak lagi berfungsi (kesalahan: "Tidak dapat meminta pengguna dengan nama pengguna mereka")
Flimm
3
Anda punya itu semua teman salah :) Ini ID facebook Anda, bukan nama pengguna findmyfbid.com
NaturalBornCamper
1
Terbaik dari sini. Ini benar-benar gila, saya mencoba untuk mendapatkan data dalam tubuh dan kemudian data muncul di header @. @
Davuz
19

Kode satu baris sederhana untuk menyimpan gambar profil ukuran LENGKAP pada server Anda.

<?php

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

?>

Ini hanya akan berfungsi jika openssl diaktifkan di php.ini.

Armand
sumber
Ini Juli 2015 dan ini tidak lagi berfungsi (kesalahan: "Tidak dapat meminta pengguna dengan nama pengguna mereka")
Flimm
Ya, panggilan v1.0 akan berhenti berfungsi setelah 30 April 2015. Anda tidak bisa mendapatkan ID khusus aplikasi kecuali pengguna telah mengesahkan aplikasi Anda
Armand
10

Menambahkan ini sebagai komentar untuk jawaban yang diterima, tetapi merasa itu layak mendapatkan penjelasan yang lebih panjang. Mulai sekitar April 2015 ini mungkin akan dinaikkan beberapa kali.

Pada V2 grafik api, jawaban yang diterima tidak lagi berfungsi menggunakan nama pengguna. Jadi sekarang Anda perlu userid terlebih dahulu, dan Anda tidak bisa lagi menggunakan nama pengguna untuk mendapatkan ini. Untuk memperumit masalah, untuk alasan privasi, Facebook sekarang mengubah userid per aplikasi (lihat https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ dan https: //developers.facebook .com / docs / apps / upgrade / # upgrading_v2_0_user_ids ), jadi Anda harus memiliki semacam otentikasi yang tepat untuk mengambil userid yang dapat Anda gunakan. Secara teknis gambar profil masih terbuka untuk umum dan tersedia di / userid / gambar (lihat dokumen di https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture dan contoh pengguna ini: http: //graph.facebook.com/v2.2/4/picture?redirect=0) Namun, mencari tahu standar pengguna pengguna tampaknya tidak mungkin hanya berdasarkan profil mereka - aplikasi Anda perlu membuat mereka menyetujui interaksi dengan aplikasi yang untuk kasus penggunaan saya (hanya menunjukkan gambar profil di sebelah tautan profil FB mereka) berlebihan.

Jika seseorang menemukan cara untuk mendapatkan foto profil berdasarkan nama pengguna, atau sebagai alternatif, cara mendapatkan userid (bahkan foto bergantian) yang digunakan untuk mengambil foto profil, silakan berbagi! Sementara itu, url grafik lama masih berfungsi hingga April 2015.

sckd
sumber
9

Salah satu caranya adalah dengan menggunakan kode Gamlet yang diposting dalam jawabannya:

  • Simpan sebagai curl.php

  • Kemudian di file Anda:

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

Saya pikir saya akan memposting ini, karena saya butuh sedikit waktu untuk mengetahui rinciannya ... Meskipun gambar profil bersifat publik, Anda masih perlu memiliki token akses di sana untuk mendapatkannya ketika Anda menggulungnya .

benjaminlotan
sumber
8

Ada cara untuk melakukan itu;)

Terima kasih untuk " 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);
            }
        }
    }
Dukuh
sumber
8

Bekerja dengan PHP (HTTP GET) solusi dari April 2015 (tanpa 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'];
}

Anda dapat mengubah 'ketik' di parametr:

Kotak:

lebar dan tinggi maksimum 50 piksel.

Kecil

lebar maksimum 50 piksel dan tinggi maksimum 150 piksel.

Normal

lebar maksimum 100 piksel dan tinggi maksimum 300 piksel.

Besar

lebar maksimum 200 piksel dan tinggi maksimum 600 piksel.

Xawier
sumber
7

Saya berpikir - mungkin ID akan menjadi alat yang berguna. Setiap kali pengguna membuat akun baru, ia harus mendapatkan ID yang lebih tinggi. Saya mencari di Google dan menemukan bahwa ada metode untuk memperkirakan tanggal pembuatan akun berdasarkan ID dan Massoud Seifi dari metadatascience.com mengumpulkan beberapa data bagus tentangnya.

Masukkan deskripsi gambar di sini

Baca artikel ini:

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

Dan berikut ini beberapa ID untuk diunduh:

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

Erroid
sumber
1
Bagaimana ini menjawab pertanyaan?
Flimm
4

Apakah Anda khawatir tentang ukuran gambar profil? pada saat menerapkan login dengan Facebook menggunakan PHP. Kami akan menunjukkan kepada Anda cara sederhana untuk mendapatkan gambar profil ukuran besar di Facebook PHP SDK. Anda juga bisa mendapatkan gambar ukuran khusus dari profil Facebook.

Atur dimensi gambar profil dengan menggunakan baris kode berikut.

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

periksa posting ini: http: //www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/

Sagar Jethi
sumber
3

@NaturalBornCamper,

Kode yang bagus! Ini adalah fungsi kode yang bersih untuk proses seperti itu!

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

Ini akan mengembalikan URL gambar avatar Facebook mentah . Jangan ragu untuk melakukan apa pun yang Anda inginkan dengannya!

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

Anda dapat memperoleh URI profil melalui alat pencari id facebook online

Anda juga dapat melewatkan param tipe dengan nilai yang mungkin kecil, normal, besar, persegi.

Lihat dokumentasi resmi

pengguna2119554
sumber