in ASP.NET

Consumindo a API do Facebook com C#

Existem diversos SDK’s que facilitam a integração com a API do Facebook, para .NET um dos mais completos é o Facebook SDK for .NET, que está disponível no Github, este SDK possui diversos recursos, recentemente fiz um post sobre como trabalhar com o Facebook SDK for .NET.

Entretando, toda a API do Facebook é exposta por protocolos HTTP, sendo possivel utilizar todas suas funções com simples requisições utilizando o WebRequest. Neste post irei demonstrar como criar uma classe para autenticar, ler e postar informações no Facebook.

Começando

Para começar eu criei dois projetos, sendo um Class Library e um WebSite com ASP.NET WebForms:

 

Agora, vamos começar a desenvolver a classe que acessará a API do Facebook, para isso eu criei uma classe chamada AuthFacebook:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Net;

namespace DemoFacebook.BL
{
    public class AuthFacebook
    {
        public enum Method { GET, POST };
        public const string Authorize = "";
        public const string Access_Token = "";
        public string CallBack_Url = "";

        private string _aplicationKey="";
        private string _aplicationSecret = "";
        private string _token = "";

        public string AplicationKey{ get; set; }

        public string AplicationSecret { get; set; }

        public string Token{ get; set; }

        public string GetAuthorizationLink()
        {
            return "";
        }

        public string GetAuthorizationLinkPopup()
        {
            return "";
        }

        public void GetAccessToken(string authToken)
        {

        }

        public string Request(Method method, string url, string postData)
        {
            return "";
        }

        public  string GetWebResponse(HttpWebRequest webRequest)
        {
            return "";
        }
    }
}

Nela eu configurei as propriedades de Secret e Key da aplicação

public enum Method { GET, POST };
public const string Authorize = "https://graph.facebook.com/oauth/authorize";
public const string Access_Token = "https://graph.facebook.com/oauth/access_token";
public string CallBack_Url = "";

private string _aplicationKey="";
private string _aplicationSecret = "";
private string _token = "";

public string AplicationKey
{
    get
    {
        if (_aplicationKey.Length == 0)
        {
            _aplicationKey = ConfigurationManager.AppSettings["Facebook_aplicationKey"];
        }
        return _aplicationKey;
    }
    set { _aplicationKey = value; }
}

public string AplicationSecret
{
    get
    {
        if (_aplicationSecret.Length == 0)
        {
            _aplicationSecret = ConfigurationManager.AppSettings["Facebook_aplicationSecret"];
        }
        return _aplicationSecret;
    }
    set { _aplicationSecret = value; }
}

public string Token{ get; set; }

Nosso próximo passo será programar os dois métodos que retornarão as urls de autenticação:

public string GetAuthorizationLink()
{
    return string.Format("{0}?client_id={1}&redirect_uri={2}&scope={3}",
        Authorize, AplicationKey, CallBack_Url, "publish_stream");
}

public string GetAuthorizationLinkPopup()
{
    return string.Format("{0}?client_id={1}&display=popup&redirect_uri={2}&scope={3}",
        Authorize, AplicationKey, CallBack_Url, "publish_stream");
}

Agora vamos desenvolver o método que utilizará o authToken para requisitar o Token de acesso, um token que poderemos utilizar em definitivo nas nossa aplicação para o determinado usuário:

public void GetAccessToken(string authToken)
{
    this.Token = authToken;
    string accessTokenUrl = string.Format("{0}?client_id={1}&redirect_uri={2}&client_secret={3}&code={4}",
    Access_Token, this.AplicationKey, CallBack_Url, this.AplicationSecret, authToken);

    string response = Request(Method.GET, accessTokenUrl, String.Empty);

    if (response.Length > 0)
    {
        NameValueCollection qs = HttpUtility.ParseQueryString(response);

        if (qs["access_token"] != null)
        {
            this.Token = qs["access_token"];
        }
    }
}

Finalmente vamos desenvolver os últimos dois métodos, eles serão responsáveis por fazer e montar as requisições:

public string Request(Method method, string url, string postData)
{
    HttpWebRequest webRequest = null;
    StreamWriter requestWriter = null;
    string responseData = "";

    webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
    webRequest.Method = method.ToString();
    webRequest.ServicePoint.Expect100Continue = false;
    webRequest.UserAgent = "[Seu user agent]";
    webRequest.Timeout = 20000;

    if (method == Method.POST)
    {
        webRequest.ContentType = "application/x-www-form-urlencoded";

        //POST the data.
        requestWriter = new StreamWriter(webRequest.GetRequestStream());

        try
        {
            requestWriter.Write(postData);
        }
        catch
        {
            throw;
        }
        finally
        {
            requestWriter.Close();
            requestWriter = null;
        }
    }

    responseData = GetWebResponse(webRequest);
    webRequest = null;
    return responseData;
}

public string GetWebResponse(HttpWebRequest webRequest)
{
    StreamReader responseReader = null;
    string responseData = "";

    try
    {
        responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
        responseData = responseReader.ReadToEnd();
    }
    catch
    {
        throw;
    }
    finally
    {
        webRequest.GetResponse().GetResponseStream().Close();
        responseReader.Close();
        responseReader = null;
    }

    return responseData;
}

Chegou a hora de usar nossa classe 🙂 para isso eu vou configurar a aplicação que eu criei no Facebook  (http://developers.facebook.com/)

 

Também irei configurar a Key e o Secret no Web.Config da aplicação:

<appSettings>
  <add key="Facebook_aplicationKey" value="238348076215393"/>
  <add key="Facebook_aplicationSecret" value="c3dddef5412fa014d2832f619e66a845"/>
</appSettings>

Com isso já podemos utilizar nossa classe, criei duas páginas, a Default.aspx e a CallbackFacebook.aspx que será a onde teremos o retorno da autenticação com o Facebook.

Na página CallbackFacebook.aspx eu programei o seguinte:

protected void Page_Load(object sender, EventArgs e)
{
    string url = "";
    AuthFacebook oAuth = new AuthFacebook();
    oAuth.CallBack_Url = "http://localhost:1789/CallbackFacebook.aspx";

    if (Request["code"] == null)
    {
        Response.Redirect(oAuth.GetAuthorizationLink());
    }
    else
    {
        oAuth.GetAccessToken(Request["code"]);

        if (oAuth.Token.Length > 0)
        {
            Session["token"] = oAuth.Token;
            Response.Redirect("~/Default.aspx");
        }
    }
}

Veja que eu “Guardei” o token do usuário em uma Session apenas a titulo de exemplo, sendo que o ideal é guarda-lo em um banco de dados.

Agora eu recupero esse token na Defout.aspx e faço uma requisição a qualquer url da api, o que me retornará um json com o resultado:

protected void Page_Load(object sender, EventArgs e)
{
    AuthFacebook oAuth = new AuthFacebook();
    oAuth.CallBack_Url = "http://localhost:1789/CallbackFacebook.aspx";

    if(Session["token"] ==null)
    {
        Response.Redirect(oAuth.GetAuthorizationLink());
    }
    else
    {
        oAuth.Token = Session["token"].ToString();

        var url = "https://graph.facebook.com/me?access_token=" + oAuth.Token;
        string json = oAuth.Request(AuthFacebook.Method.GET, url, String.Empty);
        ltrJson.Text = json;
    }
}

Lembrando que poderiamos fazer qualquer tipo de requisição, inclusive enviar e postar mensagens para o usuário.

Como exemplo eu retornei os dados do perfil do usuário:

O projto de demo está disponivel no meu github:

https://github.com/rodolfofadino/FacebookDemo

Espero que este post seja útil,

estou a disposição para dúvidas, criticas ou sugestões

abs

Rodolfo

 

 

 

  • alan ferreira

    Cara, só dei uma olhada rápida e acho que vai me ajudar muito num proleto novo. Valeu.

  • Anonymous

    que bom 🙂 da uma olhada nesse sdk http://facebooksdk.codeplex.com/documentation

  • Francisco_berrocal
  • Anonymous

    Cópia do que? de uma classe que faz WeRequest(Get e Post)?, comecei o post falando: “Existem diversos SDK’s que facilitam a integração com a API do Facebook, para .NET um dos mais completos é o Facebook C# SDK”.

    A idéia do post é mostrar que dá para utilizar a API do Facebook com simples request’s. e ainda expliquei 1 por 1.

  • B. Santos

    Parabéns Rodolfo! Artigo sensacional! Melhor que todos os outros que li, e olha que li vários!

  • Munnagp05

    Hi,
    working fine this method , but when we want to message post on friends wall. GOTO Facebook come.? How to avoid it, have any idea
    Reason is if (Request[“code”] == null)
    {
    Response.Redirect(oAuth.GetAuthorizationLink());
    }
    How ro Get Access_Token with Reponse.Redired() method use.???????? URGENT

  • http://www.facebook.com/tatiane.vianna.733 Tatiane Vianna

    Rodolfo, seu post é show de bola. E só de olhar o retorno final já me abriu minha mente para um projeto 10!!!
    Assim que iniciar eu mostrarei como ficará!!!

  • Samuel Silva

    Boas tardes, o seu post vai me ajudar num trabalho para a faculdade, mas estou a precisar da sua ajuda, se eu quiser trazer os post/feeds do meu mural como faço? outra questão é existe forma de agarrar no json e colocar numa datagrid e posteriormente guarda-lo numa bd externa? ja agora muito obrigado pelo seu post e ajuda

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

    Bom dia Samuel, para fazer post no mural do usuário, é só fazer uma chamada (http post) para a api passando os parâmetros necessários https://developers.facebook.com/docs/reference/api/post/

  • Bruno

    Obrigado Rodolfo, porém não estou conseguindo criar um grupo. Tentei os comandos na página oficial do API mas não funciona. Sempre dá um erro. Sabe como posso realizar a criação de um grupo automaticamente via código apenas informando o nome desejado do grupo? Consegui postar, associar usuários em um grupo existente, listar todos os amigos de um usuário,etc. menos isso.

  • Bruno

    Amigo é possível se conectar automaticamente sem a caixa de diálogo do facebook? Poderia via código ser passado o usuário e senha e a conexão ser realizada instantaneamente sem a interação de um usuário com a caixa de login? Outra dúvida é se possível criar um novo grupo, criar um método que crie o grupo sem ter que entrar no próprio facebook e criar manualmente.

    obrigado.

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

    Bruno, não é possível obter o token de autenticação sem a chamada do dialogo do facebook, pois o usuário precisa permitir, uma vez que você tenha o token de acesso, com ele você pode fazer as requisições sem abrir o dialogo novamente

  • http://www.facebook.com/profile.php?id=100002566589025 Lucas NGomes

    Tem alguma forma de listar os álbuns e carregar as fotos em meu aplicativo? Preciso criar albuns tambem.

    Agradeço desde já pelo post!

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

    Sim, a api permite listar albuns e fotos, desde que a permissão necessária seja solicitada, da uma lida na documentação http://developers.facebook.com/docs/reference/api/album/

    abs

  • Fabio Cola

    OLá, muito bom o seu post! Porém eu reparei que o resultado do GET, retorna valores que não aceitam caracteres especiais, sabe dizer por que? Por exemplo: Ao invés de mostrar cidade São Paulo, ele mostra como Su00e3o Paulo . No seu próprio resultado no exemplo também dá para ver se também está assim. Existe alguma solução para isso?!
    Grato,
    Fábio.

  • Jhonathan De Souza Soares

    Olá , parabéns pelo post!
    Somente uma dúvida amigo.
    A url de retorno está usando encode….
    Como posso fazer para corrigir isto e visualizar normalmente os caracters especiais/

    Att

  • Julio

    Boa dica brother, parabéns!

    abraço