Facebook API -我如何通过Facebook API获得Facebook用户的个人资料图像(不需要用户“允许”;应用程序)

我正在研究一个CMS,从他们的Facebook URL(即http://facebook.com/users_unique_url)获取用户的个人资料图像。我怎样才能做到呢?是否有一个facebook API调用,获取用户的个人资料图像URL,而不需要用户允许应用程序?

455718 次浏览

简单地通过URL获取数据:

http://graph.facebook.com/userid_here/picture

userid_here替换为你想获取照片的用户id。你也可以使用HTTPS。

你可以使用PHP的file_get_contents函数来读取URL并处理检索到的数据。

资源:

http://developers.facebook.com/docs/api

php.ini中,您需要确保启用了OpenSSL扩展,以便使用PHP的__abc1函数读取该URL。

有办法做到这一点;)

感谢"http://it.toolbox.com/wiki/index.php/Use_curl_from_PHP_-_processing_response_headers":

<?php


/**
* Facebook user photo downloader
*/


class sfFacebookPhoto {


private $useragent = 'Loximi sfFacebookPhoto PHP5 (cURL)';
private $curl = null;
private $response_meta_info = array();
private $header = array(
"Accept-Encoding: gzip,deflate",
"Accept-Charset: utf-8;q=0.7,*;q=0.7",
"Connection: close"
);


public function __construct() {
$this->curl = curl_init();
register_shutdown_function(array($this, 'shutdown'));
}


/**
* Get the real URL for the picture to use after
*/
public function getRealUrl($photoLink) {
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, false);
curl_setopt($this->curl, CURLOPT_HEADER, false);
curl_setopt($this->curl, CURLOPT_USERAGENT, $this->useragent);
curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($this->curl, CURLOPT_TIMEOUT, 15);
curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($this->curl, CURLOPT_URL, $photoLink);


//This assumes your code is into a class method, and
//uses $this->readHeader as the callback function.
curl_setopt($this->curl, CURLOPT_HEADERFUNCTION, array(&$this, 'readHeader'));
$response = curl_exec($this->curl);
if (!curl_errno($this->curl)) {
$info = curl_getinfo($this->curl);
var_dump($info);
if ($info["http_code"] == 302) {
$headers = $this->getHeaders();
if (isset($headers['fileUrl'])) {
return $headers['fileUrl'];
}
}
}
return false;
}




/**
* Download Facebook user photo
*
*/
public function download($fileName) {
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->curl, CURLOPT_HEADER, false);
curl_setopt($this->curl, CURLOPT_USERAGENT, $this->useragent);
curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($this->curl, CURLOPT_TIMEOUT, 15);
curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($this->curl, CURLOPT_URL, $fileName);
$response = curl_exec($this->curl);
$return = false;
if (!curl_errno($this->curl)) {
$parts = explode('.', $fileName);
$ext = array_pop($parts);
$return = sfConfig::get('sf_upload_dir') . '/tmp/' . uniqid('fbphoto') . '.' . $ext;
file_put_contents($return, $response);
}
return $return;
}


/**
* cURL callback function for reading and processing headers.
* Override this for your needs.
*
* @param object $ch
* @param string $header
* @return integer
*/
private function readHeader($ch, $header) {


//Extracting example data: filename from header field Content-Disposition
$filename = $this->extractCustomHeader('Location: ', '\n', $header);
if ($filename) {
$this->response_meta_info['fileUrl'] = trim($filename);
}
return strlen($header);
}


private function extractCustomHeader($start, $end, $header) {
$pattern = '/'. $start .'(.*?)'. $end .'/';
if (preg_match($pattern, $header, $result)) {
return $result[1];
}
else {
return false;
}
}


public function getHeaders() {
return $this->response_meta_info;
}


/**
* Cleanup resources
*/
public function shutdown() {
if($this->curl) {
curl_close($this->curl);
}
}
}

一种方法是在他的答案中使用代码Gamlet发布:

  • 保存为curl.php

  • 然后在你的文件中:

    require 'curl.php';
    
    
    $photo="https://graph.facebook.com/me/picture?access_token=" . $session['access_token'];
    $sample = new sfFacebookPhoto;
    $thephotoURL = $sample->getRealUrl($photo);
    echo $thephotoURL;
    

I thought I would post this, because it took me a bit of time to figure out the particulars... Even though profile pictures are public, you still need to have an access token in there to get it when you curl it.

博客文章抓取一个Facebook图形对象的图片可能提供另一种形式的解决方案。使用教程中的代码以及Facebook的图形API和它的PHP SDK库。

... 并且尽量不要使用函数(除非你准备好面对后果-参见File_get_contents vs curl)。

显示:

50×50像素

<img src="//graph.facebook.com/\{\{fid}}/picture">

200像素宽度

<img src="//graph.facebook.com/\{\{fid}}/picture?type=large">

保存(使用PHP)

注意:不要用这个。请看下面@ forever的评论。

$img = file_get_contents('https://graph.facebook.com/'.$fid.'/picture?type=large');
$file = dirname(__file__).'/avatar/'.$fid.'.jpg';
file_put_contents($file, $img);

$fid是你在Facebook上的用户id。

注意:对于标记为“18+”的图像,您将需要18+用户的有效access_token:

<img src="//graph.facebook.com/\{\{fid}}/picture?access_token=\{\{access_token}}">

2015年更新:

Graph API v2.0不能使用用户名查询,你总是使用应该

获取图片URL,而不是二进制内容:

$url = "http://graph.facebook.com/$fbId/picture?type=$size";


$headers = get_headers($url, 1);


if( isset($headers['Location']) )
echo $headers['Location']; // string
else
echo "ERROR";

你必须使用你的FACEBOOK ID,而不是用户名。你可以在那里获得你的facebook id:

http://findmyfbid.com/

更新: < br >

从2012年8月底开始,API已经更新,允许您检索不同大小的用户头像。添加可选的宽度和高度字段作为URL参数:

https://graph.facebook.com/USER_ID/picture?width=WIDTH&height=HEIGHT

其中WIDTHHEIGHT是你请求的维度值。

这将返回一个最小大小为WIDTH x HEIGHT的头像,同时尝试保留纵横比。例如,

https://graph.facebook.com/redbull/picture?width=140&height=110

返回

    {
"data": {
"url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/s148x148/2624_134501175351_4831452_a.jpg",
"width": 148,
"height": 117,
"is_silhouette": false
}
}

最后更新

要获取用户的头像,请呼叫

https://graph.facebook.com/USER_ID/picture

其中USER_ID可以是用户id号或用户名。

要获取特定大小的用户头像,请调用

https://graph.facebook.com/USER_ID/picture?type=SIZE

哪里SIZE应该替换为其中一个单词

square
small
normal
large

这取决于你想要的尺寸。

这个调用将返回一个URL到一个图像,它的大小基于你选择的类型参数。

例如:

https://graph.facebook.com/USER_ID/picture?type=small

返回图像的一个小版本的URL。

API只指定配置文件图像的最大大小,而不是实际大小。

广场:

最大宽度和高度为50像素。

最大宽度为50像素,最大高度为150像素。

正常的

最大宽度为100像素,最大高度为300像素。

最大宽度为200像素,最大高度为600像素。

如果你调用默认的USER_ID/picture,你会得到方形类型。

澄清

如果你打电话(如上例所示)

https://graph.facebook.com/redbull/picture?width=140&height=110

它将返回一个JSON响应如果你使用的是Facebook sdk的请求方法。否则它将返回图像本身。要始终检索JSON,添加:

&redirect=false

像这样:

https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false

我在想——也许ID将是一个有用的工具。每当用户创建一个新帐户时,它应该获得一个更高的ID。我谷歌了一下,发现有一种方法可以通过ID来估计帐户创建日期,Massoud Seifi从metadatascience.com收集了一些关于它的好数据。

Enter image description here

阅读这篇文章:

http://metadatascience.com/2013/03/11/inferring-facebook-account-creation-date-from-facebook-user-id/

下面是一些可以下载的id:

http://metadatascience.com/2013/03/14/lookup-table-for-inferring-facebook-account-creation-date-from-facebook-user-id/

@NaturalBornCamper,

好的代码!这里是一个简洁的代码函数这样的过程!

function get_raw_facebook_avatar_url($uid)
{
$array = get_headers('https://graph.facebook.com/'.$uid.'/picture?type=large', 1);
return (isset($array['Location']) ? $array['Location'] : FALSE);
}

这将返回生< em > < / em > Facebook头像图像URL。那你想怎么处置就怎么处置吧!

简单的一行代码,保存完整尺寸的档案图像在您的服务器上。

<?php


copy("https://graph.facebook.com/FACEBOOKID/picture?width=9999&height=9999", "picture.jpg");


?>

只有在php.ini中启用了openssl,这才有效。

将此作为已接受答案的评论,但觉得它值得更长的解释。从2015年4月开始,这可能会提高几次。

在图形api的V2中,接受的答案不再使用用户名。现在你首先需要userid,你不能再使用用户名来获取这个。更复杂的是,出于隐私原因,Facebook现在正在改变每个应用的用户id(见https://developers.facebook.com/docs/graph-api/reference/v2.2/user/https://developers.facebook.com/docs/apps/upgrading/#upgrading_v2_0_user_ids),所以你必须有某种适当的身份验证来检索你可以使用的用户id。从技术上讲,个人资料图片仍然是公开的,可以在/userid/picture(参见文档在https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture和这个示例用户:http://graph.facebook.com/v2.2/4/picture?redirect=0),然而,仅根据他们的个人资料计算出用户的标准用户id似乎是不可能的-你的应用程序需要让他们批准与应用程序的交互,对于我的用例(只是在他们的FB个人资料链接旁边显示个人资料图片)是多余的。

如果有人想出了一种方法来获得基于用户名的个人资料图片,或者,如何获得一个用户id(甚至是一个交替的)来检索个人资料图片,请分享!与此同时,旧的图形url在2015年4月之前仍然有效。

2015年4月开始的工作PHP (HTTP GET)解决方案(不含PHP 5 SDK):

function get_facebook_user_avatar($fbId){
$json = file_get_contents('https://graph.facebook.com/v2.5/'.$fbId.'/picture?type=large&redirect=false');
$picture = json_decode($json, true);
return $picture['data']['url'];
}

你可以在参数中更改“类型”:

广场:

最大宽度和高度为50像素。

最大宽度为50像素,最大高度为150像素。

正常的

最大宽度为100像素,最大高度为300像素。

最大宽度为200像素,最大高度为600像素。

你关心头像大小吗?在使用PHP实现登录Facebook时。我们将向您展示在Facebook PHP SDK中获得大尺寸头像的简单方法。此外,您还可以获得自定义大小的Facebook个人资料的图像。

使用下面的代码行设置头像尺寸。

$userProfile = $facebook->api('/me?fields=picture.width(400).height(400)');

查看这个帖子:http://www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/

URI  = https://graph.facebook.com/{}/picture?width=500'.format(uid)

你可以通过在线facebook id查找工具获取配置文件URI

你也可以通过类型参数可能的值小,正常,大,平方。

引用官方文档