从用户获取Facebook个人资料图片(通过Graph API)- 如何检测它是否是空白(即默认)图片?

3

我试图获取评论客户Facebook页面的人的个人资料图片,以便可以在网站上显示等。

我通过/ [page_name] / feed / 图形调用获取用户ID,并将其放入以下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

我想只显示真实的个人资料图片 - 是否有一种方法可以检测到这一点呢?

4个回答

25

Graph API包括一个标记,允许您检测用户的Facebook头像是否为默认头像...

您可以通过在Graph图像URL末尾添加&redirect=false来实现此目的。

例如:

正常的图像URL如下:

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

将重定向到实际的图像文件,给人返回实际图像的印象。 但是像这样的网址

http://graph.facebook.com/[USERNAME]/picture?type=large&redirect=false
{"name": "John", "age": 30}
将返回JSON格式的数据 - 类似于:
{"name": "John", "age": 30}
{"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=200&height=600

请注意"is_silhouette"属性 - 它将是truefalse。如果是true,用户的Facebook图像是一个默认图像。

基于"inline"的判断将需要cURL,并且您可以将其与您的代码集成,类似于以下内容:

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

// Get avatar info from FB via cURL
$url = $link. "&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) && $avatarInfo->data->is_silhouette) $isDefaultAvatar = true;
}

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

1

这是可行的,但需要文件比较。 Facebook使用两张默认头像,一张用于男性,另一张用于女性。 因此,您将需要将获取到的图像与其中之一进行比较。

一个简单的比较方法是将它们的字节转换为字符串后进行比较。 最简单的例子:

<?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进行比较。

这可以做到CHANGE PROOF,使用一个能够返回默认头像的图形API URL,然后您就不必担心默认头像图片的更改,只需比较2个图形API URLS。 例如. 比较: a) http://graph.facebook.com/MY_TEST_ID/picture?type=large(这始终返回默认头像) b) http://graph.facebook.com/MY_NEW_USER_ID/picture?type=large(我要测试的用户)


嗯,我希望Facebook可能有一个标志,我可以传递404而不是保持图像。我会再等一会儿,如果没有人提出另一个解决方案,我会接受你的。这是一个好的解决方案,只是不如我想象的那么优雅(如果他们将来更改默认图像怎么办等)。不过还是谢谢你 :-) - user542603
这可以做到防更改,使用一个图形 API URL,该 URL 确保返回默认头像,然后您就不必担心默认头像图像的更改,只需比较两个图形 API URL 即可。 - DhruvPathak
虽然这种方法可能有效,但它是hackish的并且不必要。请参见下面我的答案,了解如何正确地使用Graph提供的is_silhouette值来完成此操作的描述。 - Matt Rabe
这不再是正确的答案,@MattRabe的回答是更好的方法。 - DhruvPathak

0

如果您已经调用了Graph API以获取用户数据,例如头像,请不要像上面建议的那样再次调用/picture来进行额外的API调用。

只需在首次调用Graph API时将picture包含在 fields参数中,然后响应将包括is_silhouette偏移量。如果设置为true,则用户具有默认头像。

请求:

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

响应:

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

0

对默认图像进行哈希处理,存储男/女默认头像的哈希值,然后进行比较吗?


听起来我可能不得不这样做。谢谢。 - user542603

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接