Facebook API - Как получить изображение профиля пользователя Facebook через API Facebook (не требуя от пользователя "Разрешить" приложение)
Я работаю над CMS, которая выбирает изображение профиля пользователя с его URL-адреса в Facebook (то есть http://facebook.com/users_unique_url). Как я могу сделать это? Существует ли вызов API Faceboook, который выбирает URL-адрес изображения профиля пользователя, и пользователю не нужно разрешать приложение?
14 ответов
Просто загрузите данные через этот URL:
http://graph.facebook.com/userid_here/picture
замещать userid_here
с идентификатором пользователя, которого вы хотите получить фото. Вы также можете использовать HTTPS.
Вы можете использовать PHP file_get_contents
Функция для чтения этого URL и обработки полученных данных.
Ресурс:
http://developers.facebook.com/docs/api
Примечание: в php.ini
необходимо убедиться, что расширение OpenSSL включено для использованияfile_get_contents
функция PHP для чтения этого URL.
Показывать:
50x50 пикселей
<img src="//graph.facebook.com/{{fid}}/picture">
Ширина 200 пикселей
<img src="//graph.facebook.com/{{fid}}/picture?type=large">
Сохранить (используя PHP)
ПРИМЕЧАНИЕ: не используйте это. Смотрите @ комментарий навсегда ниже.
$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+", вам потребуется действительный токен доступа от пользователя 18+:
<img src="//graph.facebook.com/{{fid}}/picture?access_token={{access_token}}">
ОБНОВЛЕНИЕ 2015:
Graph API v2.0 не может быть запрошен с использованием имен пользователей, вы должны использовать userId
всегда.
ОБНОВЛЕНИЕ:
Начиная с конца августа 2012 года, API был обновлен, чтобы вы могли получать изображения профиля пользователя в различных размерах. Добавьте необязательные поля ширины и высоты в качестве параметров URL:
https://graph.facebook.com/USER_ID/picture?width=WIDTH&height=HEIGHT
где WIDTH
а также HEIGHT
ваши запрошенные значения измерений.
Это вернет изображение профиля с минимальным размером WIDTH
Икс 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
может быть номером идентификатора пользователя или именем пользователя.
Чтобы получить изображение профиля пользователя определенного размера, позвоните
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, если вы используете один из методов запроса Facebook SDK. В противном случае он вернет само изображение. Чтобы всегда получать 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, а не имя пользователя. Вы можете получить свой идентификатор Facebook там:
Простой однострочный код для сохранения изображения профиля полного размера на вашем сервере.
<?php
copy("https://graph.facebook.com/FACEBOOKID/picture?width=9999&height=9999", "picture.jpg");
?>
Это будет работать только если openssl будет включен в php.ini.
Добавил это как комментарий к принятому ответу, но чувствовал, что заслуживает более длинного объяснения. Начиная примерно с апреля 2015 года, этот показатель, вероятно, будет повышен несколько раз.
Начиная с V2 графика api принятый ответ больше не работает с использованием имени пользователя. Так что теперь вам сначала нужен идентификатор пользователя, и вы больше не можете использовать имя пользователя для его получения. Чтобы еще больше усложнить ситуацию, в целях конфиденциальности Facebook теперь меняет идентификатор пользователя для каждого приложения (см. https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ и https://developers.facebook.com/docs/apps/upgrading/), поэтому вам потребуется какая-то надлежащая аутентификация для получения идентификатора пользователя, который вы можете использовать. Технически фотография профиля все еще общедоступна и доступна по адресу / userid / picture (см. Документы по адресу https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture и в этом примере пользователь: http://graph.facebook.com/v2.2/4/picture?redirect=0) однако выяснение стандартного идентификатора пользователя кажется невозможным только на основании его профиля - ваше приложение должно было бы заставить их одобрить взаимодействие с приложением, которое для Мой вариант использования (просто показ профиля изображения рядом с их ссылкой на профиль FB) является чрезмерным.
Если кто-то нашел способ получить изображение профиля на основе имени пользователя или, альтернативно, как получить идентификатор пользователя (даже альтернативный) для получения изображения профиля, пожалуйста, поделитесь! В то же время старый URL-адрес графика все еще работает до апреля 2015 года.
Рабочее решение 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 пикселей.
Одним из способов является использование кода Гамлета, размещенного в его ответе:
Сохранить как
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 будет полезным инструментом. Каждый раз, когда пользователь создает новую учетную запись, он должен получить более высокий идентификатор. Я гуглил и обнаружил, что есть метод для оценки даты создания учетной записи по ID, и Масуд Сейфи из metadatascience.com собрал некоторые хорошие данные об этом.
Прочитайте эту статью:
И вот несколько идентификаторов для скачивания:
Сообщение в блоге " Возьмите изображение графического объекта Facebook" может предложить другую форму решения. Используйте код из учебника вместе с API API Facebook и его библиотекой PHP SDK.
... И старайтесь не использовать file_get_contents (если вы не готовы столкнуться с последствиями - см. File_get_contents против curl).
Вас беспокоит размер картинки профиля? во время реализации входа в систему с Facebook с использованием PHP. Мы покажем вам простой способ получить большое изображение профиля в 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/
@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. Не стесняйтесь делать все, что вы хотите с ним тогда!
URI = https://graph.facebook.com/{}/picture?width=500'.format(uid)
Вы можете получить URI профиля через онлайн инструмент поиска идентификатора Facebook
Вы также можете передать тип param с возможными значениями small, normal, large, square.
Обратитесь к официальной документации