Загрузить изображение с API facebook

Вопрос: Как загрузить изображение с моего веб-сервера в facebook через FB 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); } ?> 

Это просто не работает. В частности, я продолжаю получать сообщение «Неправильная подпись».

Что не так с кодом ???

Код в этом вопросе использует устаревшие API REST , которые скоро будут прекращены.

Правильный способ:

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

Судя по ошибке, ваш запрос не подписан должным образом.

Я быстро просмотрел документы API facebook, и ваша функция signRequest () выглядит правильно для меня.

Поэтому я предлагаю вам проверить очевидное: ваш секретный пароль правильный.

EDIT: ваш ответ на вопросы в комментариях заставил меня увидеть это сейчас. Я не знаю, как серверы facebook имеют дело с двоичными данными и сигнатурами, но ваша подпись основана на этом @ -prefixed пути. Facebook никогда не видит этот путь, поскольку cURL отправляет содержимое файла. Таким образом, нет возможности, чтобы facebook мог восстановить подпись и проверить ее.

Проверьте документы facebook на призыв, который вы делаете очень осторожно. Возможно, вам нужно будет опустить файл из поколения подписи или закодировать его base64 или кто знает что.

Но ясно, что ваш код отправляет подпись, которую невозможно проверить в facebook, поскольку в вашем запросе он никогда не видит ничего удаленного «@ / home / thoai / htdocs / apps / bemyfans / Lenna.png».

Вы подписываете запрос, используя все аргументы, включая аргумент файла. Чтобы получить правильную подпись, вам нужно подписать запрос без аргумента файла в args.

Я думаю, вы делаете все это неправильно. Посмотрите на мой код.

 $appapikey = 'keykeykey'; $appsecret = 'secretcesret'; $facebook = new Facebook($appapikey, $appsecret); $user=$facebook->require_login() $facebook->api_client->photos_upload($file, null, "A test Photo", $user); 

Это работает для меня