我正试图获取评论客户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
将重定向到一个实际的图像文件,给人一种返回实际图像的感觉。但是像
这样的urlhttp://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"
属性-它将是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. "&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"
}
}
}