Загрузить изображение с помощью 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);
}
?>

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

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


person thoaionline    schedule 05.10.2009    source источник
comment
Что означает @ в $args['Lenna.png']="@/home/thoai/htdocs/apps/bemyfans/Lenna.png";?   -  person meder omuraliev    schedule 05.10.2009
comment
CURL отправит содержимое файла, а не имя файла.   -  person thoaionline    schedule 05.10.2009
comment
Ах, ну вот почему. См. Мой обновленный ответ.   -  person timdev    schedule 05.10.2009


Ответы (4)


Код в этом вопросе использует устаревшие 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);

person Madarco    schedule 03.05.2013

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

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

Поэтому я предлагаю вам проверить очевидное: ваш $ secret верен.

РЕДАКТИРОВАТЬ: Ваш ответ на вопросы в комментариях заставляет меня видеть это сейчас. Я не знаю, как серверы facebook работают с двоичными данными и подписями, но ваша подпись основана на этом имени пути с префиксом @. Facebook никогда не видит этот путь, поскольку cURL отправляет содержимое файла. Таким образом, facebook не может восстановить подпись и проверить ее.

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

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

person timdev    schedule 05.10.2009

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

person Bradly Feeley    schedule 18.02.2010
comment
Пожалуйста, расширите свой ответ. - person Lee Taylor; 30.12.2012

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

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

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

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

person Akintayo A. Olusegun    schedule 26.03.2010