Получение изображения профиля Facebook от пользователя (через график) — определить, является ли оно пустым (т. Е. По Умолчанию) изображением?

#php #facebook #facebook-graph-api

#php #Facebook #facebook-graph-api

Вопрос:

Я пытаюсь получить фотографии профиля людей, комментирующих страницу клиента в Facebook, Чтобы их можно было отображать на веб-сайте и т. Д.

Я получаю идентификаторы пользователей с помощью /[page_name]/feed/ вызова graph и помещаю это в форму URL следующим образом:

 $id = $item['from']['id'];
$link = "http://graph.facebook.com/{$id}/picture?type=large";
  

Это работает хорошо — я возвращаю несколько изображений профиля, однако некоторые выглядят так: http://profile.ak.fbcdn.net/static-ak/rsrc.php/v1/yp/r/yDnr5YfbJCH.gif

Я хочу показывать только реальные фотографии профиля — есть ли способ обнаружить это?

Ответ №1:

Graph API включает флаг, который позволяет вам определять, является ли аватар пользователя на Facebook аватаром по умолчанию…

Вы можете сделать это, добавив amp;redirect=false в конец URL-адреса вашего графического изображения.

Например:

Обычный URL-адрес изображения, такой как

 http://graph.facebook.com/[USERNAME]/picture?type=large
  

перенаправит на фактический файл изображения, создавая впечатление возврата фактического изображения.
Но URL, такой как

 http://graph.facebook.com/[USERNAME]/picture?type=largeamp;redirect=false
  

вернет JSON — что-то вроде:

 {"data": {
    "url": "http://profile.ak.fbcdn.net/hprofile-ak-snc6/623549_1210877749_349605729_n.jpg",
    "is_silhouette": false
}}
  

(источник: http://developers.facebook.com/docs/reference/api/using-pictures /)

ОБНОВЛЕНИЕ: URI изменен: type=large больше не работает, теперь вы должны указать явную ширину / высоту следующим образом:

 http://graph.facebook.com/[USERNAME]/picture?width=200amp;height=600
  

Обратите внимание на "is_silhouette" атрибут — это будет true или false . Если true изображение пользователя в Facebook является изображением по умолчанию.

Для принятия этого решения на «встроенной» основе потребуется cURL, и вы могли бы интегрировать его в свой код примерно так:

 // Setup
$id = $item['from']['id'];
$link = "http://graph.facebook.com/{$id}/picture?type=large";

// Get avatar info from FB via cURL
$url = $link. "amp;redirect=false";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$avatarInfo = curl_exec($ch);
curl_close($ch); 

// Process cURL response
$isDefaultAvatar = false;
if ($avatarInfo)
{
    $avatarInfo = json_decode($avatarInfo);
    if (isset($avatarInfo->data->is_silhouette) amp;amp; $avatarInfo->data->is_silhouette) $isDefaultAvatar = true;
}

// Output
echo "This " .($isDefaultAvatar ? "IS" : "IS NOT"). " a default avatar.";
  

Ответ №2:

Это выполнимо, но потребуется сравнение файлов. Facebook использует 2 изображения в качестве аватаров по умолчанию, 1 для мужчин, другой для женщин. Итак, вам нужно будет сравнить полученное изображение с одним из них.

Простым сравнением было бы сравнить их оба после преобразования их байтов в строки. Простейший пример :

 <?php

$photo1 = "http://graph.facebook.com/2131243434/picture?type=large";
$photo2 = "http://profile.ak.fbcdn.net/static-ak/rsrc.php/v1/yL/r/HsTZSDw4avx.gif";
if (md5(file_get_contents($photo1)) ==  md5(file_get_contents($photo2))) {
       echo "NO PICTURE";
}
 else {
echo "REAL PICTURE";
}


?>
  

Это будет медленная операция, поэтому вы можете использовать ее как задание cron для проверки изображений на серверной части.
Вы можете немного оптимизировать его, сохранив md5 аватара по умолчанию в БД, поэтому для сравнения необходимо выбрать только 1 URL.

Это можно сделать ПРОВЕРЕННЫМ НА ИЗМЕНЕНИЕ, используйте URL-адрес graph api, который обязательно вернет аватар по умолчанию, тогда вам не нужно беспокоиться об изменении изображения аватара по умолчанию, вам просто нужно сравнить 2 URL-адреса graph api. например. сравните: a) http://graph.facebook.com/MY_TEST_ID/picture?type=large (это всегда возвращает аватар по умолчанию) b) http://graph.facebook.com/MY_NEW_USER_ID/picture?type=large (theпользователь, которого я хочу протестировать)

Комментарии:

1. Хм, надеялся, что у Facebook может быть флаг, который я мог бы передать, который дал бы мне 404 вместо удерживающего изображения. Я подожду немного, и если никто другой не предложит другое решение, приму ваше. Это хорошее решение, но не такое элегантное, как мне бы хотелось (что, если они изменят свое изображение по умолчанию в будущем и т. Д.). Спасибо, хотя 🙂

2. Это можно сделать ПРОВЕРЕННЫМ НА ИЗМЕНЕНИЕ, используйте URL graph api, который обязательно вернет аватар по умолчанию, тогда вам не нужно беспокоиться об изменении изображения аватара по умолчанию, вам просто нужно сравнить 2 URL graph api

3. Хотя этот подход может работать, он является хакерским и не является необходимым. Смотрите Мой ответ ниже для описания того, как это сделать правильно, используя is_silhouette значение, которое предоставляет график

4. Это уже не правильный ответ, ответ @MattRabe — лучший подход.

Ответ №3:

Хэшируйте изображение по умолчанию, сохраните хэш для мужского / женского пола по умолчанию, сравните?

Комментарии:

1. Похоже, мне, возможно, придется. Спасибо.

Ответ №4:

Если вы уже выполняете вызов Graph API для получения пользовательских данных, таких как аватар, не выполняйте дополнительный вызов API /picture , как предложено выше.

Просто включите picture параметр fields при первом вызове Graph API, тогда ответ будет включать is_silhouette смещение, если для него установлено значение true, у пользователя есть аватар по умолчанию.

Запрос:

 https://graph.facebook.com/v2.7/me?access_token=[token]amp;fields=name,picture
  

Ответ:

 {
    "id": "100103095474350",
    "name": "John Smith",
    "picture": {
        "data": {
            "is_silhouette": true,
            "url": "https://scontent.xx.fbcdn.net/v/...jpg"
        }
    }
}