使用facebook API上传图片

时间:2009-10-05 03:48:08

标签: php api facebook upload photo

问题:如何通过FB API将图像从我的网络服务器上传到Facebook?

我正在编写一个应用程序,用于从用户的相册中检索图像,进行一些修改(例如添加水印),然后将其发送回相册。

我用来上传照片的代码如下

<?php
include_once("api/facebook.php");
include_once("config.php");
include_once("utils.php");
include_once("bemyfans.php");
$facebook=new Facebook($api_key,$app_secret);
$facebook->require_frame();
$user=$facebook->require_login();
echo "<p>Hello <fb:name useyou='false' uid=\"$user\"/></p>";
$args = array(
  'api_key' => $api_key,
  'call_id'=>microtime(true),
  'v'=>'1.0',
  'format' => 'JSON'
);
$args['Lenna.png']="@/home/thoai/htdocs/apps/bemyfans/Lenna.png";
signRequest($args,$secret);
$ch = curl_init();
$url = 'http://api.facebook.com/restserver.php?method=photos.upload';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
if ($data = curl_exec($ch)) echo "done";
echo $data;

function signRequest(&$args, $secret){
  ksort($args);
  $sig = '';
  foreach($args as $k => $v){
    $sig .= $k . '=' . $v;
  }
  $sig .= $secret;
  $args['sig'] = md5($sig);
}
?>

它不起作用。更具体地说,我不断收到“不正确的签名”消息。

代码有什么问题???

4 个答案:

答案 0 :(得分:2)

此问题中的代码使用过时的REST API ,很快就会停止使用。

现在正确的方法是:

$fbk = new Facebook(/* conf */);
$fbk->setFileUploadSupport(true);

//If you are executing this in a script, and not in a web page with the user logged in:
$fbk->setAccessToken(/* access token from other sources */);

//To add to an album:
$fbk->api("/$albumId/photos", "POST", 
          array('source' => '@'. realpath($myPhoto), 'message'  => "Nice photo"));

//To upload a photo directly (the album will be created automatically):
$fbk->api("/me/photos", "POST", 
          array('source' => '@'. realpath($myPhoto), 'message'  => "Nice photo"));

请记住$fbk->setFileUploadSupport(true);

答案 1 :(得分:0)

从错误判断,您的请求未正确签名。

我快速浏览了一下facebook API文档,你的signRequest()函数对我来说是正确的。

所以我建议你检查一下:你的$ secret是正确的。

编辑:您对评论中问题的回答让我现在看到了。我不知道facebook服务器如何处理二进制数据和签名,但你的签名是基于@ -prefixed路径名。 Facebook从未看到该路径名,因为cURL发送文件内容。因此,Facebook无法重建签名并进行验证。

检查facebook文档,了解您正在进行的通话。您可能需要省略签名生成中的文件,或者对其进行base64编码,或者谁知道什么。

但很明显,你的代码正在发送一个facebook无法验证的签名,因为它在你的请求中看不到任何类似于“@ / home / thoai / htdocs / apps / bemyfans / Lenna.png”的内容。

答案 2 :(得分:0)

您正在使用包括file参数在内的所有参数对请求进行签名。要获得正确的签名,您需要在参数中签署而不是文件参数。

答案 3 :(得分:-1)

我认为你做错了 看看我的代码

$appapikey = 'keykeykey';
$appsecret = 'secretcesret';
$facebook = new Facebook($appapikey, $appsecret);
$user=$facebook->require_login()

$facebook->api_client->photos_upload($file, null, "A test Photo", $user);

这对我有用