问题:如何通过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);
}
?>
它不起作用。更具体地说,我不断收到“不正确的签名”消息。
代码有什么问题???
答案 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);
这对我有用