1

问题:如何通过 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

4 回答 4

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);

于 2013-05-03T08:50:23.327 回答
0

从错误来看,您的请求没有正确签名。

我快速浏览了 facebook API 文档,您的 signRequest() 函数看起来对我来说很合适。

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

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

检查 facebook 文档以了解您正在非常仔细地拨打电话。您可能需要从签名生成中省略该文件,或者对其进行 base64 编码,或者谁知道呢。

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

于 2009-10-05T04:08:18.343 回答
0

您正在使用所有参数(包括文件参数)签署您的请求。要获得正确的签名,您需要在 args 中不带文件参数的情况下签署请求。

于 2010-02-18T00:14:41.623 回答
-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);

这对我有用

于 2010-03-26T16:03:09.253 回答