OAuth Örneği – Twitter API

İki önceki yazımda OAuth temel bazı bilgiler aktarmıştım. Bir önceki yazımda da sitemiz için Twitter API kaydımızı nasıl yapacağımızı anlatmıştım. Bu yazımda da artık olaya iyice gireceğim. Canlı çalışan bir Twitter API uygulaması yapacağız. Bu uygulama ile web sitenizdeki üyelerin Twitter’larını site hesaplarına ekleme işleminin nasıl olduğunu anlatmayı umuyorum.

Hemen konuya girmek gerekirse OAuth’u sitemize ekleme işlemi 4 adımdan oluşuyor.
1. Twitter’a gidiş
2. Twitter’da onay işlemi
3. Sitemize geri dönüş ve kullanıcımız için token ve secret anahtarlarımızı alma
4. Kullanıcımızın Twitter’ından okuma ve yazma.

Hazır kütüphane olarak Twitter’ın API sitesindeki C# kütüphanelerinden birini kullandım. Türkçe karakter sorununu gidermek için biraz modifiye ettim. Bu kütüphaneyi başka sitelerin OAuth uygulamaları için de kullanabilirsiniz. Örnek uygulamamda ben ASP.Net 3.5 C# kullandım. Çok rahatlıkla önceki versiyonlara yada Visual Basic.Net’e çevirebilirsiniz diye düşünüyorum. Diğer programlama dilleri içinde mantık ve algoritma aynı şekilde işliyor.

Önceki yazımda Twitter API kayıt işlemini anlatmıştım. Oradaki 5 adet parametreyi saklıyoruz. Örnek uygulamamda ben web.config’de tutmayı tercih ettim.

Öncelikle OAuth nesnemizi oluşturuyoruz.

1
2
3
4
5
6
7
8
var OAuth = new oAuth
{
ConsumerKey = ConfigurationManager.AppSettings["ConsumerKey"],
ConsumerSecret = ConfigurationManager.AppSettings["ConsumerSecret"],
REQUEST_TOKEN = ConfigurationManager.AppSettings["REQUEST_TOKEN"],
ACCESS_TOKEN = ConfigurationManager.AppSettings["ACCESS_TOKEN"],
AUTHORIZE = ConfigurationManager.AppSettings["AUTHORIZE"]
};

1. Twitter’a giderken kullanacağımız linkimizi oluşturuyoruz. Bunu yaparken nesnemizin AuthorizationLinkGet() metodunu kullanıyoruz. Burada bilmemiz gereken şu ki, linkimizi oluştururken Twitter’a istek yapıp bir token alıyoruz. Bu token oluşturulurken o anki tarih ve saat de dikkate alındığı için gidiş URL’mizi bir linke vermek yerine butonun onclick olayına koymanızı tavsiye ederim.

1
Response.Redirect(OAuth.AuthorizationLinkGet());

2. Linkimiz doğru çalıştıysa Twitter’a gidiyoruz, kullanıcımız şifresini doğru giriyor ve sitemize izin verdiğini onaylıyor.

3. Twitter kullanıcımızı sitemize geri gönderdiğinde tüm hazırlıklarımızı yapmış olarak bekliyor olacağız. Geri dönüş URL’sine girdiğimiz parametremizde belirttiğimiz sayfamıza “oauth_token” QueryString parametreli olarak gelir. Bu parametreyi nesnemizin AccessTokenGet() metoduyla yine Twitter’a soruyoruz bu isteği bize gerçekten Twitter mı yaptı diye. Eğer Twitter bu aşamada bizi onaylarsa artık kullanıcımızın işlemlerinde kullanacağımız token ve secret anahtarlarını aldık demektir.

1
2
3
4
5
6
7
OAuth.AccessTokenGet(Request["oauth_token"]);
if (oAuth.TokenSecret.Length > 0)
{
// İşlem tamam
string Token = OAuth.Token;
string Secret = OAuth.TokenSecret;
}

Bu aşama aldığımız token ve secret anahtarlarını kullanıcımızın vertabanımızdaki kaydına ekliyoruz. Örneğimde ben basit olsun diye Cookie’ye kaydedip okuttum.

4. Okuma ve Yazma işlemlerine geçebiliriz. Aslında işin zor kısmı önceki adımlar idi. Okuma ve yazma çok daha kolay. Okuma yazma işlemlerinde diğer işlemlerden farklı olarak oluşturduğumuz OAuth nesnemizin Token ve TokenSecret özelliklerine kullanıcımızın Twitter’dan aldığımız bilgilerini atıyoruz.

1
2
OAuth.Token = KullanicimizinTokeni;
OAuth.TokenSecret = KullanicimizinSecreti;

Öncelikle okuma işlemini yapıyoruz. Sonuç “xml” değişkenimize geliyor. XML’i ekrana yazdırarak inceleyebilirsiniz. Kullanıcımızın durum bilgisi “status” node’undaki “text” alanında tutuluyor.

1
2
string url = "http://twitter.com/account/verify_credentials.xml";
string xml = OAuth.oAuthWebRequest(oAuth.Method.GET, url, String.Empty);

Şimdi de yazma.

1
2
3
string url = "http://twitter.com/statuses/update.xml";
string mesaj = "Akşam nereye gitsem diye düşünüyorum...";
string xml = OAuth.oAuthWebRequest(oAuth.Method.POST, url, "status=" + mesaj);

Böylece Twitter uygulamamız hazır. Sitelerinize kolaylıkla uygulayabileceğinizi düşünüyorum. Aşağıda örnek uygulama ve canlı uygulama linklerini veriyorum. Örnek uygulamayı sitenizde test etmeden önce web.config dosyanıza Twitter’dan aldığınız API bilgilerini girmeyi unutmayın.

Örnek uygulamayı buradan indirebilirsiniz.
Canlı çalışan uygulamayı da buradan test edebilirsiniz.

“OAuth Örneği – Twitter API” üzerine 27 düşünce

  1. Merhaba,

    Google için oAuth hakkında bir makale yazmayı düşünüyor musunuz?

    İyi çalışmalar dilerim

  2. Hocam size bir şey soracam diyelim benim uygulamamı kulanan 20 kişi var atıyom ben girdim bi tweet yazdım 20 sindende nasıl paylaşabilirim veya sadece birinden bile paylaşabilsem olur yeterki izin veren kişilerin yerine tweet atabileyim.

  3. Benim yaptığım örnekte Twitter’dan alınan TokenSecret bilgilerini Cookie’ye yazdırıyorum. Sen bu bilgileri veritabanında bir tabloda tutabilirsin. Bu tablodan da sırayla okuyarak bütün hesaplara istediğin Twit’i gönderebilirsin. Tabiiki bunu karşıdaki kişilerin rızası ile yapıyor olmak çok önemli.

  4. Merhaba öncelikle değerli paylaşımınız için herkes gibi bende teşekkür ederim.. anlattıklarınızdan yola çıkarak kendim bir apps oluşturdum fakat anlayamadığım nokta her seferinde uygulama erişim izini istiyor ? bu normalmi bir kere izin verdikten sonra neden her seferinde izin istiyor ?

  5. Normal değil. Normal koşullarda bir kez yetki almak yetiyor. Tek dikkat etmeniz gereken ilgili kullanıcı için yetkiyi aldığınızda Token ve TokenSecret bilgilerini Cookie yada DB’de biryerlerde saklamak gerekiyor. ilgili kullanıcılar için bu bilgiler varsa yetki alma adımını atlıyoruz. Direkt yapacağımız işlemleri yapıyoruz. Verdiğim örneği daha detaylı incelersen anlayacaksın.

  6. Bahadır, teşekkürler kardeş. Bulunmayan bilgiler paylaşmışsın, çok naziksin.

  7. Bahadır bey, aynı işlemi retweet için yapmak istesek;

    const string url = “http://twitter.com/statuses/update.xml”;
    string xml = OAuth.oAuthWebRequest(oAuth.Method.POST, url, “status=” + tbBilgi.Text);

    kısmında ne gibi bir düzenleme yapmamız gerekir. Veya nasıl bir yol izlenmeli, ne dersiniz?

  8. Aşağıdaki adreste konuyla ilgili döküman bulumakta:
    https://dev.twitter.com/docs/api/1.1/post/statuses/retweet/%3Aid

    Retweet yapmak istediğin tweetin ID’sini bilmek gerekiyor.
    https://api.twitter.com/1.1/statuses/retweet/tweetID.json

    Örnek vermek gerekirse de:

    1
    2
    const string url = “https://api.twitter.com/1.1/statuses/retweet/251667114925105153.json”;
    string xml = OAuth.oAuthWebRequest(oAuth.Method.POST, url, “”);

    şeklinde olması gerekiyor.

  9. Bu değerli bilgileri ve uygulamayı direk paylaştığınız için çok teşekkürler. gerçekten çok güzel bir referans oldu benim için. yalnız bugunden itibaren benim uygulama hata vermeye başladı. sizin örnek sayfanızdakine baktığımda onunda aynı hatayı verdiğini gördüm. acaba sizin bu hata ile ilgili bir bilginiz var mı ?

  10. Hata ile ilgili olarak durum şu ki; Twitter yeni API’sini tamamen devreye alıp eski API’yi devreden çıkardı. XML istek ve cevapları iptal etti. Tamamen JSON’a döndü.

    Benim örneğimde düzenlemeleri yaptım, şuan çalışıyor. http://bahadir.almaci.com/oauth/ adresinden test edebilirsiniz. Yapılan değişikliklerle ilgili olarak en kısa zamanda yeni yazımı yayınlayacağım.

  11. Cevap için teşekkürler, yeni yazınızı sabırsızlıkla bekliyoruz.

  12. Response.Redirect(OAuth.AuthorizationLinkGet());
    komutundan sonra
    “The remote server returned an error: (401) Unauthorized.”
    hatası alıyorum,yine bir değişiklik mi yapıldı twitter tarafından acaba?

  13. “Value was either too large or too small for an Int32” şeklinde bir hata veriyor, nasıl bir çözüm bulabiliriz buna.

  14. Hocam Merhaba…
    Kendi siteme dosyaları yüklediğimde çalışmıyor.
    Öncelikle bir index.html sayfası mı oluşturmam gerekiyor herhangi bir sayfaya atmıyor çünkü.
    Yardımcı olursanız çok sevinirim
    Teşekkürler…

  15. Hocam default.aspx.cs dosyasında
    var oAuth = new oAuthTwitter bölümünde hata veriyor.
    Oraya da ConsumerKey yazacak mıyız acaba? iki şekilde de denedim çalışmadı.

    Hala cevabınızı bekliyorum teşekkürler…

  16. Uygulamayı aynen yaptım teşekkürler fakat twitter sayfasından uygulamaya izin verdikten sonra hem sizin uygulamada hemde benim yaptığımda aşağıdaki gibi bir hata veriyor. Çözüm nedir Acaba?

    Server Error in ‘/’ Application.

    Value was either too large or too small for an Int32.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.OverflowException: Value was either too large or too small for an Int32.

    Source Error:

    Line 30: string x = oAuth.oAuthWebRequest(oAuthTwitter.Method.GET, url, String.Empty);
    Line 31:
    Line 32: TwitterObjects.Account root = new JavaScriptSerializer().Deserialize(x);
    Line 33:
    Line 34: string t_screen_name = root.screen_name;

    Source File: d:\websites\almaci.com\subdomains\bahadir\httpdocs\oauth\Default.aspx.cs Line: 32

  17. TwitterObject class’ındaki “int id” olan tanımları “long id” olarak değiştirip deneyebilirsiniz…

  18. Twitter API oluşturma yazısındaki yolla API keylerinizi oluşturup, bunları web.config’deki ilgili alanlara yazmanız gerekiyor.

  19. TwitterObject Class’ındaki “int id” olan tanımları “long id” olarak değiştirip deneyebilirsiniz.

  20. Merhabalar, örneklendirmeleriniz ve makaleniz için çok teşekkür ederiz. Gerçekten çok makbule geçti ve fayda gördüm. Yalnız bir konuda size danışmam gerekti. Ben yetkilendirmeleri yaparken metod başına [Autorized] özniteliğini yerleştiriyorum birçok örnekte bu var.

    Ben simple membership kullanmıyorum ve kendi üyelik sistemim var. Metodun başına koyduğumuz [Authorize] özniteliği membership için mi yoksa OAuth 2.0 nin bir parçası mı, açıkçası tereddütte kaldım.

    Bu konuda bir fikriniz var mıdır ? Hazır membership kullanmıyorsak, OAuth 2.0 yi implement edebiliyor muyuz projemize ?

    Teşekkürlerimi sunarım.

    Ayşe

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir