in dev

API do Facebook com C#– Facebook SDK for .NET

Integrar nossas aplicações com as diversas redes sociais aumentam o engajamento e trazem diversos benefícios, como o aumento no engajamento dos usuários, a facilidade do usuário se cadastrar e logar em nossas aplicações, o compartilhamento e divulgação de nossos aplicativos, entre outros benefícios.

O Facebook é sem dúvida uma das redes sociais de maior utilização no momento, ele disponibiliza toda uma plataforma com diversas APIs (Facebook APIs) para realizar a integração de nossas aplicações.

Neste post vamos utilizar a Graph API para realizar as seguintes atividades:

  • autenticar o usuário em nossa aplicação
  • recuperar os dados do perfil do usuário
  • listar os amigos
  • publicar mensagens na timeline
  • publicar uma foto

Para essa integração, vou utilizar o Facebook SDK for .NET (http://facebooksdk.net/) um excelente SDK, quem vem evoluindo, e facilita a integração com a API do Facebook, este projeto está disponível no GitHub: https://github.com/facebook-csharp-sdk/facebook-csharp-sdk.

image

Esse SDK pode ser adicionado em nossos projetos via Nuget: http://www.nuget.org/packages/Facebook/

PM> Install-Package Facebook

image

Criando o Projeto

Neste post, vou criar um website em ASP.NET MVC5, mas poderíamos desenvolver em qualquer versão do ASP.NET MVC ou em WebForms.

image

Após criar o projeto, vou adicionar referência ao Facebook SDK for .NET, via Nuget: “Install-Package Facebook”

image

Criando a App no Facebook

Ao acessar a API do Facebook utilizaremos uma aplicação, que devemos criar em: https://developers.facebook.com/apps

image

Após criar a aplicação no Facebook, precisaremos configurar o App Domain e a Url do nosso WebSite

image

Além disso, vamos guardar o App ID e o App Secret do aplicativo.

Autenticação

A autenticação com o Facebook pode ser feita de diversas maneiras, até mesmo utilizando o SDK JavaScript, neste exemplo vou gerar a url de autenticação do Facebook e direcionar o usuário para ela, após a autorização ocorrer, o Facebook direcionará para uma url de callback de nossa aplicação, passando como querystring um token temporário.

Criei na própria HomeController um método responsável por retornar a url de login no Facebook, notem que eu passei como parâmetro o App Id, a Url de Callback e quais as permissões são necessárias para o usuário.

public string GetFacebookLoginUrl()
{
    dynamic parameters = new ExpandoObject();
    parameters.client_id = "254016804756509";
    parameters.redirect_uri = "http://localhost:49496/home/retornofb";
    parameters.response_type = "code";
    parameters.display = "page";

    var extendedPermissions = "user_about_me,read_stream,publish_stream";
    parameters.scope = extendedPermissions;

    var _fb = new FacebookClient();
    var url = _fb.GetLoginUrl(parameters);

    return url.ToString();
}

Vou utilizar esta url na View, para isso passarei utilizando o ViewBag

public ActionResult Index()
{
    ViewBag.UrlFb = GetFacebookLoginUrl();

    return View();
}

Index.cshtml

@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1>ASP.NET + Facebook</h1>
    <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
    <p><a href="@ViewBag.UrlFb" class="btn btn-primary btn-large">Login Facebook</a></p>
</div>

Agora, o ultimo passo é desenvolver a Action que receberá o retorno da autenticação com o Facebook, nela, vamos fazer a requisição com o token temporário, solicitando o Access Token, que deverá ser salvo no banco de dados, para este exemplo vou guardar em uma session para utilizar em outras requisições.

public ActionResult RetornoFb()
{
    var _fb = new FacebookClient();
    FacebookOAuthResult oauthResult;

    _fb.TryParseOAuthCallbackUrl(Request.Url, out oauthResult);

    if (oauthResult.IsSuccess)
    {
        //Pega o Access Token "permanente"
        dynamic parameters = new ExpandoObject();
        parameters.client_id = "254016804756509";
        parameters.redirect_uri = "http://localhost:49496/home/retornofb";
        parameters.client_secret = "35eab0068806e7dd49d22664c23e638f";
        parameters.code = oauthResult.Code;

        dynamic result = _fb.Get("/oauth/access_token", parameters);

        var accessToken = result.access_token;

        //TODO: Guardar no banco
        Session.Add("FbUserToken", accessToken);
    }
    else
    {
        // tratar
    }

    return RedirectToAction("Index");
}

Com isso já temos o fluxo de autorização e requisição para o AccessToken, que servirá para as demais requisições para a API do Facebook.

Retornando o Perfil do usuário

Após o processo de obtenção do Access Token, podemos começar a utilizar a API do Facebook, vou criar uma Action que retorna o perfil do usuário, para isso basta realizar um request para “me” na API.

public ActionResult DetalhesDoUsuario()
{
    if (Session["FbuserToken"] != null)
    {
        var _fb = new FacebookClient(Session["FbuserToken"].ToString());

        //detalhes do usuario
        var request = _fb.Get("me");
        var a = request;
    }

    return RedirectToAction("Index");
}

Listando os Amigos

Para listar os amigos precisaremos realizar uma requisição para “me/friends”.

public ActionResult ListarAmigos()
{
    if (Session["FbuserToken"] != null)
    {
        var _fb = new FacebookClient(Session["FbuserToken"].ToString());

        //listar os amigos
        var request = _fb.Get("me/friends");
        var a = request;
    }

    return RedirectToAction("Index");

}

Publicando na Timeline

Existem diversas maneiras e conteúdos para postarmos na timeline do usuário, é possível configurar diversos parâmetros como: link, name, caption, entre outros.

Criei uma Action chamada PublicarMensagem, que posta uma mensagem na timeline do usuário.

public ActionResult PublicarMensagem()
{
    if (Session["FbuserToken"] != null)
    {
        var _fb = new FacebookClient(Session["FbuserToken"].ToString());

        //Postar uma mensagem na timeline
        dynamic messagePost = new ExpandoObject();
        messagePost.picture = "http://www.rodolfofadino.com.br/wp-content/uploads/2013/12/image_thumb10.png";
        messagePost.link = "http://www.rodolfofadino.com.br/2013/12/test-mode-values-para-o-microsoft-advertising-sdk-windows-8/";
        messagePost.name = "Post name...";
        messagePost.caption = " Post Caption";
        messagePost.description = "post description";
        messagePost.message = "Mensagem de testes da aplicação";

        try
        {
            var postId = _fb.Post("me/feed", messagePost);
        }
        catch (FacebookOAuthException ex)
        {
            //handle oauth exception
        }
        catch (FacebookApiException ex)
        {
            //handle facebook exception
        }
    }

    return RedirectToAction("Index");
}

Publicando uma Foto

Assim como é possível publicar uma mensagem na timeline, também podemos publicar uma foto através da API do Facebook, para isso, criei o exemplo abaixo, no qual eu leio o binário de um arquivo e envio as informações para a API do Facebook, no exemplo precisamos utilizar um objeto do tipo FacebookMediaObject, e fazer um post para “/me/photos”.

public ActionResult PublicarFoto()
{
if (Session["FbuserToken"] != null)
{
    var _fb = new FacebookClient(Session["FbuserToken"].ToString());
    //upload de imagem
    FacebookMediaObject media = new FacebookMediaObject
    {
        FileName = "Nome da foto",
        ContentType = "image/jpeg"
    };

    byte[] img = System.IO.File.ReadAllBytes(Server.MapPath("~/Content/rodolfo.jpg"));
    media.SetValue(img);

    dynamic parameters = new ExpandoObject();

    parameters.source = media;
    parameters.message = "Descricao";

    try
    {
        dynamic result = _fb.Post("/me/photos", parameters);

    }
    catch (Exception ex)
    {
    }
}

Dicas

Listei as principais dicas que acho importante para quem pensa em integrar sua aplicação com o a API do Facebook.

  • Trate os erros
  • Utilize métodos assíncronos (a API do Facebook pode demorar alguns milisegundos para responder, e isso pode ser um gargalo para o seu IIS)
  • Peça somente as permissões necessárias (isso aumenta a conversão do processo de autorização do usuário)
  • Deixe claro quais informações serão compartilhadas no perfil do usuário
  • Esteja atento com as mudanças na API
  • Se atente com os limites de requisições da API
  • Utilize cache, existem diversas informações que não mudam frequentemente (ex:nome, foto e outras informações) utilize cache e evite requisitar esses dados o tempo todo
  • Utilize o Graph API Explorer

Espero que este post seja útil, estou a disposição para dúvidas, criticas e sugestões.

Abs

Rodolfo

  • Paulo Henrique Arruda

    Parabéns amigo, seu post é excelente!

  • felipe blini

    Amigo, estou tentando fazer uma publicação na timeline e recebo direto o erro: (OAuthException – #200) (#200) The user hasn’t authorized the application to perform this action.
    Nem aparece a tela do facebook pedindo autorização, já cai direto nessa mensagem como se a pessoa não tivesse autorizado

  • Wesley Rocha

    Se eu não me engano é necessário autorizar no perfil utilizado na integração, o uso de comandos externos. Pois o erro: (OAuthException – #200) (#200) The user hasn’t authorized the application to perform this action. É erro de permissão para o usuário definido, ao que tudo indica seja o perfil do facebook utilizado.

  • Down Gimp

    Amigo, no facebook existe uma api exclusivas para app groups,
    https://developers.facebook.com/docs/graph-api/reference/v2.4/app/groups
    tentei fazer uma post para criação de um grupo como orientado na api porém apresenta o erro.
    Additional information: (OAuthException – #15) (#15) This method must be called with an app access_token.

    meu método.
    public ActionResult CreateGroup()
    {
    if (Session[“FbuserToken”] != null)
    {
    var _fb = new FacebookClient(Session[“FbuserToken”].ToString());
    //dynamic parameters = new ExpandoObject();
    var postInfo = new Dictionary();
    postInfo.Add(“access_token”, _fb.AccessToken);
    postInfo.Add(“name”, “Grupo News”);
    postInfo.Add(“description”, “A Group for organize excursion”);
    postInfo.Add(“privacy”, “OPEN”);
    postInfo.Add(“admin”, “114923902188466”);

    var request = _fb.Post(“/1452010468441284/groups”, postInfo);
    dynamic result = (IDictionary)request;
    }

    return RedirectToAction(“Index”);
    }

    alguém me socorre?

  • Alexandre Bastos

    Boa Noite, como faço para pegar outros dados como (email e data de nascimento)?
    seu tutorial ficou muito bom, parabéns!
    funcionou certinho aqui, só estou com estas dificuldades!

  • Bruno Arenas

    Post de 2013 e me ajudou muito aqui no projeto! Obrigado Fadino

  • http://www.rodolfofadino.com.br/ Rodolfo Fadino

    Opa, vlw 🙂

  • Silas Junior

    Preciso fazer uma aplicação em .NEt VB para postar imagem em pagina do Face com escolha do album e nao estou conseguindo… tentando converter o código C# mas sem sucesso.. alguém pode ajudar?

  • Weliton

    Muitíssimo Obrigado!
    Thanks so much!

    Adiantou muito !

  • thiago adriano

    Perfeito funcionou legal….

  • Érico Edú Corrêa
  • Junior Bello

    sou novo no dotnet, onde coloco os codigos que escreveu, todos na home controller?
    Deu monte de erros no visual studio nem passou do buid por exempo nao encontrou monte de classes:
    ExpandoObject, FacebookClient, FacebookOAuthResult

    Disponibiliza esse sisteminha pra download?
    To precisando disso pegar os dados com dotnet e nao sei como resolver.