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&ecirc; n&atilde;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);
    
  • Solicitar permissão publish_actions para que o aplicativo possa publicar fotos no perfil do usuário.
    $loginUrl = $facebook->getLoginUrl(array('scope' => 'publish_actions'));
    
  • Validar se realmente o usuário aceitou a permissão publish_actions antes de tentar publicar:
  • // verificar permissao
    $permissions = $facebook->api("/me/permissions");
    
    foreach($permissions['data'] as $perm) {
        if($perm['status'] == 'granted' && $perm['permission'] == 'publish_actions') {
            // publicar foto
            // ...
        }	
    }
    
  • Publicando a foto. Um novo álbum será criado com o nome da aplicação no perfil do usuário.
  •                 // 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:

Captura de Tela 2015-07-15 às 20.28.09

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

Comments

  1. Reply

    • Reply

  2. Reply

  3. By Ezequiel de Witt

    Reply

    • mm By pasquati

      Reply

      • By Ezequiel de Witt

        Reply

  4. By Ezequiel de Witt

    Reply

  5. By Ezequiel de Witt

    Reply

    • mm By pasquati

      Reply

  6. By fabio

    Reply

    • mm By pasquati

      Reply

  7. By Fábio

    Reply

    • mm By pasquati

      Reply

      • By Fábio

        Reply

      • By Fábio

        Reply

      • By Fábio

        Reply

      • mm By pasquati

        Reply

  8. Reply

    • mm By pasquati

      Reply

      • Reply

      • Reply

  9. Reply

    • mm By pasquati

      Reply

      • Reply

        • mm By pasquati

          Reply

  10. Reply

    • mm By pasquati

      Reply

  11. Reply

    • mm By pasquati

      Reply

  12. Reply

  13. By Jeferson Guerrero

    Reply

    • mm By pasquati

      Reply

      • By Jeferson Guerrero

        Reply

        • mm By pasquati

          Reply

  14. By Jeferson Guerrero

    Reply

    • mm By pasquati

      Reply

  15. By Jeferson Guerrero

    Reply

  16. By Jeferson Guerrero

    Reply

  17. By Jeferson Guerrero

    Reply

    • mm By pasquati

      Reply

  18. Reply

    • mm By pasquati

      Reply

      • Reply

  19. Reply

    • mm By pasquati

      Reply

  20. Reply

    • mm By pasquati

      Reply

  21. Reply

    • mm By pasquati

      Reply

  22. By Marcio Devit

    Reply

    • mm By Douglas V. Pasqua

      Reply

  23. By Diego Patrick

    Reply

  24. By Diego Patrick

    Reply

    • mm By Douglas V. Pasqua

      Reply

  25. Reply

    • mm By Douglas V. Pasqua

      Reply

      • Reply

        • Reply

          • mm By Douglas V. Pasqua

        • Reply

          • mm By Douglas V. Pasqua

  26. By Pablo

    Reply

    • mm By Douglas V. Pasqua

      Reply

  27. By Erivelton Sobainski

    Reply

    • mm By Douglas V. Pasqua

      Reply

  28. By Márcio

    Reply

  29. By Alvaro

    Reply

    • mm By Douglas V. Pasqua

      Reply

      • By Alvaro

        Reply

  30. Reply

  31. By Renato

    Reply

    • mm By Douglas V. Pasqua

      Reply

  32. By André

    Reply

  33. By João

    Reply

    • mm By Douglas V. Pasqua

      Reply

  34. By João

    Reply

    • mm By Douglas V. Pasqua

      Reply

  35. Reply

    • mm By Douglas V. Pasqua

      Reply

  36. Reply

  37. Reply

    • mm By Douglas V. Pasqua

      Reply

  38. Reply

    • mm By Douglas V. Pasqua

      Reply

Deixe um comentário

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: