2009-10-05 148 views
1

問:如何通過FB API將圖像從我的網絡服務器上傳到Facebook?使用facebook API上傳圖像

我正在編寫一個應用程序,從用戶的相冊中檢索圖像,進行一些修改(例如添加水印),然後將其發送回相冊。

我用它來上傳相片中的代碼如下

<?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

什麼'的$ args [ 'Lenna.png'] =「@ /家庭/ thoai/htdocs中/是的''@爲apps/bemyfans/Lenna.png「;'? – 2009-10-05 03:49:50

+0

是的,那是什麼? – timdev 2009-10-05 03:53:36

+0

cURL將發送文件的內容而不是文件名。 – thoaionline 2009-10-05 04:22:24

回答

0

從錯誤判斷,您的請求未被正確簽名。

我快速瀏覽了facebook API文檔,並且您的signRequest()函數看起來對我來說很合適。

所以我建議你檢查一下顯而易見的事實:你的$祕密是正確的。

編輯:你對問題的回答讓我現在就看到它。我不知道Facebook服務器如何處理二進制數據和簽名,但是您的簽名是基於@前綴路徑名。 Facebook從不會看到該路徑名,因爲cURL發送文件內容。所以facebook沒有辦法重建簽名並驗證它。

查看您正在非常仔細地打電話的Facebook文檔。您可能需要從您的簽名生成或base64編碼中省略該文件,或者誰知道什麼。

但很明顯,您的代碼正在發送Facebook無法驗證的簽名,因爲它在您的請求中從不會看到類似「@/home/thoai/htdocs/apps/bemyfans/Lenna.png」的任何內容。

0

您正在使用包括文件參數在內的所有參數來簽名請求。要獲得正確的簽名,您需要簽署請求而不是 args中的文件參數。

+0

請擴大您的答案。 – 2012-12-29 20:00:55

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

這對我的作品

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

相關問題