Wednesday, 7 September 2011

Retrieving facebook contacts

First you need to create an app on facebook app from following url  http://developers.facebook.com/
 

Click on app option and you will get following window from where you can create new application on facebook by clicking on create new app button.


after cliccking on create new app button you will get following window 

 

Give your app name and check the checkbox for terms and conditions of facebook. after that click on continue button.

by that your app will be created on facebook and you will get app id and secret which we have to use in our code.



I am using facebook graph api  to import facebook contacts in our asp.net application. we need to include facebookGraphApi.dll and Newtonsoft.json.dll in your project. after that you need to add config section in web.config file.

<configuration>
 <configSections>
    <section name="FacebookGraphToolkitConfiguration" type="Facebook_Graph_Toolkit.FacebookGraphToolkitConfiguration"/>
  </configSections>
  <FacebookGraphToolkitConfiguration FacebookAppID="yourAppKey" FacebookAppSecret="YourAppSecret"/>

</configuration>

add oAuthFacebook.cs file in your project which contains:
-------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections.Specialized;
using System.IO;
using System.Net;

public class oAuthFacebook
{
    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 const string CALLBACK_URL = "http://www.yourSite.com/CallBack.aspx";

    private string _consumerKey = "";
    private string _consumerSecret = "";
    private string _token = "";

    public oAuthFacebook()
    {
    }

    #region Properties

    public string ConsumerKey
    {
        get
        {
            if (_consumerKey.Length == 0)
            {
                _consumerKey = "xxxxxxxx"; //Your application ID
            }
            return _consumerKey;
        }
        set { _consumerKey = value; }
    }

    public string ConsumerSecret
    {
        get
        {
            if (_consumerSecret.Length == 0)
            {
                _consumerSecret = "xxxxxxxxxxxxxxxxxxxxxxx";//Your application secret
            }
            return _consumerSecret;
        }
        set { _consumerSecret = value; }
    }

    public string Token { get { return _token; } set { _token = value; } }

    #endregion

    /// <summary>
    /// Get the link to Facebook's authorization page for this application.
    /// </summary>
    /// <returns>The url with a valid request token, or a null string.</returns>
    public string AuthorizationLinkGet(string url)
    {
        return string.Format("{0}?client_id={1}&redirect_uri={2}", AUTHORIZE, this.ConsumerKey, url);
    }

  
    public void GetAccessToken(string authToken,string url)
    {
        this.Token = authToken;
        string accessTokenUrl = string.Format("{0}?client_id={1}&redirect_uri={2}&client_secret={3}&code={4}",
        ACCESS_TOKEN, this.ConsumerKey, url, this.ConsumerSecret, authToken);

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

        if (response.Length > 0)
        {
            //Store the returned access_token
            NameValueCollection qs = HttpUtility.ParseQueryString(response);

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

    public void AccessTokenGet(string authToken)
    {
        this.Token = authToken;
        string accessTokenUrl = string.Format("{0}?client_id={1}&redirect_uri={2}&client_secret={3}&code={4}",
        ACCESS_TOKEN, this.ConsumerKey, CALLBACK_URL, this.ConsumerSecret, authToken);

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

        if (response.Length > 0)
        {
            //Store the returned access_token
            NameValueCollection qs = HttpUtility.ParseQueryString(response);

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

    /// <summary>
    /// Web Request Wrapper
    /// </summary>
    /// <param name="method">Http Method</param>
    /// <param name="url">Full url to the web resource</param>
    /// <param name="postData">Data to post in querystring format</param>
    /// <returns>The web server response.</returns>
    public string WebRequest(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 = "[You 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 = WebResponseGet(webRequest);
        webRequest = null;
        return responseData;
    }

    /// <summary>
    /// Process the web response.
    /// </summary>
    /// <param name="webRequest">The request object.</param>
    /// <returns>The response data.</returns>
    public string WebResponseGet(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;
    }
}

-------------------------------------------------------------------------------------

Default.aspx:

now create a signIn button like:
<body>
<input id="btnFBSignIn" type="button" value="Facebook SignIn" onclick="javascript:FBSignIn();"/>
</body>

<script type="text/javascript">
        function FBSignIn() {
            top.location.href = "https://graph.facebook.com/oauth/authorize?client_id=YOURCLIENTID&redirect_uri=YOURREDIRECTURL&scope=publish_stream,email,offline_access";
        }
 </script>

NOTE: your YOURREDIRECTURL must be same as which you have specified while creating app in facebook and OAuthFacebook.cs file.

After that when you will click on this sign in button it will redirect to facebook login and then it will ask for the permissions which you have specified in scope in script if user allow the permission it will redirect to that page which you have specified in your script as well as in OAuthFacebook.cs file.In my case it is callback.aspx.
-----------------------------------------------------------------------------
callback.aspc.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Facebook_Graph_Toolkit.GraphApi;----dont forget to include it.


protected void Page_Load(object sender, EventArgs e)
    {
        if (Request["code"] != null)
        {
            getFacebookProfile();
        }
    }

private void getFacebookProfile()
    {      
    string fullName, facebookId, email, photoPath = "", friendId, friendName;

        oAuthFacebook oAuth = new oAuthFacebook();

        if (Request["code"] == null)
        {

            oAuth.AccessTokenGet(Request["code"]);

        }
        else
        {
            try
            {
                oAuth.AccessTokenGet(Request["code"]);
                Api api = new Api(oAuth.Token);
-------------------------------------------------------
You can get user profile with this user object :

                User u = api.GetUser();
                facebookId = api.UserID;
                fullName = u.first_name + " " + u.last_name;
                email = u.email;
                photoPath = api.GetPictureURL(u.id);
----------------------------------------------------------
user friend list

                IList friends = (IList)api.GetFriends();
                int k = 1;
                foreach (Facebook_Graph_Toolkit.FacebookObjects.NameIDPair pair in friends)
                {
                    friendId = pair.id;
                    friendName = pair.name;
                }
-------------------------------------------------------              
            }
            catch
            {
            }
        }
    }

2 comments:

  1. friends email ids importing is possible ,

    ReplyDelete
  2. hello,

    This is a great tutorial. But i am facing problem in "using Facebook_Graph_Toolkit.GraphApi;"

    its showing me an error that is.
    "the type or namespace name 'Facebook_Graph_Toolkit' could not be found"

    please help me to solve this problem. Its urgent.

    Thanks in advance

    ReplyDelete