Я работаю над CMS, который извлекает изображение профиля пользователя из своего URL-адреса Facebook (то есть http://facebook.com/users_unique_url ). Как я могу это сделать? Есть ли API-интерфейс Faceboook API, который выбирает URL-адрес профиля профиля пользователя, если пользователь не должен разрешать приложение?
Просто введите данные через этот URL :
http://graph.facebook.com/userid_here/picture
Замените userid_here
с идентификатором пользователя, userid_here
вы хотите получить фотографию. Вы также можете использовать HTTPS.
Вы можете использовать функцию file_get_contents
PHP для чтения этого URL-адреса и обработки полученных данных.
Ресурс:
http://developers.facebook.com/docs/api
Примечание. В php.ini
вам необходимо убедиться, что расширение OpenSSL включено для использования функции file_get_contents
PHP для чтения этого URL-адреса.
Показывать:
<img src="//graph.facebook.com/{{fid}}/picture">
<img src="//graph.facebook.com/{{fid}}/picture?type=large">
ПРИМЕЧАНИЕ. Не используйте это . См. Комментарий @ 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.
ПРИМЕЧАНИЕ. В случае изображений с пометкой «18+» вам потребуется действительный access_token от пользователя 18+:
<img src="//graph.facebook.com/{{fid}}/picture?access_token={{access_token}}">
ОБНОВЛЕНИЕ :
Начиная с августа 2012 года, API был обновлен, чтобы вы могли получать изображения профиля пользователя в разных размерах. Добавьте необязательные поля ширины и высоты в качестве параметров URL:
https://graph.facebook.com/USER_ID/picture?width=WIDTH&height=HEIGHT
где WIDTH
и HEIGHT
являются вашими запрошенными значениями измерения.
Это приведет к возврату изображения профиля с минимальным размером 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 } }
END UPDATE
Чтобы получить изображение профиля пользователя, позвоните
https://graph.facebook.com/USER_ID/picture
где USER_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
он вернет ответ JSON, если вы используете один из методов запроса SDK для Facebook . В противном случае он вернет изображение. Чтобы всегда извлекать JSON, добавьте:
&redirect=false
вот так:
https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false
Чтобы получить 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, а не USERNAME. Вы можете получить свой идентификатор facebook:
Простой однострочный код для сохранения изображения профиля полного размера на вашем сервере.
<?php copy("https://graph.facebook.com/FACEBOOKID/picture?width=9999&height=9999", "picture.jpg"); ?>
Это будет работать, только если openssl будет включен в php.ini.
Добавлено это как комментарий к принятому ответу, но считал, что заслуживает более подробного объяснения. Начиная с апреля 2015 года это, вероятно, будет поднято несколько раз.
Начиная с V2 графика api принятый ответ больше не работает с использованием имени пользователя. Итак, теперь вам нужно сначала указать userid, и вы больше не можете использовать имя пользователя, чтобы получить это. Чтобы еще больше усложнить ситуацию, по соображениям конфиденциальности Facebook теперь меняет приложение для каждого приложения (см. https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ и https: //developers.facebook .com / docs / apps / upgrade / # upgradeing_v2_0_user_ids ), поэтому для получения идентификатора пользователя, который вы можете использовать, вам потребуется некоторая надлежащая аутентификация. Технически профиль pic остается общедоступным и доступен на / userid / picture (см. Документы на странице https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture и в этом примере пользователь: http: //graph.facebook.com/v2.2/4/picture?redirect=0 ), однако выяснение стандартного пользовательского идентификатора пользователя кажется невозможным, основываясь только на их профиле – ваше приложение должно заставить их одобрить взаимодействие с приложением, которое для мой пример использования (просто показ профиля pic рядом с их ссылкой на профиль FB) является излишним.
Если кто-то выяснил способ получения профиля pic на основе имени пользователя или, альтернативно, как получить идентификатор пользователя (даже чередующийся), который будет использоваться для извлечения профиля, пожалуйста, поделитесь! Тем временем старый графический url все еще работает до апреля 2015 года.
Один из способов – использовать код 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;
Я думал, что я опубликую это, потому что мне потребовалось немного времени, чтобы разобраться в деталях … Несмотря на то, что фотографии профилей являются общедоступными, вам все равно нужно иметь токен доступа, чтобы получить его, когда вы его закручиваете .
Есть способ сделать это;)
Благодаря « 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); } } }
Я думал: возможно, ID станет полезным инструментом. Каждый раз, когда пользователь создает новую учетную запись, он должен получать более высокий идентификатор. Я googled и обнаружил, что есть способ оценить дату создания учетной записи по ID, и Масуд Сейфи из metadatascience.com собрал некоторые хорошие данные об этом.
Прочтите эту статью:
И вот несколько идентификаторов для загрузки:
Рабочее решение PHP (HTTP GET) с апреля 2015 года (без 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 пикселей.
Сообщение в блоге Grab Picture of Facebook Graph Object может предложить другую форму решения. Используйте код в учебнике вместе с API-интерфейсом Facebook и его библиотекой PHP SDK.
… И попробуйте не использовать file_get_contents (если вы не готовы к последствиям – см. Файл_get_contents vs curl ).
Вы обеспокоены размером профиля профиля? во время внедрения логина с Facebook с использованием PHP. Мы покажем вам простой способ получить изображение профиля большого размера в PHP 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/
@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); }
Это вернет исходный URL-адрес изображения аватара для Facebook. Не стесняйтесь делать то, что вы хотите с этим!