Facebook app, publicando fotos na fanpage com access token.

Posted on outubro 21, 2012. Filed under: Facebook, PHP | Tags:, , , |

Introdução

ATENÇÂO: Atualização: Novo Artigo demonstra como publicar na fan page com access token:
Facebook sdk, Publicando fotos na Fan Page com access token.

ATENÇÂO: PARTE DESTE ARTIGO SE ENCONTRA OBSOLETO. A SEÇÂO Obtendo o access_token da Fanpage, método 2 NÂO FUNCIONA MAIS, DE ACORDO COM ALGUMAS MUDANÇAS REALIZADAS NO SITE DO FACEBOOK. PARTE DA SEÇÂO Postando fotos na fanpage SE TORNA INÙTIL POIS ELA DEPENDE DA SEÇÃO 2! Estou avaliando a questão para atualizar este artigo. Por enquanto, mais detalhes sobre a questão em: http://stackoverflow.com/questions/13808138/facebook-app-login-exchanging-code-for-an-oauth-access-token-is-working-only-o

Em artigo anterior, já vimos como postar fotos no mural do usuário e também na fanpage. Nos exemplos demonstrados, vimos como postar usando interação com o usuário. Ou seja, o usuário precisa acessar a aplicação para poder postar as imagens na fanpage. Neste artigo pretendo demonstrar como podemos automatizar o processo de publicação, sem que haja uma interação com o usuário, através de access token.

Neste artigo em especial, vamos trabalhar com access_token de páginas (fanpages). O primeiro passo é obter o access_token. Neste momento o usuário que administra a fanpage precisa fornecer as permissões necessárias para a publicação da app na fanpage. Após, podemos obter o access_token e utilizá-lo para publicações posteriores. Podemos continuar publicando na fanpage com o token, até que ele expire. Após a expiração do token, será necessário gerá-lo novamente e continuar o processo.

Vamos demonstrar abaixo dois método para obter o access_token da fanpage. Antes, veremos como obter algumas informações importantes:

  • appId e secret
  • São os identificadores da sua aplicação facebook. Para maiores informações de como criar aplicações, acesse: Criando aplicativos para Facebook usando SDK do PHP

  • id da fanpage
  • Código identificador da fanpage onde você irá realizar as postagens. Para obter o id da fanpage é bem simples:

    Na área administrativa de sua fanpage, clique no menu Editar Página -> Atualizar informações:

    Obtenha o ID da fanpage na URL do seu navegador:

Agora sim veremos os dois métodos distintos para obter o token da fanpage.

Obtendo o access_token da Fanpage, método 1

Segue abaixo o código com um dos métodos de obter o access token da fanpage.

De acordo com a documentação do facebook, o tempo de expiração do access token varia de acordo com vários fatores.(Ex: frequência de acesso à página, entre outros). Neste primeiro método, para obter o access token, é necessário que o usuário acesse a app abaixo manualmente. Sempre que o access token expirar, o usuário precisa executar a app novamente para obter o token atualizado.

Lembre-se que você deve usar as credenciais de usuário administrador da fanpage ao acessar a app abaixo.

<?php
require 'src/facebook.php';

// paraemtros
$fanpage_id = "402151349851571"; // id da fanpage
$appid = "xxxxxxxxxxxxxxx"; // id da app
$secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // secret

// Instancia da lib facebook
$facebook = new Facebook(array(
  'appId'  => $appid,
  'secret' => $secret,
));

// Obtem usuario logado
$user = $facebook->getUser();

if ($user) {

  try {
        // solicita permissoes
        $permissions = $facebook->api("/me/permissions");
        if(!(array_key_exists('publish_stream', $permissions['data'][0])
                 &&  array_key_exists('manage_pages', $permissions['data'][0]))) {
                header( "Location: " . $facebook->getLoginUrl(array("scope" => "publish_stream,manage_pages")) );
                exit;
        }

        // obtendo token
        $accounts = $facebook->api('/me/accounts', 'GET', $params);
        foreach($accounts['data'] as $account) {
                if( $account['id'] == $fanpage_id || $account['name'] == $fanpage_id ){
                        $fanpage_token = $account['access_token'];
                }
        }

        if(!$fanpage_token) {
                die("Seu usario nao tem permissao nesta fanpage");
        }

        echo "Fanpage Token: " . $fanpage_token; // guardar esse token

  } catch (FacebookApiException $e) {
        var_dump($e);
        $user = null;
  }
} else {
        // usuario nao logado, solicitar autenticacao
        $loginUrl = $facebook->getLoginUrl();
        echo "<a href=\"$loginUrl\">Facebook Login</a><br />";
        echo "<strong><em>Voc&ecirc; n&atilde;o esta conectado..</em></strong>";
}

A execução da app acima irá simplesmente exibir o access token na tela. Vamos utilizar esse token em uma segunda etapa.

Obtendo o access_token da Fanpage, método 2

Vamos agora demonstrar um script que obtém o token da fanpage de forma mais automatizada que no primeiro método. Dessa forma, podemos até rodá-lo através de um processo agendado no contrab, sem que haja necessidade de interação com o usuário administrador da fanpage para obter o token.

Primeiramente, vamos obter o valor do parâmetro code que representa um token retornado na etapa de autenticação e autorização, que não tem tempo de expiração. (PS: O code obtido será alterado somente caso você altere alguma das permissões que sua aplicação solicita).

Primeiramente,acesse o link abaixo:
https://www.facebook.com/dialog/oauth?client_id=CLIENT_ID&redirect_uri=RETURN_URL&scope=manage_pages,publish_stream
Substituindo:

CLIENT_ID -> ID da sua aplicação facebook.
RETURN_URL -> Endereço onde esta hospedada sua aplicação do facebook.

(Lembre-se de estar logado no facebook com o usuário administrador da fanpage ao acessar o link acima. Atente-se também para definir o valor do scope no link acima, de acordo com as permissões que sua aplicação precisa solicitar para o usuário. Caso sua app esteja publicando somente fotos na fanpage, as permissões manage_pages e publish_stream são suficientes).

Você será redirecionado para a URL informada RETURN_URL, com o campo code na barra de endereço. Salve o valor desse campo.

Com o campo code em mãos, vamos criar o script que obtem o access token da fanpage.

<?php
require 'src/facebook.php';

// parametros
$CLIENTE_ID = "xxxxxxxxxxxxxxx"; // id da app
$SECRET = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; // secret da app
$CODE = "aaaaaaaaaaaaaa............"; // code de autorizacao
$FANPAGE_ID = "bbbbbbbbbbbbbbb"; // id da fanpage que deseja obter o token
$URL_APP = "http://www.seudominio.com.br"; // endereco onde sua app esta hospedada

// objeto facebok
$facebook = new Facebook(array(
        'appId'  => $CLIENTE_ID,
        'secret' => $SECRET,
));

// obter access token da conta
$url1 = "https://graph.facebook.com/oauth/access_token?client_id=$CLIENTE_ID&redirect_uri=$URL_APP&client_secret=$SECRET&code=$CODE";
$token = file_get_contents($url1);
$token = trim(str_replace("access_token=","",$token));


// obter todos access token que o usuario tem permissao
$url2 = "https://graph.facebook.com/me/accounts?access_token=$token";
$data = file_get_contents($url2);

// extrair o access token da fanpage desejada
$regex = '/access_token":"([^"]+)",("category":"[^"]+",)?"id":"' . $FANPAGE_ID . '"/';
preg_match($regex, $data, $match);
$fanpage_token = trim($match[1]);

echo "FanPage Token: $fanpage_token";

O script acima irá escrever o id da fanpage na tela. Você pode inserir esse script na crontab do Linux, usando o navegador lynx. Ex: lynx –dump http://www.seudominio.com.br/gera_token_fanpage.php. Você pode guardar esse token em um banco de dados e utilizá-lo em outro script que publica fotos na fanpage.

Em seguida vamos ver como postar fotos na fanpage usando o token.

Postando fotos na fanpage

Obtido o access token da fanpage, podemos criar um script que publica fotos na fanpage. Podendo ser inserido no crontab também
(lynx –dump http://www.seudominio.com.br/publica_fanpage.php):

<?php
require 'src/facebook.php';

// parametros
$CLIENTE_ID = "xxxxxxxxxxxxxxx"; // id da app
$SECRET = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; // secret da app
$FANPAGE_TOKEN = "aaaaaaaaaa....."; // toke da fanpage
$FANPAGE_ID = "bbbbbbbbbbbbbbb"; //id da fanpage onde a imagem sera postada
$IMAGEM_UPLOAD = "imagem.png"; // local do arquivo de imagem do upload

// objeto do facebook
$facebook = new Facebook(array(
  'appId'  => $CLIENT_ID,
  'secret' => $SECRET,
));

// determina que sera realizado upload de arquivos
$facebook->setFileUploadSupport(true);

try {
        // parametros da postagem
        $post_data = array(
                "message" => "teste_" . time(),
                "image" => '@' . realpath($IMAGEM_UPLOAD),
                'access_token' => $FANPAGE_TOKEN,
        );

        // postando a imagem na fanpage
        $data['photo'] = $facebook->api("/$FANPAGE_ID/photos", 'post', $post_data);
        echo "publicado com sucesso";

} catch (FacebookApiException $e) {
        var_dump($e);
        $user = null;
}

Veja que no script acima, setamos alguns parâmetros fixos, como o id e token da fanpage. O token da fanpage foi obtido a partir de algum dos métodos que vimos na primeira etapa deste artigo. Podemos deixar esse mecanismo mais automático ainda, juntando algumas peças. Podemos ter no mesmo script, a parte que obtém o token e a parte que publica na fanpage juntos. Dessa forma, quando o token da fanpage expirar, não vamos precisar rodar o script que obtém o token da fanpage manualmente.
É uma etapa a menos para se preocupar.

<?php
require 'src/facebook.php';

// parametros
$CLIENTE_ID = "xxxxxxxxxxxxxxx"; // id da app
$SECRET = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; // secret da app
$FANPAGE_ID = "bbbbbbbbbbbbbbb"; //id da fanpage onde a imagem sera postada
$CODE = "aaaaaaaaaaaaaaaaaaaaaaaaa............";
$IMAGEM_UPLOAD = "image.png"; // local do arquivo de imagem do upload
$URL_APP = "http://www.seudominio.com.br/"; // dominio onde sua appp esta hospedada

// objeto do facebook
$facebook = new Facebook(array(
  'appId'  => $CLIENT_ID,
  'secret' => $SECRET,
));

// obter access token da conta
$url1 = "https://graph.facebook.com/oauth/access_token?client_id=$CLIENTE_ID&redirect_uri=$URL_APP&client_secret=$SECRET&code=$CODE";
$token = file_get_contents($url1);
$token = trim(str_replace("access_token=","",$token));

// obter todos access token que o usuario tem permissao
$url2 = "https://graph.facebook.com/me/accounts?access_token=$token";
$data = file_get_contents($url2);

// extrair o access token da fanpage desejada
$regex = '/access_token":"([^"]+)",("category":"[^"]+",)?"id":"' . $FANPAGE_ID . '"/';
preg_match($regex, $data, $match);
$FANPAGE_TOKEN = trim($match[1]); // token da fanpage

// inicio da publicacao

// determina que sera realizado upload de arquivos
$facebook->setFileUploadSupport(true);

try {
        // parametros da postagem
        $post_data = array(
                "message" => "teste_" . time(),
                "image" => '@' . realpath($IMAGEM_UPLOAD),
                'access_token' => $FANPAGE_TOKEN,
        );

        // postando a imagem na fanpage
        $data['photo'] = $facebook->api("/$FANPAGE_ID/photos", 'post', $post_data);
        echo "publicado com sucesso";

} catch (FacebookApiException $e) {
        var_dump($e);
        $user = null;
}

Conclusão

A grande vantagem do método demonstrado neste artigo é a publicação automática de fotos na fanpage, podendo ser agendada em horários específicos (crontab), sem que haja necessidade de intervenção manual do operador.

Make a Comment

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

10 Respostas to “Facebook app, publicando fotos na fanpage com access token.”

RSS Feed for Pasqua Tecnologia Comments RSS Feed

Show de bola!!!

Graças a esse artigo acabei fazendo minha app para agendar meus post e ter o controle total dos meus post…como arquivar ou até mesmo reprogramar eles novamente na fan page.

Valeu Douglas pela Força

Tem alguma opção de postar imagem direto no perfil do usuario de forma automática como na fanpage???

Oi Claudivan,

Sim, existe uma forma automática para postar no perfil do usuário.
Primeiro, é necessário que o usuário acesse sua aplicação e permita a postagem, solicitando para ele a permissão publish_stream.

Você precisa obter o access token da sua app! Com ele é possível realizar operações como se estivesse logado com a app e não diretamente com o usuário. Ainda não existe uma informação muito clara de como proceder, mas o ponto de partida pode ser através dos links abaixo:

http://developers.facebook.com/docs/opengraph/using-app-tokens/
http://developers.facebook.com/docs/howtos/login/login-as-app/

Em breve irei publicar um artigo sobre o assunto.

Obrigado e boa sorte!

Mais dicas sobre publicação offline:
Facebook sdk, publicação offline no mural do usuário com access token

Boa sorte!

Hola! I’ve been reading your site for a while now and finally got the courage to go ahead and give you a shout out from Austin Texas! Just wanted to say keep up the good job!

Hola! Thank you for the feedback. A shout back from Brazil. Happy for helping people from another countries with a blog in portuguese! Thanks!

Olá irmão, li e reli várias vezes seus posts e não entendi e nem encontrei o arquivo ‘src/facebook.php’. Onde baixo ou consigo ele? Abraço.

Olá Alberto,

Você precisa baixar o sdk do facebook para poder utilizar o código usado no blog.
O link para baixar o sdk é:
https://github.com/facebook/facebook-php-sdk

Clicar no botão ZIP! O diretório src estará dentro de facebook-php-sdk-master!

Boa sorte!

Estou procurando uma forma de postar fotos em minha fan page, no entanto gostaria de colocar um aplicativo onde fosse obrigatório a pessoa curtir a fan page antes de visualizar as fotos. Alguma sugestão?

Olá GAbriela,

Acredito que os artigos abaixo podem te ajudar no que você quer:
Facebook, Verificando se usuário curtiu fan page !
Manipulando fotos no facebook com sdk para php

Boa sorte!


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: