从用户(通过图形)获取Facebook个人资料图片-检测它是否为空白(即默认)图像


Getting Facebook profile pic from user (via Graph) - detect if it's a blank (i.e. default) image?

我正试图获取评论客户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

我想只显示真实的个人资料图片-有检测的方法吗?

Graph API确实包含一个标志,允许您检测用户的facebook头像是否是默认的…

您可以通过将&redirect=false附加到图形图像URL的末尾来完成此操作。

例如:

正常的图像url,如

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

将重定向到一个实际的图像文件,给人一种返回实际图像的感觉。但是像

这样的url
http://graph.facebook.com/[USERNAME]/picture?type=large&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=200&height=600

注意"is_silhouette"属性-它将是truefalse。如果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. "&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.";

这是可行的,但需要文件比较。Facebook使用2张图片作为默认头像,一张是男性头像,另一张是女性头像。因此,你必须将你得到的图像与这些中的一个进行比较。

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

<?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存储在db中来稍微优化一下,这样只需要获取1个URL进行比较。

这可以做CHANGE PROOF,使用一个图形api url,它肯定会返回默认头像,然后你不必担心默认头像图像的变化,你只需要比较2个图形api url。如。比较:a) http://graph.facebook.com/MY_TEST_ID/picture?type=large(这总是返回默认头像)b) http://graph.facebook.com/MY_NEW_USER_ID/picture?type=large(我要测试的用户)

对默认图像进行哈希,存储默认男/女哈希值,比较?

如果你已经调用了Graph API来获取用户数据,比如头像,不要像上面建议的那样再调用/picture API。

当你第一次调用Graph API时,只需在字段参数中包含picture,然后响应将包括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"
        }
    }
}