Recentemente o Facebook anunciou que sua API seria atualizada para a versão 4.0 e a mesma sofreria fortes mudanças. Eis que esse dia chegou, pff!
A principal dessas mudanças foi a extinção do suporte ao FQL (Facebook Query Language – uma maneira linda de fazer requisões na API) e que os aplicativos que exigissem permições de publicar na timeline e outras coisas, passariam por um processo de aprovação, parecido com o que ocorre com a AppStore. O novo SDK faz uso de namespaces e roda no PHP 5.4 ou superior.
Isso para os desenvolvedores foi um caos, mas para os usuários isso é bem interessante, colocando em ordem a casa e protegendo um pouco mais sua privacidade.
Farei uso da API com o exemplo prático de um aplicativo que pega as fotos do usuários e depois faz um compartilhamento em sua própria timeline. Por fim mostrarei os passos para aprovar o aplicativo. Clique aqui ou aqui para baixar o SDK e vamos lá!
Criando o App
Primeira coisa que você deve fazer é ir no painel de aplicativos do Facebook Developer e criar um novo aplicativo. É um processo bem simples e por isso vou pular essa parte. Quando solicitado a plataforma do seu app, selecione Site (www). E lá em Settings altere o “Website -> Site URL” para a URL da sua aplicação, pode ser https://localhost/ .
Login
Em sua aplicação de Facebook você pode realizar o login do usuário usando o SDK JavaScript ou PHP. Não gosto muito de realizar o login via PHP porque já tive alguns problemas com o tal da URL Redirect (não lembro exatamente o porque rsrs, isso foi no boom das abas de fanpage e ações promocionais chovendo em sua timeline), devido a isso vou demonstrar das duas maneiras.
Login via JavaScript
// login via javascript
$('#bt-facebook').click( function(event){
event.preventDefault();
destino = this.href;
FB.login( function(response){
if (response.authResponse) {
document.cookie = 'meuapp_userid='+response.authResponse.userID;
document.cookie = 'meuapp_token='+response.authResponse.accessToken;
window.location.href = destino;
}else{
// console.log('O usuário Cancelou o login ou não autozirou.');
}
}, {scope: 'user_photos, publish_actions'});
});
Na linha 2 eu simulei que a solicitação veio através de um clique num link . Na linha 5 guardamos o destino do link para uso posterior. Na linha 7 fazemos a chamada ao método FB.login() que irá abrir uma caixa de diálogo na tela solicitando permissão ao usuário. Caso o usuário permita o login nas linhas 9 e 10 deixamos salvo o ID do usuário e o token da permissão para uso futuro. Deixei num cookie, mas fica a vontade para guardar isso da maneira que julgar melhor. E por fim na linha 11 envio o usuário para a página de destino do link, a página principal da aplicação quando logado.
É importante observar a linha 15, onde mencionamos todas as permissões que vamos precisar do usuário. Clique aqui pra ver a lista de permissões.
Ah, lembre-se de adicionar a chamada ao SDK JavaScript colocando o código abaixo antes do fechamento da tag
.<script>
window.fbAsyncInit = function() {
FB.init({
appId : 'APP_ID',
xfbml : true,
version : 'v2.3'
});
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
Lembre-se de trocar o APP_ID pelo ID da sua aplicação.
Login via PHP
// arquivo 1
require 'facebook/autoload.php';
use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
FacebookSession::setDefaultApplication('APP_ID', 'APP_SECRET');
$helper = new FacebookRedirectLoginHelper('URL_ARQUIVO_2');
$loginUrl = $helper->getLoginUrl();
echo "login via php";
// arquivo 2
require 'facebook/autoload.php';
use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\Entities\AccessToken;
FacebookSession::setDefaultApplication('APP_ID', 'APP_SECRET');
$helper = new FacebookRedirectLoginHelper('URL_ARQUIVO_2');
try {
$session = $helper->getSessionFromRedirect();
} catch(FacebookRequestException $ex) {
// When Facebook returns an error
} catch(\Exception $ex) {
// When validation fails or other local issues
}
if ($session) {
echo "Usuário logado.";
$me = (new FacebookRequest(
$session, 'GET', '/me'
))->execute()->getGraphObject(GraphUser::className());
// echo $token = $session->getToken();
setcookie('tacaruna_token', $session->getToken());
setcookie('tacaruna_userid', $me->getProperty('id'));
header("Location: mosaico.php");
}else{
echo "Não logado";
}
Não vou entrar em detalhes nesses arquivos de login via PHP porém mais abaixo tudo é explanado. Lembre-se de trocar APP_ID, APP_SECRET e URL_ARQUIVO_2 pelos seus respectivos valores.
Pegando as fotos do usuário
/* INCLUDE NO AUTOLOAD E CHAMA AS CLASSES NECESSÁRIAS */ require 'facebook/autoload.php'; use Facebook\FacebookSession; use Facebook\FacebookJavaScriptLoginHelper; use Facebook\FacebookRequest; use Facebook\GraphUser; FacebookSession::setDefaultApplication('APP_ID', 'APP_SECRET'); /* VERIFICA SE ESTA LOGADO */ $helper = new FacebookJavaScriptLoginHelper(); try { $session = new FacebookSession($_COOKIE['meuapp_token']); }catch(FacebookRequestException $ex) { // When Facebook returns an error }catch(\Exception $ex) { // When validation fails or other local issues } // caso não esteja logado if (!$session) exit('Usuário não logado ou token expirado.'); /* PEGA OS DADOS DO USUÁRIO */ try { $response = (new FacebookRequest($session, 'GET', '/me'))->execute(); $object = $response->getGraphObject(); $fbid = $object->getProperty('id'); $fbname = $object->getProperty('name'); $fbgender = $object->getProperty('gender'); } catch (FacebookRequestException $ex) { // echo $ex->getMessage(); } catch (\Exception $ex) { // echo $ex->getMessage(); } /* PEGA OS ALBUNS */ $response = (new FacebookRequest($session, 'GET', '/me/albums'))->execute(); $graphObject = $response->getGraphObject()->asArray(); $albuns = array(); foreach($graphObject['data'] as $v) $albuns[] = $v->id; /* PEGA AS FOTOS */ // $x = 0; foreach($albuns as $v){ $response = (new FacebookRequest($session, 'GET', "/$v/photos"))->execute()->getGraphObject()->asArray(); foreach($response['data'] as $fotos){ echo '<img src="'.$fotos->picture . '" data-source="'.$fotos->source.'"><br>'; // if (++$x === 50) break; } }
Nas linhas iniciais nos chamados o autoload da API para evitar ficar dando milhões de include e logo depois chamamos as classes do SDK que iremos utilizar. Na linha 8 setamos as configurações do nosso aplicativo, substitua APP_ID e APP_SERCRET pelos do seu aplicativo.
Da linha 10 à 18, verificamos se o usuários está logado. Lembra que no login eu guardei o token num cookie? Olha ele aí na linha 13.
Da linha 24 à 36 pegamos os dados do usuário logado para caso queira guardar num banco de dados, etc. Dê um var_dump na variável $object e veja o que ele contém.
Para pegar as fotos do usuário primeiro vamos pegar os álbuns e aí depois as fotos contida neles. Antigamente você pegava todas as fotos com apenas uma requisição =/ Da linha 40 à 43 pegamos os IDs dos álbuns e nas linhas 47 à 54 pegamos as fotos e exibimos na tela. Mais uma você pode dar um var_dump em $fotos e ver os dados que ela contém, são vários.
Compartilhando na timeline
/* INCLUDE NO AUTOLOAD E CHAMA AS CLASSES NECESSÁRIAS */ require 'facebook/autoload.php'; use Facebook\FacebookSession; use Facebook\FacebookJavaScriptLoginHelper; use Facebook\FacebookRequest; use Facebook\GraphUser; use Facebook\FacebookRequestException; use Facebook\GraphObject; FacebookSession::setDefaultApplication('APP_ID', 'APP_SECRET'); /* VERIFICA SE ESTA LOGADO */ $helper = new FacebookJavaScriptLoginHelper(); try { $session = new FacebookSession($_COOKIE['meuapp_token']); }catch(FacebookRequestException $ex) { // When Facebook returns an error }catch(\Exception $ex) { // When validation fails or other local issues } // caso não esteja logado if (!$session){ exit('Usuário não logado ou token expirado.'); }else{ /* COMPARITLHA */ $img = realpath("CAMINHO_DA_IMAGEM"); $txt = "TEXTO_DIGITADO_PELO_USUARIO"; try { $response = (new FacebookRequest( $session, 'POST', '/me/photos', array( 'source' => new CURLFile($img, 'image/jpeg'), 'message' => "$txt" ) ))->execute()->getGraphObject(); echo $response->getProperty('id'); } catch(FacebookRequestException $e) { // echo "Exception occured, code: " . $e->getCode(); // echo " with message: " . $e->getMessage(); exit("Erro ao compartilhar."); } }
Mais uma vez nas linhas iniciais nos chamados o autoload da API setamos as configurações do nosso aplicativo e logo verificamos se o mesmo está logado. Na linha 29 nos colocamos o realpath do caminho da imagem que iremos compartilhar (caso a versão do seu PHP seja inferior a 5.5, altere a linha 36 para: ‘source’ => ‘@‘. $img). Na linha 30 temos uma frase que irá acompanhar a postagem/foto escrita pelo próprio usuário. Não é obrigado conter uma frase, pode deixar em branco. O que não pode é deixar um texto pré-definido. Caso isso ocorra o seu app não será aprovado.
Aprovando o aplicativo
Enviar o aplicativo para aprovação não é um bicho de sete cabeças. Dá um pouco de trabalho porque você precisa tirar alguns printscreen, escrever um passo a passo e mais algumas informações. Para alguns – e principalmente agências de publicidade, isso é um inferno porque para precisaríamos de todo o layout já pronto, mas você pode dar um jeito de adiantar esse processo fazendo você mesmo um pré-layout baseado no wireframe que já serve, não precisa estar lindão, só precisa ter o protótipo do seu aplicativo com um bom gosto no css que já é o suficiente!
O Facebook deixou um página dedicada a isso bem explicada e com imagens ilustrando e tudo mais. Lá no painel em Status & Review quando você clicar em Start a Submission ele vai apontar para você que está faltando e daí você vai fazendo, etc.
Lembre-se de deixar o seu aplicativo visível para o todos (público) para facilitar, mas pelo que vi você pode deixar privado e designar um usuário de teste para eles testarem.
Em App Details você precisa preencher a maioria dos campos, em português mesmo. Também precisa de pelo menos 3 screenshots do seu aplicativo bem como a maioria das imagens de capa, baner, ícone, etc.
É importante observar que como mencionei anteriormente, não podemos deixar uma frase de compartilhamento pré-definida, o que um dia foi um prática comum da maioria das marcas. Caso isso ocorra seu aplicativo não será aprovado.
O Facebook diz que pode precisar de até 15 dias úteis para aprovar, mas nesse exemplo que apresentei aqui ele pedio 5 dias e terminou aprovando em apenas 1 dia 🙂
Então é isso, e boa sorte na aprovação!