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

时间:2011-11-02 16:43:08

标签: php facebook facebook-graph-api

我正在尝试获取在客户的Facebook页面上评论的人物的个人资料照片,因此可以在网站上显示等。

我通过/[page_name]/feed/图表调用获取用户ID,我将其放入如下的网址格式:

$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 个答案:

答案 0 :(得分:24)

Graph API确实包含一个标志,可以让您检测用户的Facebook头像是否是默认的...

您可以将&redirect=false附加到图表图片网址的末尾来完成此操作。

例如:

正常的图片网址,例如

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

将重定向到实际的图像文件,给人留下返回实际图像的印象。 但是像

这样的网址
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,则用户的脸书图片是默认图片。

在“内联”的基础上做出此判断将需要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 :(得分:1)

这是可行的,但需要文件比较。 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作业来验证后端的图像。 您可以通过在db中存储默认头像的md5来稍微优化它,因此只需要获取1个URL进行比较。

这可以做为更改证明,使用图表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(我想测试的用户)

答案 2 :(得分:0)

哈希默认图像,存储默认男/女的哈希,比较?

答案 3 :(得分:0)

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

当您第一次调用Graph API时,只需在fields参数中加入picture,如果设置为true,则响应将包含is_silhouette偏移量用户具有默认头像。

请求:

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