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