Загрузить изображение с помощью Facebook API - PullRequest
1 голос
/ 05 октября 2009

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

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

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

Ответы [ 4 ]

2 голосов
/ 03 мая 2013

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

0 голосов
/ 18 февраля 2010

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

0 голосов
/ 26 марта 2010

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

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

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

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

0 голосов
/ 05 октября 2009

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

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

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

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

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

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

...