Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET MVC İle Facebook’a Post Etme

Merhaba,

Oluşturduğunuz içerikleri, raporları yahut mesajları yazılımınız tarafından otomatik bir şekilde Facebook profilinize post etmek ister misiniz? O halde buyrun sizi bu içeriğimize davet ediyorum.

Her ne kadar “Asp.NET MVC İle.. ” diyerek içeriğe başlık atsamda bu makaledeki yöntem ile Asp.NET Web Form, MVC, Console ve Form Application uygulamalarında da aynı çalışmayı gerçekleştirebilirsiniz.

Öncelikle şunu bilmenizi istiyorum ki, Facebook ile yapılacak tüm işlemlerde bir Facebook uygulamasına ihtiyacınız vardır.

Uygulama oluşturmak için;

  • https://developers.facebook.com/apps adresine giriniz ve “Yeni Bir Uygulama Ekle” butonuna tıklayınız.
  • Ekran görüntüsünde de gördüğünüz gibi karşınıza bu pencere açılacaktır. Siz “İnternet Sitesi” kategorisini seçiniz.
    Asp.NET MVC İle Facebook'a Post Etme
  • Uygulamaya aşağıdaki gibi bir isim veriniz.
    Asp.NET MVC İle Facebook'a Post Etme
  • Ardından bir e-posta ve rastgele seçeceğiniz bir kategori ile “Uygulama Kodu Oluştur” butonuna tıklayınız.
    Asp.NET MVC İle Facebook'a Post Etme
  • Yukarıdaki işlemlerden sonra uygulamayı oluşturmuş oluyoruz. Aşağıdaki ekran görüntüsünde de olduğu gibi uygulama ekranındaki bizlere lazım olacak alanları terminolojisiyle birlikte belirtmekteyim. “Uygulama Kodu” diye belirtilen yer aslen “Application ID” diye nitelendirdiğimiz yerken, “Uygulama Gizli Anahtarı” olarak belirtilen yer ise “Application Secret Key” şeklinde terminolojide yer almaktadır.
    Asp.NET MVC İle Facebook'a Post Etme
  • Ve son olarak uygulamanızın ayarlarına girerek “İnternet Sitesi” platformu ekleyerek o anda çalıştığınız local adresi veriniz.

Yazımızda örnek çalışmayı Asp.NET MVC mimarisinde yapacağımızı tekrardan hatırlatarak projemizde Facebook Api’lerini kullanmamızı sağlayan sınıfları barındıran Facebook NuGet paketini aşağıdaki gibi projeye entegre ediniz.
Asp.NET MVC İle Facebook'a Post Etme
Tüm bu işlemlerden sonra artık programatik kısma geçebiliriz.

    class FacebookPost
    {
        public void Post(string Mesaj)
        {
            string app_id = "*************";
            string app_secret = "*************";
            string scope = "publish_actions, manage_pages";

            if (HttpContext.Current.Request["code"] == null)
            {
                HttpContext.Current.Response.Redirect(string.Format(
                    "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}",
                    app_id, HttpContext.Current.Request.Url.AbsoluteUri, scope));
            }
            else
            {
                Dictionary<string, string> tokens = new Dictionary<string, string>();

                string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&scope={2}&code={3}&client_secret={4}",
                    app_id, HttpContext.Current.Request.Url.AbsoluteUri, scope, HttpContext.Current.Request["code"].ToString(), app_secret);

                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream());

                    string vals = reader.ReadToEnd();

                    foreach (string token in vals.Split('&'))
                    {
                        //meh.aspx?token1=steve&token2=jake&...
                        tokens.Add(token.Substring(0, token.IndexOf("=")),
                            token.Substring(token.IndexOf("=") + 1, token.Length - token.IndexOf("=") - 1));
                    }
                }

                string access_token = tokens["access_token"];

                var client = new FacebookClient(access_token);

                client.Post("/me/feed", new { message = Mesaj });
            }
        }
    }

Yukarıda oluşturmuş olduğumuz FacebookPost isimli sınıf içerisindeki Post metodu, kullanıldığı noktada Facebook kullanıcısından yetkileri Check(kontrol) edecek ve eğer yetkiler verildiyse(ki yahut verilmesede) Facebook tarafından aynı adrese yönlendirme işlemi gerçekleştirecektir. Tabi bu şekilde bir algoritmada yetki verilmediği her durumda tekrardan Facebook kullanıcısından yetki talebinde bulunulacaktır. (Yazımızı tam olarak bitirdikten sonra daha gelişmiş bir kullanımda örneklendirme yapacağız.)

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            FacebookPost post = new FacebookPost();
            post.Post("Merhaba, \n Bu mesaj programatik olarak gönderilmiştir. \n Gençay YILDIZ");
            return View();
        }
    }

Bu şekilde bir kullanım sonucunda projemizi derleyip çalıştırdığımızda aşağıdaki gibi bir süreç yaşayacağız.

Asp.NET MVC İle Facebook'a Post Etme
Asp.NET MVC İle Facebook'a Post Etme
Asp.NET MVC İle Facebook'a Post Etme
Asp.NET MVC İle Facebook'a Post Etme
Gördüğünüz gibi mesajımız programatik olarak Facebook’a başarıyla post edilmiştir.

Evet gördüğünüz gibi amacımıza tam olarak ermiş olduk. Şimdi yapmak istediğim, yetki kontrolü yapıldıktan sonra farklı sayfaya yönlendirme yaparak yetkiler verilmiş mi? verilmemiş mi? kontrol edip ona göre işlem yapmaktır.

Bu işlem için algoritmamızı biraz parçalayıp, yaklaşımımızı değiştirmemiz yeterlidir.

    class FacebookPost
    {
        string app_id = "1558218247814218";
        string app_secret = "dd36af3be249aa8342388a27f431b8fc";
        string scope = "publish_actions, manage_pages";

        public void Check()
        {
            UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
            string Yonlendirme = url.Action("PostPage", "Home");
            HttpContext.Current.Response.Redirect(string.Format(
                   "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}",
                   app_id, "http://localhost:55948" + Yonlendirme, scope));
        }

        public void Post(string Mesaj)
        {

            if (HttpContext.Current.Request["code"] != null)
            {
                Dictionary<string, string> tokens = new Dictionary<string, string>();

                string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&scope={2}&code={3}&client_secret={4}",
                    app_id, HttpContext.Current.Request.Url.AbsoluteUri, scope, HttpContext.Current.Request["code"].ToString(), app_secret);

                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream());

                    string vals = reader.ReadToEnd();

                    foreach (string token in vals.Split('&'))
                    {
                        //meh.aspx?token1=steve&token2=jake&...
                        tokens.Add(token.Substring(0, token.IndexOf("=")),
                            token.Substring(token.IndexOf("=") + 1, token.Length - token.IndexOf("=") - 1));
                    }
                }

                string access_token = tokens["access_token"];

                var client = new FacebookClient(access_token);

                client.Post("/me/feed", new { message = Mesaj });
            }
        }
    }

Gördüğünüz gibi Post ve Check işlemlerini parçalayarak farklı metodlara dağıttık. Yapmamız gereken, mesajı gönder talebinde bulunacağımız sayfada kullanıcı yetkilerini kontrol ederken(yani Check metodu kullanılacak) yetkilerin verilmesine görede mesajı post edeceğiz(yani Post metodu kullanılacak).

    public class HomeController : Controller
    {
        FacebookPost post = new FacebookPost();
        public ActionResult Index()
        {
            post.Check();
            return View();
        }

        public ActionResult PostPage()
        {
            post.Post("Merhaba, \n Bu mesaj programatik olarak gönderilmiştir. \n Gençay YILDIZ");
            return View();
        }
    }

Bu işlemlerden sonra projemizi derleyip çalıştırdığımızda, yetkilendirme adımlarından sonra aşağıdaki sahneyle karşılaşacak ve Facebook profilimizde postumuzu görebileceğiz.
Asp.NET MVC İle Facebook'a Post Etme

Şahsen, üzerine çalıştığım platformların sosyal ağlarda yayınlanacak olan içeriklerinde kullanmayı düşündüğüm bir yapılandırma olacaktır. Ayriyetten editörlerin işlerini oldukça kolaylaştıran bir yaklaşımda sergilemektedir.

Tabi ki de geliştirmeye ve her projeye özel artı ve fikirlere açık bir Facebook Api’sidir.

Okuduğunuz için teşekkür ederim…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…

Bunlar da hoşunuza gidebilir...

8 Cevaplar

  1. ahmet dedi ki:

    Yazı için teşekkürler, peki paylaşımları profilimizde değilde her hangi bir sayfamızda paylaşabilir miyiz?

  2. Gençay dedi ki:

    Sevgili okurların dikkatine…

    İlgili içerikte belirtilen yönergeleri uyguladıktan sonra projenizi derleyip çalıştırdığınız vakit şu kısımdan;

    .
    .
    .
                    foreach (string token in vals.Split('&'))
                    {
                        //meh.aspx?token1=steve&token2=jake&...
                        tokens.Add(token.Substring(0, token.IndexOf("=")),
                            token.Substring(token.IndexOf("=") + 1, token.Length - token.IndexOf("=") - 1));
                    }
    .
    .
    .
    

    aşağıdaki hatayı alıyorsanız eğer burada verilen değişikliği uygulayarak yapılan Facebook API güncellemesine projenizi uydurabilirsiniz.
    Aldığımız hata;

    Bu hatanın Türkçe meali
    Uzunluk sıfırdan küçük olamaz.” manasına gelmektedir.

    Burada yapmamız gereken tokens.Add(token.Substring(0, token.IndexOf(“=”)), token.Substring(token.IndexOf(“=”) + 1, token.Length – token.IndexOf(“=”) – 1)); komutundaki ayrıştırma işlemini Newtonsoft kütüphanesinin Json fonksiyonlarını kullanarak daha net bir şekilde gerçekleştireceğiz. Nihayetinde eskiden ilgili komut gelen token değerini “=” sembolüne nazaran gelen parametrik verileri ayrıştırırken, Facebook API güncellemesiyle ilgili token değeri tam bir JSON yapısına büründürülmüş ve “:” sembolüyle ayrıştırılır bir vaziyete getirilmiştir.

    Eğer ki Newtonsoft’u projenize entegre etmek istiyorsanız şu adreste bulunan “Install-Package Newtonsoft.Json” komutu Package Manager Console ekranında çalıştırmanız yeterlidir.

    Kütüphane entegrasyonundan sonra yukarıda vermiş olduğum komut bloğunu aşağıdaki ile değiştirmeniz yeterli olacaktır.

                        var obj = JObject.Parse(vals);
                        access_token = (string)obj["access_token"];
    

    Bütünsel olarak güncel yapılandırılmış kodlarımız aşağıdaki gibi olacaktır.

    class FacebookPost
        {
            public void Post(string Mesaj)
            {
                string app_id = "837223103084898";
                string app_secret = "14b19d005b251b0de08edb5c6f97b401";
                string scope = "publish_actions, manage_pages";
    
                if (HttpContext.Current.Request["code"] == null)
                {
                    HttpContext.Current.Response.Redirect(string.Format(
                        "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}",
                        app_id, HttpContext.Current.Request.Url.AbsoluteUri, scope));
                }
                else
                {
                    Dictionary<string, string> tokens = new Dictionary<string, string>();
    
                    string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&scope={2}&code={3}&client_secret={4}",
                        app_id, HttpContext.Current.Request.Url.AbsoluteUri, scope, HttpContext.Current.Request["code"].ToString(), app_secret);
                    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                    string access_token = "";
                    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                    {
                        StreamReader reader = new StreamReader(response.GetResponseStream());
    
                        string vals = reader.ReadToEnd();
                        
                        var obj = JObject.Parse(vals);
                        access_token = (string)obj["access_token"];
                    }
                    var client = new FacebookClient(access_token);
                    client.Post("/me/feed", new { message = Mesaj });
                }
            }
        }
    

    Eğer konuyla alakalı yeni bir Facebook API güncellemesi olursa bu makalenin yorum kısmını takip etmenizi öneririm.
    Sevgiler…

  3. ilker dedi ki:

    Gönderileri facebook üzerinden sayfaya çekme islemini nasıl yapabiliriz

  4. onur dedi ki:

    Gencay bey merhaba kullanıcı facebook a giriş yaptıktan sonra kullanıcıya göre post yapabilecegimiz bir olay varmı ?

  5. mehmet dedi ki:

    Kaynak kodları da paylaşırsanız daha faydalı olur(github vs).

  6. Oğuz dedi ki:

    Hocam merhaba,

    Bu güzel makale için öncelikle teşekkür ederim, Ben bir konu da takıldım sizden yardım rica edeceğim.

    Aşağıdaki hatayı alıyorum yardımcı olursanız çok sevinirim.

    “Invalid Scopes: publish_actions, manage_pages. This message is only shown to developers. Users of your app will ignore these permissions if present. Please read the documentation for valid permissions at: https://developers.facebook.com/docs/facebook-login/permissions

Gençay için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir