2009-10-05 7 views
1

Question: Comment télécharger une image depuis mon serveur web vers Facebook via FB API? Je suis en train d'écrire une application qui récupère des images de l'album photo de l'utilisateur, apporte quelques modifications (par exemple en ajoutant un filigrane) puis le renvoie à l'album photo.Télécharger une image avec l'API facebook

Le code que j'utilise pour télécharger la photo est la suivante

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

Il ne fonctionne tout simplement pas. Plus spécifiquement, je reçois toujours un message "Signature incorrecte".

Quel est le problème avec le code ???

+0

Quel est le '' @ dans '$ args [ 'Lenna.png'] =" @/home/Thoai/htdocs/apps/bemyfans/Lenna.png ";'? –

+0

Ouais, qu'est-ce que c'est? – timdev

+0

cURL enverra le contenu du fichier et non le nom de fichier. – thoaionline

Répondre

0

À en juger par l'erreur, votre demande n'est pas signée correctement.

J'ai jeté un coup d'œil sur les docs de l'API facebook, et votre fonction signRequest() me semble juste.

Alors je vous suggère de vérifier l'évidence: que votre secret $ est correct.

EDIT: Votre réponse aux questions contenues dans les commentaires m'a incité à le voir maintenant. Je ne sais pas comment les serveurs de facebook traitent des données et des signatures binaires, mais votre signature est basée sur ce pathname @ -prefixed. Facebook ne voit jamais ce chemin, car cURL envoie le contenu du fichier. Il n'y a donc aucun moyen que facebook puisse reconstruire la signature et la vérifier.

Consultez les docs facebook pour l'appel que vous faites très attentivement. Vous devrez peut-être omettre le fichier de votre génération de signature, ou encoder base64, ou qui sait quoi.

Mais il est clair que votre code envoie une signature que facebook ne peut pas vérifier, car il ne voit jamais rien ressemblant vaguement à "@/home/thoai/htdocs/apps/bemyfans/Lenna.png" dans votre requête.

0

Vous signez votre demande en utilisant tous les arguments, y compris l'argument du fichier. Pour obtenir une signature correcte, vous devez signer la demande sans l'argument du fichier dans les arguments.

+0

Veuillez développer votre réponse. –

-1

Je pense que vous faites tout faux Regardez mon code

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

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

Cela fonctionne pour moi

2

Le code de cette question utilise les API REST obsolètes, qui va bientôt être abandonnée .

La manière correcte est maintenant:

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

Rappelez-vous le $fbk->setFileUploadSupport(true);

Questions connexes