Manipulando fotos no facebook com sdk para php
Introdução
Neste artigo vamos aprender algumas dicas sobre como manipular imagens/fotos no facebook através de uma app usando o sdk do PHP: upload e marcação de fotos, enviando fotos para fanpage e diretamente para dentro de álbums.
Para que você possa utilizar os scripts abaixo é preciso que você crie uma aplicação no facebook. Caso tenha dúvidas de como criar apps para o facebook, acesse meu artigo anterior que trata sobre desse assunto.
Publicando fotos no perfil do usuário
O script abaixo é um aplicativo do facebook que simplesmente publica fotos diretamente no perfil do usuário. Como não estamos especificando nenhum álbum, a foto é inserida dentro de um álbum especial que tem o mesmo nome do aplicativo que você criou no facebook. Caso o álbum não exista, ele será criado. Altere o appid e o secret code de acordo com a sua aplicação.
<?php include "facebook-php-sdk-master/src/facebook.php"; // APP Config define('APP_ID', ''); define('APP_SECRET', ''); // Cria a instancia da aplicacao, informando o appid e o secret $facebook = new Facebook(array( 'appId' => APP_ID, 'secret' => APP_SECRET, )); // habilita suporte para upload de arquivos $facebook->setFileUploadSupport(true); // obtem o id do usuario $user = $facebook->getUser(); if ($user) { // usuario logado try { // verificar permissao $permissions = $facebook->api("/me/permissions"); $perms = []; foreach($permissions['data'] as $perm) { if($perm['status'] == 'granted') { $perms[] = $perm['permission']; } } // solicita a permissao ate que o usuario aceite para poder continuar if(!in_array('publish_actions', $perms)) { $loginUrl = $facebook->getLoginUrl(array('scope' => 'publish_actions, user_photos')); header("Location: " . $loginUrl); exit; } // publicar foto // dados para envio da publicacao da foto $post_data = array( "message" => "teste_" . time(), "image" => '@' . realpath("resources/douglas.jpg"), // localizacao da foto ); // publica foto na timeline $data['photo'] = $facebook->api("/me/photos", "post", $post_data); echo "Foto publicada com sucesso!"; } catch (FacebookApiException $e) { // tratamento de excecao echo($e); $user = null; } } else { // usuario nao logado, solicitar autenticacao e permissão publish_actions $loginUrl = $facebook->getLoginUrl(array('scope' => 'publish_actions')); echo "<a href=\"$loginUrl\">Facebook Login</a><br />"; echo "<strong><em>Você não esta conectado..</em></strong>"; }
Alguns pontos a serem destacados no script acima:
- A linha de código abaixo é obrigatória caso esteja fazendo upload de arquivos pela sua aplicação.
// habilita suporte para upload de arquivos $facebook->setFileUploadSupport(true);
$loginUrl = $facebook->getLoginUrl(array('scope' => 'publish_actions'));
// verificar permissao $permissions = $facebook->api("/me/permissions"); foreach($permissions['data'] as $perm) { if($perm['status'] == 'granted' && $perm['permission'] == 'publish_actions') { // publicar foto // ... } }
// publica foto na timeline $data['photo'] = $facebook->api("/me/photos", "post", $post_data);
Marcando (tagging) fotos
Através da Graph API do facebook é possível fazer marcação nas fotos publicadas pelo usuário diretamente pelo App. É importante ter o ID do usuário de facebook que deseja marcar na foto. Veja exemplo abaixo como marcar o próprio usuário na foto publicada.
// dados da marcacao $tag = array ( 'tag_uid' => $user, 'x' => 10, 'y' => 10, ); $tags[] = $tag; // dados para envio da publicacao da foto $post_data = array( "message" => "teste_" . time(), "image" => '@' . realpath("resources/douglas.jpg"), // localizacao da foto "tags" => $tags, // tags ); // publica foto na timeline com marcacao $facebook->api("/me/photos", "post", $post_data);
Observações:
- É possível fazer no máximo 40 marcações em uma foto.
- Você pode obter a lista de amigos (com os IDs) que também aceitaram o mesmo aplicativo fazendo uma requisição em /me/friends solicitando a permissão user_friends.
- Na marcação você pode especificar a posição x-y que deseja marcar na foto.
Publicando fotos direto no álbum
Nos exemplos anteriores vimos como publicar fotos direto no perfil do usuário. As fotos serão publicadas em um álbum que contém o mesmo nome da aplicação do facebook. Porém, é possível especificar que a foto seja publicada diretamente em um álbum específico. O primeiro passo é já ter esse álbum criado e estar com o ID dele em mãos.
Obter o id do álbum é bem simples. Entre na área de Fotos do perfil, edite o álbum desejado e obtenha o id da URL aberta no navegador:
No caso acima, o id do álbum será: 10200673377473382
Antes de continuar com a publicação é importante ressaltar que para publicação em outros albums vamos precisar da permissão user_photos além da publish_actions. Portanto devemos solicitá-la também:
$loginUrl = $facebook->getLoginUrl(array('scope' => 'publish_actions, user_photos'));
Com o id do álbum em mãos, agora é só utilizar ele na chamada de publicação de fotos. Troque a linha abaixo:
$data['photo'] = $facebook->api("/me/photos", "post", $post_data);
por:
$data['photo'] = $facebook->api("/10200673377473382/photos", "post", $post_data);
Observações:
- Com a permissão user_photos é possível obter a lista completa dos albums do usuário com seus respectivos ids fazendo uma requisição em /me/albums:
$albums = $facebook->api('/me/albums', 'get');
- Garantindo que o usuário aceitou também a permissão user_photos:
// solicita a permissao ate que o usuario aceite para poder continuar if(!in_array('publish_actions', $perms) || !in_array('user_photos', $perms)) { $loginUrl = $facebook->getLoginUrl(array('scope' => 'publish_actions, user_photos')); header("Location: " . $loginUrl); exit; }
que post maravilhoso, muito bem explicado. parabéns
Fala Cara, legal esse post hein!?!? Usaria essa base para conseguir personalizar a foto de um usuário? Exemplo, o cara entra na aplicação e escolhe uma imagem que virá em cima da imagem atual dele de exibição, algo do tipo, “Rock in Rio Eu Fui!”
Olá Fabio, não é possível alterar a foto do perfil do usuário pelo sdk por questões de segurança. Veja o link abaixo. Tem algumas alternativas.. mas não existe uma forma automática.
http://stackoverflow.com/questions/1648859/can-i-set-a-users-profile-image-using-the-facebook-api
Parabéns mano!
Bastante informação útil. Já favoritei seu tópico!
Olá Douglas,
Primeiramente, parabéns pelo POST. Se possível gostaria de sua ajuda, consegui enviar a foto pra fanpage com o script php, porém a foto só aparece para o usuário que enviou/admin da fanpage e não para os demais usuários. Sabe me dizer o que pode ser?
Olá Ezequiel,
Para que o usuário receba as fotos na sua linha de tempo é preciso que ele curta a fanpage e faça uma navegação nas fotos publicadas. Após o usuário demonstrar “interesse” na fanpage, ele irá começar a receber as atualizações na sua linha de tempo. Mesmo assim, o facebook não irá enviar todas publicações, mas somente aquelas que acha relevante para o usuário.
Obrigado pela resposta. Mas o que está acontecendo é que mesmo um usuário que já curtiu não está visualizando as fotos, ou seja, se ele acessar diretamente a fanpage por exemplo: https://www.facebook.com/pages/Tomazinisistemas/110001802481920?ref=hl irá aparecer somente 1 foto no álbum, pra mim que sou o administrador da fanpage aparece todas as outras que enviei via script php.
e se eu enviar a foto direto pela fanpage aparece para os outros usuários, só não aparece se eu enviar pelo script php,
Veja Douglas, eu como administrador da página: http://www.tchat.com.br/admin.png
um usuário normal que acessa a fanpage: http://www.tchat.com.br/normal.png
Se eu enviar a foto diretamente pela fanpage aparece tanto pra mim quando para os outros usuários que acessarem a fanpage, e o que eu queria é que as fotos enviadas pelo script php também fossem visualizadas pelos demais usuários.
Ezequiel, não tive esse problema por aqui. Aconselho que entre nas configurações de permissão de sua fanpage (Editar Página -> Gerenciar Permissões) e tente mudar os parâmetros. Veja se algum faça efeito.
Boa sorte.
Douglas, parabéns pelo trabalho. Artigos bem explicados. Estou começando a testar estas aplicações e gostaria de publicar uma foto de uma URL específica e não consegui. Alguma dica? Veja o erro.
Warning: curl_setopt_array() [function.curl-setopt-array]: open_basedir restriction in effect. File() is not within the allowed path(s): (/home/hulahulabrazil/:/tmp:/usr/local/lib/php:./) in /home/hulahulabrazil/www/facebook/src/base_facebook.php on line 936
CurlException: 3: No URL set!
Fabio, Obrigado pelo contato.
O problema parece ser com uma configuração no php.ini do seu ambiente. É a diretiva open_basedir que esta bloqueando o acesso ao arquivo na URL.
O open_basedir limita os locais onde sua aplicação pode acessar arquivos, no caso somente /home/hulahulabrazil/, /tmp, /usr/local/lib/php!
Ou você coloca a imagem que deseja publicar em um desses diretórios ou você modifica o open_basedir no php.ini para remover a limitação. Isso caso você possua permissões para isso.
Boa sorte!
Opa, tudo bem? Obrigado por compartilhar conhecimento.
Estou desenvolvendo um app no face (um game em Flash) onde o usuário fará uma foto de si mesmo e eu guardarei em alguma pasta do servidor. Gostaria de saber como ficaria essa linha
“image” => ‘@’ . realpath(“douglas.jpg”), // localizacao da foto
para este caso.
Preciso manter o @ ou realpath ou simplesmente insiro entre aspas a url absoluta da imagem?
Obrigado
Olá Fabio, tudo joia! Obrigado pelo contato.
Você precisa manter o @ no início do caminho da imagem de qualquer forma.
Já o realpath não é obrigatório! Ele foi usado para gerar o caminho absoluto onde a imagem esta localizada no servidor.
Portanto, você pode usarda seguinte forma:
“image” => “@/var/www/upload/imagem.jpg”,
Vlw Pasquati, acabei fazendo como tava, é até mais simples mesmo. muito grato
Pasqua, mais uma dúvida. Na verdade ajuda.
Resolvi as questões de publicação e tudo mais, porém me pintou outra necessidade. Precisaria fazer isso descrito em seu post, mas com a biblioteca em javascript. Explico:
O game é em Flash e ao final faço uma foto do usuário… essa foto poderá ser compartilhada no mural dele. Disparo uma ação do flash ExternalInterface para acionar o js. Já fiz isso para enviar mensagem e tb achei algumas coisas na net, mas todos formatados como mensagem estilo foto pequena na esquerda+titulo+descrição ao lado da miniatura, porém preciso que seja nesse formato que ensinou aqui… imagem grande com descrição, como sendo uma imagem postada. Tem alguma luz?
obrigado
Resolvi com o PHP mesmo, usei POST e seu código externo. abs
Legal que funcionou Fábio! Boa sorte! Abs!
O primeiro codigo seria o index
Os codigos que estão dentro de “Marcando (tagging) fotos” seriam dentro do index tbm ?
oi Gustavo,
Sim, os códigos em “Marcando (tagging) fotos” também seriam dentro do mesmo código inicial (index)
É uma continuação do primeiro bloco de código.
A marcação da foto é feito logo depois da linha:
Além disso é necessário substituir a parte de solicitação de permissões no primeiro código:
por:
Eu incomodando de novo ! Deu certo, ta postando direito e tals, mas não está marcando a foto ! Sabe informar o erro ?
http://mecutuque.net76.net/APP/a
Eu incomodando de novo ! Deu certo, ta postando direito e tals, mas vc sabe como marcar um amigo ?? Queria marcar meus amigos nas fotos ! Desconsidere as duas ultimas perguntas
É possível eu postar uma imagem com link externo? Quando clicar na minha foto ele ir para uma página externa ao invez de abrir a foto?
Olá Walfredo,
Verifique meu outro post sobre o assunto: Facebook php sdk, postando mensagens no mural do usuário (Mais especificamente na seção Linkando uma imagem no post).
É criado um link externo da imagem no post (Não é feito o upload da imagem para o facebook)! No artigo manipulando fotos no facebook com sdk para php a imagem é inserida dentro de um álbum dentro do facebook. Nesse método, pelo que eu sei, não há uma forma de direcionar o usuário para um link externo.
Boa sorte!
Como faço para sobrepor a imagem do perfil a imagem que escolhi para ser publicada ? é possível ?
Olá Jerfeson, Não existe uma forma automática de sobrepor a imagem do perfil através da API do Facebook por questões de segurança.
Boa sorte!
Então existe alguma maneira de alternar a foto publicada com um OU ? por exemplo cada vez que abrir o app, uma imagem diferente ser publicada ?
oi Jerfeson,
Sim é possível publicar uma foto no seu mural do usuário sempre que ele acessar o seu app. É só inserir uma rotina abaixo no script que é executado quando ele acessa sua app:
É só inserir a imagem desejada no lugar do “douglas.jpg”. A imagem ser gerada aleatoriamente se desejar.
Boa sorte!
ola pasquati muti bom o blog,gostaria que me tirasse uma pequena duvida,pr exemplo nessa string aki
// dados para envio da publicacao da foto
$post_data = array(
“message” => “teste_” . time(),
“image” => ‘@’ . realpath(“douglas.jpg”), // localizacao da foto
de onde o sdk vai tira a foto? tem como ele escolher uma foto aleatoriamente entre varias e adicionar o nome e a foto do usuario que estiver usando o meu app?
tenho o app todo pronto só está faltando a parte dele buscar uma imagen aleatoria add o nome e imagem do perfil da pessoa e postar na linha do tempo do usuario..
se puder me ajudar eu agradeço
Olá Paulo,
O realpath pede a localização da foto em disco. Normalmente você executa o php em um servidor. Portanto, o realpath esta procurando uma arquivo que esta hospedado no servidor. Caso você esteja fazendo uma aplicação que permite o usuário escolher uma foto, primeiro você terá que fazer com que o usuário faça o upload da foto para o servidor, para depois publicá-la no facebook.
No campo message você pode incluir as informações do usuário. As informações do message serão postadas junto com a imagem.
Boa sorte!
Olá, por vários dias venho pesquisando e nunca e em lugar nenhum encontrei alguma coisa tão rica em detalhes… Parabéns..
Gostaria de saber algumas coisas se puder me ajudar, no caso tenho um aplicativo que pede a permissão do usuario e o grava em um banco de dados, onde posso publicar posteriormente… Na hora que ele aceita o aplicativo, ele automaticamente posta na time dele um postwall, gostaria que tambem pudesse publicar uma determinada foto, e fizesse uma marcação de 10 usuários alto maticamente e randomicamente…
Simplificando é preciso incluir no meu codigo uma postagem de foto na time do meu usuario cadastrado e que essa foto marque 10 amigos aleatoriamente… no caso ele teria que pegar as infos do meu banco como o token por exemplo…
Muito obrigado!
Olá Lennon,
Agradeço pelo feedback. Obrigado!
Sim, é possível automatizar a publicação na timeline do usuário através de access token. Já cheguei até fazer alguns testes por aqui.
Provavelmente teremos publicações sobre esse mecanismo no blog em breve.
Enquanto isso, caso queira estudar mais sobre o assunto, aconselho os seguintes links:
http://developers.facebook.com/docs/concepts/login/access-tokens-and-types/
https://developers.facebook.com/docs/howtos/login/server-side-login/
Boa sorte!
Boa tarde, amigo teri como marcar amigos ao inves de marcar apenas a pessoa que esta publicando? Obrigado
Boa tarde Jeferson,
Sim, é possível marcar outros usuários. Para isso, você irá precisar obter o ID do usuário que deseja marcar.
Para pegar o ID de um usuário:
http://graph.facebook.com/nome_do_usuario
No código, altere o $ID_DO_USUARIO para o ID do usuário que deseja marcar:
Lembre-se que pela API é possível marcar quantos usuários desejar.
Boa sorte!
Cara, desculpa incomodar mas é o seguinte, eu consigo publicar a foto no meu perfil porem se outra pessoa tenta acessar meu link exemplo: http://jeferson.lucianocasale.com/publicaFoto.php tenta acessar ocorre um erro e não publica a foto….
e a respeito da marcação é o seguinte.. esto fazendo um site de balada e ai a pessoa pode olhar as fotos e publicar no album dela se quiser porem gostaria que ela marcasse pessoas…. se ela quiser..
acho que isso ja não é possivel né?
Obrigado
Olá Jeferson,
Em relação ao erro, aconselho verificar na propriedades da sua aplicaçãno, em https://developers.facebook.com/, se o campo Site URL, Website with Facebook Login esta configurado corretamente para
http://jeferson.lucianocasale.com !
Para testar na sua conta novamente, acesse Configurações de Privacidade -> Aplicativos e exclua da lista o seu aplicativo. Faça logoff, reinicie o navegador e teste novamente.
Em relação a marcação, o usuário poderá fazer a marcação das fotos somente após terem sido publicado no facebook. Ou acessando o álbum e marcando ou através de um script conforme esta descrito no artigo.
Boa sorte!
Boa noite, deu certo era um problema na aplicação mesmo, criei uma outra e deu certo… agora como um usuario do site poderia marcar os amigos que ele quisesse? ou seja tem uma foto dele com mais 2 amigos e ele queira marca-los? como ele poderia fazer isso? nem todos usuarios sabem o que significa os ID
Obrigado
Boa noite Jeferson,
Na sua aplicação, você poderia ter a opção do usuário colocar os nomes dos amigos que ele deseja marcar na foto. Via API, você faria uma busca dos nomes que ele digitou, na lista de amigos dele, obteria o ID desses amigos e marcaria eles na foto.
Exemplo de como obter a lista de amigos do usuário:
Outra opção de obter os dados dos amigos, é através de FQL. Veja um exemplo nesse blog:
http://tech.ldg.me/2011/10/fql-query-info-get-facebook-friends-by-first-letter
Veja um exemplo abaixo de como rodar FQL no sdk do PHP:
http://css.dzone.com/news/using-facebook-php-sdk-run-fql
Acho que esse poderia ser um caminho.
Boa sorte!
Problema que para obter a lista de amigos completa demora um bom tempo né
Obrigado pela, ajuda, consegui resolver usando o FQL assim listo todos amigos do usuario pego o uid e o name e assim com checkbox a pessoa pode escolher os amigos que ela quer marcar
vlww
Boa tarde, você mostrou como publicar a foto no perfil, porem se o usuario não tem o aplicativo permitindo o envio de foto ao seu perfil ele faz a solicitação. ate ai beleza, ai ele aceita mas a foto não é publicada e sim so depois que ele tenta novamente publicar a foto.. você sabe me dizer como fazer para que a pessoa consiga publicar logo da primeira vez alias logo depois que ela aceite a permissão? é que no caso estou passando os valores via post e acho que quando ele é redirecionado para a solicitação os dados são perdidos né?
Olá Jeferson,
Tente fazer o seguinte. No script de publicação, identifique o seguinte código: (No final do script):
E troque por:
Boa sorte!
Olá,
tinha uma aplicação rodando com SDK e publicando no meu mural e de todos os meus amigos. O facebook me bloqueou e também apagou minha aplicação. Depois de confirmar diversos amigos, ele voltou a me liberar acesso a minha página, mas minha aplicação foi apagada. Recriei a aplicação, e novamente estou postando as notícias do meu portal, mas agora só posta na minha linha do tempo. Todos meus amigos postam na minha, mas a minha aplicação só posta na minha.
Abs,
Luiz Cláudio
Olá Luiz,
Após ter re-criado sua aplicação, seus amigos precisam acessá-la e permitirem que ela possa publicar na linha do tempo deles.
Essa permissão já foi concedida por eles ? Normalmente para a aplicação poder publicar na linha do tempo deles é necessário aceitar a permissão publish_stream!
Boa sorte!
Olá Pasquati,
esta é uma nova função nas aplicações que o facebook passou adotar a poucos dias! O compatilhamento das notícias de forma pública sempre foi feita pela aplicação anterior de forma automática como se estivesse escrevendo um post no meu mural!! Entendo que quando algum aceita sua amizade, qualquer coisa que um amigo compartilhar, aparece na minha página inicial… da mesma forma vinha acontecendo, mas automáticamente pela aplicativo, compartilhadno uma notícia como se fosse um post que eu criasse na minha página… meu aplicativo não é um jogo, ou algo parecido como data de aniversário que precisamos aceitar, é apenas um sistema de compartilhamento de notícias… considero isso apenas um compartilhamento de uma informação…
Att,
Luiz
Olá, Pasquati!
Mto bacana este post…
Vou ter esse app on line à disposição de várias pessoas para logar e postar.
Percebi que após fazer o login, se eu voltar na página, mesmo tendo feito logout do face, a página continua postando várias fotos no meu álbum.
É possível postar a foto e fazer um logout para o próximo usuário repetir o processo?
Obrigada 😉
Olá Marta,
Na verdade, o que você precisa fazer é criar um controle para não postar mais no mural dos usuários que já acessaram o aplicativo uma vez. Ou criar alguma regra para postar algo diferente quando um usuário acessar sua página novamente. Mas isso depende somente da sua programação.
Uma forma de identificar usuários recorrentes é armazenar o ID dele em uma base de dados local quando ele fizer o acesso pela primeira vez. Caso o usuário acessar sua página novamente, basta verificar se ele é recorrente ou não, verificando o ID dele contra a lista de IDs guardados na sua base local.
Para obter o ID do usuário no facebook é simples:
Boa sorte
Otimo artigo… me ajudou muito, só que pintou algumas dúvidas.
Como faço para manter a autorização e toda vez que ele estiver no site (mesmo entrando sem usar a conta Facebook) quando ele postar eu possa enviar a postagem para o face da pessoa que autorizou anteriormente?
Um exemplo disso é o twitter, Instagram, entre outros que quando a gente posta ele posta automaticamente em nossa timeline.
É um token que devo guardar em um db e se for como eu chamo ele automaticamente quando a pessoa entrar?
Olá Daniel,
Para realizar a postagem no mural do usuário de forma offline, você precisa informar o access token do aplicativo. Outra informação importante é guardar o ID do usuário do facebook em sua base de dados, quando ele realizar o primeiro acesso na sua aplicação.
No artigo abaixo tem um exemplo de como realizar essa postagem:
Facebook sdk, publicação offline no mural do usuário com access token
Lembre-se que estamos falando de postagem no feed de notícias o usuário. No caso de publicação de fotos no perfil do usuário, você precisa obter o access token do usuário e não do aplicativo. Perceba que existe uma diferença entre publicação no feed de notícias e upload de fotos.
Esses aplicativos que postam automaticamente na timeline como você citou, são postagem de feed de noticias e não de upload de fotos. O artigo que mencionei acima trata exatamente desse tipo de postagem.
Para mais detalhes sobre parâmetros que pode usar na postagem, aconselho a verificar meu outro artigo:
Facebook php sdk, postando mensagens no mural do usuário
Boa sorte!
Eu gostei muito do post!! Ajudou muito mesmo….mas tenho uma duvida e não consigo encontrar resposta no sr. google 😀
Gostaria de marcar a foto publicada diretamente na fanpage. Eu adicionei a parte // obter o id da foto publicada anteriormente até a parte de realizando marcação e coloquei entre $data[‘photo’] e o echo. A imagem está subindo para o album e marcando meu nome nela, mas da a seguinte mensagem no app: OAuthException: An unknown error has occurred.
E também não recebe notificação (isso é o de menos).
Será que poderia me ajudar a solucionar este problema?
Obrigado e parabéns!
Olá Guilherme,
Legal que o post te ajudou.
Caso a marcação esteja sendo realizada, provavelmente a exception gerada pelo facebook é por outro motivo.
Tente me enviar mais detalhes sobre o erro (a mensagem completa do exception gerado).
Boa sorte!
Parabéns Douglas, muito boa matéria.
teria como me explicar melhor esta parte abaixo:
$post_data = array(
“message” => “teste_” . time(),
“image” => ‘@’ . realpath(“douglas.jpg”), // localizacao da foto
);
// publica foto na timeline
$data[‘photo’] = $facebook->api(“/me/photos”, “post”, $post_data);
echo “Foto publicada com sucesso!”;
1) Coloco o local da minha foto em “douglas.jpg” mas dá um erro de URL.
2) Como faço para fazer um upload da imagem da minha máquina.
Abraçã0!
Olá Marcio,
Legal que gosto. Obrigado!
Onde você esta rodando o php ? Na sua própria máquina ou em algum servidor?
No caso do exemplo, douglas.jpg, tem que estar na mesma máquina ou servidor onde você esta rodando o PHP.
No exemplo, o arquivo douglas.jpg também deve estar no mesmo diretório onde esta localizado o seu script php. Caso a imagem esteja em outro diretório, você tem que especificar o caminho do arquivo de imagem. Ex:
Boa sorte!
e ae Pasquati, cara esse script envia foto inteira como se estivesse postado normal para o face da pessoa? o meu sistema a pessoa tira foto e quero que ela mande para o face dela. tem como? poderia mandar o script para mim? ja agradeço
oi Diego,
Esse script é utilizado para publicar fotos no perfil do usuário sim. Coloquei um script funcional de exemplo em:
https://gist.github.com/dpasqua/6826980
Existem alguns pré-requisitos para rodar o script. um deles é criar um aplicativo no facebook. Sugiro iniciar através do artigo abaixo:
Criando aplicativos para Facebook usando SDK do PHP
Boa sorte!
e a eDouglas, muito bom o post, mas me diga, como faço para fazer sempre pedir o login e senha do face? pois nao quero que fique gravado, tenho um sistema que os usuarios tiram foto na hora e mandam para o face deles, mas quero que toda hora peça login e senha do face para cada usuario postar em seu face…abraço
Olá Diego, quando o usuário interage com o seu aplicativo facebook, é necessário que o usuário esteja logado no facebook para requisitar permissões ou realizar a postagem de fotos. Caso o usuário não esteja com uma sessão aberta no facebook, será solicitado o login pelo próprio facebook. Caso o usuário já esteja com uma sessão do facebook aberta, não será solicitado o login novamente. Para forçar a solicitação do login, o usuário teria que fazer o logoff no facebook primeiro. Através da API, usando javascript, é possível redirecionar o usuário para fazer logoff, veja exemplo:
http://stackoverflow.com/questions/2764436/facebook-oauth-logout
Não acredito ser o melhor caminho, mas talvez seja o mais próximo do que você precisa. Caso consiga alguma solução mais eficiente, por favor, compartilhe conosco.
Obrigado e boa sorte!
Boa noite.
Parabéns! Difícil encontrar pessoas no nosso meio que aceitem compartilhar as informações… e com a autoridade que você tem então, nem se fala.
Minha situação é a seguinte: tenho uma aplicação que recebe informações e uma foto de um formulário. No primeiro momento, o aplicativo recebe por post as informações e monta uma nova imagem, acrescentando à foto que foi carregada as informações (que também são salvas em uma tabela). Aí o sistema pede autorização para publicar no site a imagem criada. Nesse momento, queremos enviar a mesma foto para o mural do usuário, só que até o momento o usuário não acessou a api do face para verificar se está logado e dar as permissões.
Minha preocupação é, caso o usuário não esteja logado, como fazer para a api pedir o login, pedir permissões e voltar ao site para aí sim autorizar a publicação (no site e no face) e publicar no mural.
Consegui me fazer entender? Como posso fazer isso?
Olá Giovani,
Primeiramente obrigado pelo comentário. Acho muito válido retornar esse conhecimento para a comunidade e não somente absorver dela.
Em relação à dúvida, você pode checar se o usuário esta logado e redirecioná-lo para o login caso não esteja, da seguinte forma:
Aconselho a verificar o seguinte artigo para complementar:
Facebook App: Requisitando permissões pela API do PHP
Caso queira aprender como solicitar o login via javascript, leia o artigo:
Facebook App: Trabalhando com Login através do sdk para javascript
Boa sorte!
Oi. Bom dia.
Mais uma vez, obrigado pela disponibilidade. Fui adiante nos testes e a coisa vai como prevista… acho que a solução do meu problema será usar um cookie para deixar gravado o id da foto que será enviada depois do processo de autenticação, mas ainda não cheguei lá.
Me deparei com um erro básico: OAuthException: (#324) Requires upload file. Não encontra a foto nem usando o caminho absoluto dele no servidor. Tem algo que possa ser feito?
Bom dia, de novo! Desculpe a falta de atenção. Eu não tinha habilitado o suporte para upload do arquivo ($facebook->setFileUploadSupport(true);). Foi isso que impediu.
Mais uma vez obrigado.
Legal que resolveu Giovani!
Abraços!
Bom dia, Douglas.
Fiz o teste e consegui fazer a publicação da foto que eu queria, e passei para outras coisas que precisava fazer na aplicação. Agora, ao voltar nessa parte estou me deparando com vários erros… comecei a ter um erro de autenticação.
O meu código é esse:
// habilita suporte para upload de arquivos
$facebook->setFileUploadSupport(true);
// verifica se o usuário já esta logado no aplicativo
$user = $facebook->getUser();
if ($user) {
try {
// verifica se o usuario permitiou o aplicativo publicar fotos em seu perfil
$permissions = $facebook->api(“/me/permissions”);
if(!array_key_exists(‘publish_stream’, $permissions[‘data’][0])) {
header( “Location: ” . $facebook->getLoginUrl(array(“scope” => “publish_stream”)) );
exit;
}
// dados para envio da publicacao da foto
$post_data = array(
“message” => “teste_” . time(),
“image” => ‘@’ . realpath(“fotos/1381322077.jpg”), // localizacao da foto
);
// publica foto na timeline
$data[‘photo’] = $facebook->api(“/me/photos”, “post”, $post_data);
echo “Foto publicada com sucesso!”;
} catch (FacebookApiException $e) {
print_r($e);
}
} else {
// usuario não logado, solicitar autenticação
$loginUrl = $facebook->getLoginUrl(array(“scope” => “publish_stream”));
header(“Location: $loginUrl”);
}
e o erro que aparece é esse:
FacebookApiException Object ( [result:protected] => Array ( [error] => Array ( [message] => An unexpected error has occurred. Please retry your request later. [type] => OAuthException => 2 ) ) [message:protected] => An unexpected error has occurred. Please retry your request later. [string:Exception:private] => => 0 [file:protected] => /var/www/vhosts/surfgroup.com.br/httpdocs/surfgroup/facebook/src/base_facebook.php [line:protected] => 1271 [trace:Exception:private] => Array ( [0] => Array ( [file] => /var/www/vhosts/surfgroup.com.br/httpdocs/surfgroup/facebook/src/base_facebook.php [line] => 880 [function] => throwAPIException [class] => BaseFacebook [type] => -> [args] => Array ( [0] => Array ( [error] => Array ( [message] => An unexpected error has occurred. Please retry your request later. [type] => OAuthException => 2 ) ) ) ) [1] => Array ( [function] => _graph [class] => BaseFacebook [type] => -> [args] => Array ( [0] => /me/photos [1] => post [2] => Array ( [message] => teste_1382364120 [image] => @/var/www/vhosts/surfgroup.com.br/httpdocs/surfgroup/fotos/1381322077.jpg ) ) ) [2] => Array ( [file] => /var/www/vhosts/surfgroup.com.br/httpdocs/surfgroup/facebook/src/base_facebook.php [line] => 654 [function] => call_user_func_array [args] => Array ( [0] => Array ( [0] => Facebook Object ( [sharedSessionID:protected] => [appId:protected] => 724907970860080 [appSecret:protected] => 9bc0f23788f7eeea2be7eb177df4c36a [user:protected] => 100002467896587 [signedRequest:protected] => [state:protected] => [accessToken:protected] => CAAKTTMoZAFDABAI0K4KtZAKteOODN6McpJZAD4q0bZBueHLC97ZAobRcctSjmuvJ352wIQpmhVHA7OBiZBhMhDfpS2NfUuBPJBSCwIVgQrXgq3QKNooyJVpfRc3bDcJWGfI3y84jJmhLqcPzQ1CZBlR7eZBaJrBV04ymZBADV7kIHudeaPtlf0vfXz6gXEPXLiLMZD [fileUploadSupport:protected] => 1 [trustForwarded:protected] => ) [1] => _graph ) [1] => Array ( [0] => /me/photos [1] => post [2] => Array ( [message] => teste_1382364120 [image] => @/var/www/vhosts/surfgroup.com.br/httpdocs/surfgroup/fotos/1381322077.jpg ) ) ) ) [3] => Array ( [file] => /var/www/vhosts/surfgroup.com.br/httpdocs/surfgroup/facebook.php [line] => 52 [function] => api [class] => BaseFacebook [type] => -> [args] => Array ( [0] => /me/photos [1] => post [2] => Array ( [message] => teste_1382364120 [image] => @/var/www/vhosts/surfgroup.com.br/httpdocs/surfgroup/fotos/1381322077.jpg ) ) ) ) [previous:Exception:private] => )
O pior é que ele chegou a pedir a autenticação e aceitar a publicação… mas agora fica nisso. Também tenho que pegar o usuário e a foto, mas isso deixei para depois.
Você consegue me dar uma luz nisso?
Olá Giovani,
Aconselho a remover o aplicativo do seu perfil que esta usando para testar.(Menu -> Configurações da Conta -> Aplicativos)
Deslogar do facebook, fechar o navegador e iniciar o processo novamente.
Depois me fala se funcionou!
Boa sorte!
Meu caro, como seria para fazer uma busca por determinada palavra chave no facebook .. Por ex: #FUTEBOL .. E depois imprimir todos esses dados em uma página? seria bom um tutorial sobre ! Abçs amigo !
Olá Pablo! Primeiramente, obrigado pela sugestão. Vou tentar ajudar a esclarecer um pouco a sua dúvida. O facebook tem um mecanismo chamado busca social (graph search), ainda não disponível para perfis do brasil, que permite realizar de forma direta esse tipo de pesquisa. Por exemplo, de acordo com a sua sugestão, a URL de busca seria: https://graph.facebook.com/search?q=%23futebol&type=post. Para mais detalhes sobre a busca social, acessar: https://www.facebook.com/about/graphsearch
Outra opção, é criar um aplicativo que realiza buscas nos posts presentes no feed de notícias de determinado usuário. Porém, é necessário que o usuário aceite o aplicativo e forneça pelo menos a permissão read_stream.
Boa sorte!
Não estou usando nada disto que você ensinou a nós. mas estou aqui só para agradecer por compartilha esse conteúdo rico com nós @Pasquati. Obrigado
Obrigado Erivelton! 😉
Grande satisfação por isso…
Abraços
Amigo, boa noite!! Primeiramente gostaria de agradecer pela sua iniciativa de compartilhar conhecimento pois me ajudou muito. Estou com uma dúvida. Eu consegui postar as fotos no mural de alguns grupos, porém somente eu consigo ver essas fotos. Quando tento localizar essas fotos utilizando um outro usuário, não consigo encontrar. Tem alguma coisa para fazer que resolve isso? Basicamente, somente eu estou tendo acesso as fotos/publicações que faço através do script php. É preciso ativar a app no facebook para que funcione? Obrigado!!
Olá Marcio,
Que satisfação poder ajudar.
Para ajudar na resposta da sua questão, peço que verifique o artigo abaixo:
http://www.douglaspasqua.com/2013/12/11/desenvolvimento-de-aplicativos-para-facebook-perguntas-frequentes/
Informações Gerais -> Questão número 1
Boa sorte!
Bom dia!! Era isso mesmo, agora funciona 100%. Muito obrigado!!
Douglas, bom dia!
Primeiramente obrigado por me ajudar com a dúvida que tive recentemente na parte de login através de um app (usando o sdk em javascript resolveu). A minha dúvida agora (e a última rsrsrsrs) é referente a esta parte de upload de fotos offline. Atualmente eu tenho uma aplicação web e nas configurações o usuário pode habilitar o compartilhamento pelo Facebook. Então ao redigir eu verifico na tabela se aquele usuário está com o compartilhamento habilitado, se estiver eu mostro um checkbox que se habilitado ao postar aquele conteúdo (texto apenas) é exibido em sua timeline. Agora estou colocando a funcionalidade de upload de fotos pelo mesmo aplicativo, e gostaria que houvesse o mesmo tipo de publicação se o usuário marcar porém vi que é diferente. Você falou acima que para publicar uma foto de forma offline (me corrija por favor se eu estiver errado) é preciso pegar o access token do usuário e não do aplicativo. Minhas dúvidas com relação a isso são:
– como eu pegaria este access token ?
– ele expira, ou eu poderia armazená-lo em banco e fazer um request do mesmo quando fosse preciso ?
O código que teoricamente eu usaria para o upload seria o seguinte está em http://www.postting.com/new/codigo.html
Desde já, muito obrigado pela atenção dispensada.
Olá Alvaro,
Para realizar publicações de fotos no mural do usuário quando ele esta online não é necessário setar explicitamente um access token quando usamos o SDK para PHP pois ele já faz isso para nós internamente. Você pode aprender como fazer através do que esta descrito neste artigo:
http://www.douglaspasqua.com/2012/06/28/manipulando-fotos-no-facebook-com-sdk-para-php/
Para realizar publicações de fotos de forma offline, será necessário usua um access token de usuário. Porém o access token de usuário tem um tempo de expiração curto, normalmente 2 horas. Para armazenar o access token de usuário no banco de dados para usá-lo posteriormente, será necessário extendê-lo para 60 dias. Isso pode ser feito da seguinte forma:
Boa sorte!
Douglas, boa tarde!
Muito obrigado pela ajuda. Neste exato momento eu estava fazendo isso e deu certo. Com relação ao token, eu gravei a data no banco e sempre verifico se é superior a 60 dias, caso seja na hora do usuário compartilhar eu solicito uma nova permissão. Mais uma vez, muito obrigado pela ajuda. Assim que o app estiver no ar te mando o link para que veja. Abs,
Bom dia, Douglas.
Antes de tudo, mais uma vez, obrigado pela força que você está dando a mim e vários outros colegas, com suas explicações.
Estou colocando no ar o aplicativo que estava criando e que você me ajudou a um tempo atrás. Só que agora, ao mudar de servidor, o aplicativo começou a entrar em loop. Minha página solicita a permissão e na hora de voltar, o redirecionamento entra em loop infinito, como se o facebook não desse a autorização e, no retorno, minha página solicitasse de novo, Até o ff dar erro na aplicação e parar tudo.
Você tem uma ideia do que pode estar acontecendo?
Não to conseguindo…Aparece: Curl Exception: 3: No URL set!
Já tentei muito….. 🙁 O que faço?
Olá Renato, De acordo com o relato, me parece que a extensão CURL esta corretamente habilita no seu ambiente de desenvolvimento.
Antes de qualquer coisa, sugiro atualizar a versão do sdk do Facebook. Talvez já resolva este problema.
A versão mais recente do sdk pode ser obtida no link:
https://github.com/facebook/facebook-php-sdk
Boa sorte!
Olá Douglas esses seus artigos tem me ajudado muito, como faço para marcar pessoas em postagens e fotos, ou seja que ela seja notificada sobre uma publicação, porém usando javascript.
Olá André,
Para fazer a marcação nas fotos via API Javascript é bem semelhante feito via PHP como foi ensinado neste artigo. O que você vai precisar para ajudar é um plugin de marcação de fotos em javascript.
Recomendo avaliar:
http://www.jquerybyexample.net/2012/12/top-jquery-photo-image-tagging-plugins.html
Douglas, agradeço desde já a sua partilha de conhecimento, que é top 🙂
É possivel fazer o seguinte:
Sincronizar uma pasta que esta alojada num servidor, com um album de fotos numa Fan Page de empresa?
A ideia é: sempre que coloco uma foto na pasta do servidor ela vai de forma automatica para um album que esteja criado na FanPage.
Abraço
Olá João, é possível criar um script que faça esse trabalho. Basta o script ir removendo as fotos da pasta conforme for publicando na fan page. Você pode inserir o script no crontab (agendador de tarefas do Linux) para ser executado de 5 em 5 minutos.
Boa sorte!
Boa tarde,
é possivel listar todas as fotos que estão num directório no meu servidor num album de uma fanpage em real time?
A minha ideia é a seguinte:
Quando subo uma imagem via FTP para um directório no meu servidor, ela vai de forma automática para um album que eu tenha criado na fanpage.
Abraço e parabéns pelo Blog
Olá João, sim é possível! É necessário fazer um script, agendado para rodar periodicamente, que fica checando novos arquivos no diretório de FTP do servidor e subir para a Fan Page!
Preciso criar um aplicativo pra uma campanha de doação de sangue. Preciso que quem adicionar o aplicativo, a imagem de perfil e a capa sejam alteradas. Pensei que o aplicativo deve fazer o seguinte:
– Baixar a foto do perfil e da capa para o servidor.
– Editar as imagens (com o php, isso não é problema)
– Subir as novas imagens para o facebook no album do app
– Selecionar as imagens do album como de perfil e de capa.
É esse caminho mesmo que devo seguir?
Obrigado.
Olá Gilson,
Sim, acredito que esse é o caminho! Pois via app não é possível alterar imagens de perfil ou de capa diretamente. Para publicação das fotos, você vai precisar da permissão publish_actions. Após publicação da foto, de capa por exemplo, você pode redirecionar o usuário para alteração da foto de capa passando o ID da foto que subiu para o facebook. Ex: http://stackoverflow.com/questions/7849783/setting-facebook-cover-photo-via-api
É bem interessante essa funcionalidade.
Boa sorte!
Amigo, me ajude por favor.
Eu peguei a foto do perfil, o link chega assim: https://graph.facebook.com/1715582508695092/picture?width=600
Em seguida eu quero enviar esta foto para o servidor, fazendo com que retorne em uma outra página.
O que quero é fazer algo parecido com isto: https://oposicaoafavordobrasil.com.br/avatar/
Cortar a foto, retornar na pagina seguinte com a logo marca, e em seguida finalizar. Já tenho o JS pronto, só não consigo manipular o retorno coma inserção da logo Marca.
Pode me ajudar?
Cortar a foto você conseguiu, certo! faltou somente inserir a logo marca na foto através de php ? Da uma olhada neste link: http://php.net/manual/en/image.examples-watermark.php
Veja se te ajuda. Boa sorte!
Olá Douglas, tudo bem ? Brother, estou criando um leitor de albuns para implementação dentro de site.
Usava a antiga api, que funcionava com o fql, mas foi descontinuada.
Você poderia me dar algumas dicas de como ler os albuns pela nova api ?
Seria usando o Facebook Request ?
Obrigado desde já.
Olá Michel, tudo joia! como vai ? Para listar os álbuns, será necessário solicitar a permissão user_photos e posteriormente fazer uma requisição em /me/albums que irá retornar a lista de álbuns do perfil do usuário. Boa sorte!!
Olá, Gostaria de agradecer pelo compartilhamento do seu grande conhecimento. Cai aqui de paraquedas procurando por uma forma de publicar uma foto no mural de todos meus amigos de uma vez. Vi que você tem um conhecimento imenso na área. Mas como sou bem iniciante não consegui aplicar seus ensinamentos na totalidade.
Eu realmente queria conseguir fazer a postagem no mural dos meus amigos. Realmente uma pena. 🙁
Olá Toscano, o facebook não permite que se publique no mural do usuário através da graph api. Esse recurso já existiu um dia mas foi desativado. O facebook recomenda que você utilize o feed dialog: https://developers.facebook.com/docs/sharing/reference/feed-dialog , que é uma forma de integrar a publicação no mural dentro do seu aplicativo, mas não é possível fazer de uma forma automatizada.
A forma de automatizar a publicação no mural seria apenas para os usuários que aceitarem o seu aplicativo fornecendo a permissão publish_actions.