【发布时间】:2011-07-30 03:18:43
【问题描述】:
有没有办法知道用户是否通过FQL 或其他方式将图像上传到个人资料,或者它是否具有 Facebook 的默认用户图片?
【问题讨论】:
标签: facebook api detect image facebook-fql
有没有办法知道用户是否通过FQL 或其他方式将图像上传到个人资料,或者它是否具有 Facebook 的默认用户图片?
【问题讨论】:
标签: facebook api detect image facebook-fql
如果用户没有照片,那么当您请求指定了“照片”字段的用户对象时,is_silhouette 字段将为真。
示例请求:
https://graph.facebook.com/username?fields=picture
回复:
{
"id": "100002095576350",
"picture": {
"data": {
"url": "http://profile.ak.fbcdn.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif",
"is_silhouette": true
}
}
}
快速、肮脏的 PHP 函数:
function facebook_user_has_photo($username_or_id){
$request = file_get_contents('https://graph.facebook.com/'.$username_or_id.'?fields=picture');
if($request):
$user = json_decode($request);
if($user && !$user->picture->data->is_silhouette) return true;
endif;
return false;
}
【讨论】:
从我对 Facebook API 的实验来看,似乎必须实际获取图片才能判断它是否是静态默认图片。
在撰写本文时,Facebook 上所有上传的照片似乎都转换为 JPEG,而静态默认图片为 GIF 格式。 (顺便说一句,这与某些缩略图大小不一致)。
寻找特定的 GIF 文件或特定的 URL 路径是不可靠的(请注意,其中涉及 CDN URL,并且男性和女性有不同的静态文件)。假设 Facebook 没有重新编码他们的整个个人资料照片数据库,我想寻找 GIF 就足够可靠了。
这里有一个示例 PHP 函数来执行此操作。我已经和我的 120 位 Facebook 朋友一起成功地测试了它,它似乎可以完成这项工作。
public static function hasProfilePicture($fbuid)
{
/* Really stupid method to test if Facebook user has real profile picture
* based on Facebook returning a GIF image when you request a large photo.
* Use with care - for every profile there's an outgoing request! */
$r = get_headers("http://graph.facebook.com/$fbuid/picture?type=square");
return !array_search("Content-Type: image/gif",$r);
}
【讨论】:
您可以使用下面的 Python 脚本(未提及任何编程语言)使其工作。
urllib.urlopen('https://graph.facebook.com/<PROFILE_ID>/picture?access_token=%s' % access_token).geturl()
这将为您提供 Facebook 个人资料照片 URL。如果该 URL 包含
比如上传图片:
http://profile.ak.fbcdn.net/hprofile-ak-snc4/195361_<PROFILE_ID>_4179703_q.jpg
其他:
男性:
http://b.static.ak.fbcdn.net/rsrc.php/v1/yo/r/UlIqmHJn-SK.gif
女性:
https://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v1/y9/r/IB7NOFmPw2a.gif
我希望这会有所帮助。
【讨论】:
<?php print_r(get_headers("https://graph.facebook.com/<PROFILE_ID>/picture?access_token=" . $access_token)); ?> 并在 header 中找到位置 :)