PHP – Carregar uma foto hospedada na web para o álbum do Facebook via Graph API

Estou tentando carregar arquivos hospedados em www (por exemplo, http://img.bestphpide.com/php/logo1w.png ) para um álbum no Facebook.

Criar um álbum funciona muito bem, mas não parece fazer o upload de fotos. Estou usando o php-sdk do facebook ( http://github.com/facebook/php-sdk/ ) e os exemplos que eu já tentei são:

Carregar foto para o álbum com a API de gráfico do Facebook

Como posso fazer upload de fotos para o álbum usando o Facebook Graph API

Estou supondo que os carregamentos da CURL talvez apenas possam gerir arquivos armazenados localmente e não hospedados na web.

Aqui está o meu código:

/* Try 1: $data = array(); $data['message'] = $attachment->post_title; $data['file'] = $attachment->guid; try { $photo = $facebook->api('/' . $album['id'] . '/photos?access_token=' . $session['access_token'], 'post', $data); } catch (FacebookApiException $e) { error_log($e); } */ // Try 2: //upload photo $file = $attachment->guid; $args = array( 'message' => 'Photo from application', ); $args[basename($file)] = '@' . realpath(file_get_contents($file)); $ch = curl_init(); $url = 'https://graph.facebook.com/' . $album['id'] . '/photos?access_token=' . $session['access_token']; 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); $data = curl_exec($ch); //returns the photo id print_r(json_decode($data,true)); 

… onde attachment-> guid contém a url da foto.

Estou preso agora …

Eu acho que o problema está aqui:

 $args[basename($file)] = '@' . realpath(file_get_contents($file)); 

uma vez que você deseja publicar uma imagem de outra fonte (certo?), você deve salvá-la temporariamente em seu próprio host.

Eu também precisava fazer algo assim e, como eu tinha que processar a imagem, eu usei o seguinte caminho:

 $im = @imagecreatefrompng('http://img.bestphpide.com/php/logo1w.png'); imagejpeg($im, 'imgs/temp/temp.jpg', 85); $args['image'] = '@' . realpath('imgs/temp/temp.jpg'); 

o resto parece bem embora

Sugiro usar o SDK do Facebook php , será mais fácil e o código funcionará com futuras atualizações das APIs:


Usando o Graph API php sdk:

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

Usando cURL diretamente:

Se você deseja realmente usar o CURL, seu código é quase correto, mas o erro está na matriz $ args:

 $args = array( 'message' => 'Photo from application', 'source' => file_get_contents($file) ); 

Como a chave para os dados da foto é source , veja o Doc. Do Facebook


Nota no @ em cURL:

Observe também que o @ in cUrl significa que o parâmetro será substituído pelos bytes reais do arquivo que segue o @ , portanto, não é necessário se você já colocar no parâmetro de source os bytes reais.

Estou supondo que os carregamentos da CURL talvez apenas possam gerir arquivos armazenados localmente e não hospedados na web.

Não, esse não é o caso.

Mas você precisa fornecer o URL HTTP completo, acessível ao público para a imagem, sem um @ na frente – e você deve usar o url nome do parâmetro para esse valor.

https://developers.facebook.com/docs/reference/api/photo/ :

Você também pode publicar uma foto fornecendo um url com o URL da foto.