Yazan : Şadi Evren ŞEKER

Bu yazının amacı, JAVA programlama ortamından, LinkedIn sosyal ağına nasıl bağlanıldığı ve buradaki bilgilerin nasıl çekilerek işlenebileceğini göstermektir. Bu yazı kapsamında sosyal a-ağlar tarafından yoğun olarak kullanılan SCRIBE paketi kullanılacaktır. Yazının içeriğinde geçen kodlar, scribe kütüphanesinin examples dizininde bulunan örneklerden alınmıştır. İlgili kodlara aşağıdaki bağlantıdan erişilebilir:

https://github.com/fernandezpablo85/scribe-java/tree/master/src/test/java/org/scribe/examples

Bilindiği üzere sosyal ağlar üzerinde işlem yapmak için öncelikle bir kullanıcının haklarının tanınması gerekir. Yani kişisel olarak yazacağımız bütün uygulamalar, üzerinde çalışacağı sosyal ağ tarafından tanınmalı ve onaylanmalıdır. Bunun için öncelikle ilgili sosyal ağ üzerinde bir API bir de Application Key ismi verilen iki anahtar değeri almamız gerekir.

Kodlamaya çalıştığımız uygulama LinkedIn üzerinde çalışacağına göre, öncelikle aşağıdaki adrese giderek uygulamamızı kayıt ettiriyor ve bu iki numarayı alıyoruz:

https://www.linkedin.com/secure/developer

Bu anahtarı aldıktan sonra aşağıdaki şekilde bir kod yazılması mümkündür. Ben programın yazılması sırasında netbeans IDE’sini kullanacağım. Ancak siz hangi IDE’yi kullanırsanız kullanın, programın çalışması için önemli olan iki JAR dosyasının projenin kütüphane bilgilerine (library path) veya çalıştırılma dizinine eklenmesi gerekmektedir. Bu dosyalar aşağıda verilmiştir:

  • scribe-1.3.0.jar

  • commons-codec-1.6.jar

Dosyalardan ilki, proje kapsamında kullanacağımız kütüphane olan scribe kütüphanesinin sınıflarını içeren scribe kütüphanesidir. Elbette zaman içerisinde yeni sürümleri çıkacağı için, sizin kodu yazacağınzı dönemdeki en son sürümünü indirerek kurabilirsiniz. Diğer dosya ise Apache projesi içerisinde geliştirilen codecleri içeren kütüphanedir. Bu kütüphanenin de yeni versiyonunu indirmeniz gerekebilir. İşin aslında bizim doğrudan kullanacağımız kütüphane scribe kütüphanesi olup, scribe kütüphanesi de commons kütüphanesini kullanmaktadır, bu yüzden kullanmakta olduğunuz scribe kütüphanesine uygun commons kuütüphanesini kullanmanız daha doğrudur.

Kodlamanın detaylarına girmeden önce OAuth kütüphanesi gereiği aşağıdaki aşamaları geçmemiz gerekmektedir.

Yukarıdaki şekilde de görüldüğü üzere, OAuth protokolü, istemci olarak kabul edilen programımız ve sunucu tarafı olarak kabul edilen LinkedIn arasında geçmektedir.

Yukarıdaki şekilde sol tarafta gösterilen işlemler, programımız tarafından yapılacak işlemlerdir.

Bütün işlemler, programımız tarafından üretilecek olan bir talep ile başlatılmaktadır. Bu talep doğrudan sunucuya gitmekte ve sunucu tarafından işlenmektedir. Bu işleme sırasında programa, daha önceden program içerisinde verilen anahtarlar kapsamında bir onay verilmektedir. Bu onay kapsamında ilave bir URL bilgisi döndürülmekte ve dönen URL bilgisi, kullanıcı tarafından bağlanılarak bu bağlantı sonucunda döndürülen anahtar, programın son kontrolü olan AccessToken işlemi sırasında kullanılmaktadır. Kısacası, OAuth kapsamında, geliştirdiğimiz program ile sunucu, ile üç kere bağlantı kurulmaktadır. Bunlardan ikincisi, kullanıcının bilgisi dahilinde olmalıdır. OAuth protokolü, kullanıcının yetkisi kapsamında işlem yaptığı için, ilgili kullanıcının bu adımı kesin olarak görmesini istenmektedir.

Protokolü açıkladıktan sonra, protokolün kullanıldığı kodlamaya geçebiliriz:

Projemiz kapsamında veri çekeceğimiz URL adresi, ve çekmek istediğimiz verileri belirten parametreler aşağıdaki şekilde verilecektir.

 private static final String PROTECTED_RESOURCE_URL =
"http://api.linkedin.com/v1/people/~/connections:(id,last-name)";
 

Yukarıdaki satırda bulunduğu üzere, linkedin domaini altında bulunan connections adresini çağırabilirsiniz. Bu adresin sonunda, parantez içerisinde bulunan id ve last-name parametreleri, bizim linkedin ağından çekeceğimiz bilgileri ifade etmektedir. Bu listeye daha farklı parametreler eklenerek daha fazla bilginin çekilmesi de mümkündür.

Yukarıda ayrıca adreste bulunan v1, şu anda linkedin tarafından sunulan hizmetlerin birinci sürümünü, people ise almak istediğimiz bilginin kişisel bilgi olduğunu ifade eder. Örneğin linkedin grupları ile ilgili bilgi alınması istenseydi bu durumda farklı bir adres kullanılacaktı.

  OAuthService service = new ServiceBuilder()
                                .provider(LinkedInApi.class)
                               
.apiKey("CiEgwWDkA5BFpNrc0RfGyVuSlOh4tig5kOTZ9q97qcXNrFl7zqk-Ts7DqRGaKDCV")
                               
.apiSecret("dhho4dfoCmiQXrkw4yslork5XWLFnPSuMR-8gscPVjY4jqFFHPYWJKgpFl4uLTM6")
                                .build();

Yukarıdaki satırlar ile OAuthService sınıfından service isminde bir nesne tanımlanmış ve bu nesnenin özellikleri belirtilmiştir. Burada provider özelliği, scribe kütüphanesinden bağlanacağımız LinkedIn sınıfını kullanacağımızı belirtmektedir.

Ayrıca apiKey ve apiSecret ismi verilen parametreler, daha önceden yazının başında verdiğimiz adresten bağlanarak alıdğımız anahtarları yazıyoruz.

Uygulamamız kapsamında, OAuth protokolü kapsamında kullanılan, RequestToken ve AccessToken ismi verilen iki token (jeton) bilgisi kullanıcıdan elle girilmesi istenecektir.

    Token requestToken = service.getRequestToken();
    System.out.println("Got the Request Token!");
    System.out.println();

    System.out.println("Now go and authorize Scribe here:");
    System.out.println(service.getAuthorizationUrl(requestToken));
    System.out.println("And paste the verifier here");
    System.out.print(">>");
    Verifier verifier = new Verifier(in.nextLine());
    System.out.println();

Yukarıdaki kodda, ilk satırda, requestToken ismi verilen token bilgisi, daha önceden tanımladığımız OAuth nesnesinin getRequestToken() fonksiyonu ile alınmıştır. Bu talep bize bir URL bilgisi döndürür. Basitçe ugulamamızın kullanıcının yetkileri ile LinkedIn tarafından tanınması için, LinkedIn’e bağlanacağı adresi belirtmektedir.

Bu adrese kullanıcı el ile bağlanıp, AccessToken ismi verilen token bilgisinin alınması gerekmektedir.

Örnek olarak kodun çalışması aşağıda verilmiştir:

=== LinkedIn's OAuth Workflow ===

Fetching the Request Token...
Got the Request Token!

Now go and authorize Scribe here:
https://api.linkedin.com/uas/oauth/authorize?oauth_token=c8c53517-4d94-47bb-84ce-9efe297eee11
And paste the verifier here
>>

Kod yukarıdaki şekilde çalıştıktan sonra, kodda verilen adresi herhangi bir tarayıcıya adres olarak gösterip bağlanıyoruz. Ardından LinkedIn hesabımız üzerinden bu uygulamanın kullanılacağına dair bir uyarı alıp onaylıyoruz:

Onaylama ekranının ardından, bağlantıda kullanacağımız OAuth Token’ı aşağıdaki ekranda gösterildiği üzere alıp uygulamaya veriyoruz:

Trading the Request Token for an Access Token...
Got the Access Token!
(if your curious it looks like this:
Token[43ee0979-9e63-4719-939c-fb6a2a86f3c7 ,
d789020f-a775-42bc-bcf1-dcd32bcccb00] )

Now we're going to access a protected resource...
Got it! Lets see what we found...

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<connections total="149" count="148" start="0">
  <person>
    <id>1j3M-K7hbV</id>
    <last-name>Adalar</last-name>
  </person>

Yukarıda görüldüğü üzere bağlantı kurulmuş ve ardından, XML olarak kişilerin id ve soy isimlerini (last-name) çekerek liste halinde göstermektedir (yukarıdaki alıntıda, sonucun sadece bir kısmı görülmektedir).


Yorumlar

  1. Hanife

    Merhaba Hocam,
    Web siteme facebook ile login işlemini gerçekleştirmek istiyorum.
    Erişmek istediğim bütün bilgileri çekebiliyorum ancak bu veriler Türkçe karakterleri tanımıyor.
    Birçok yol denedim ancak çözüm yolunu bulamadım.
    Yardımlarınızı bekliyorum.

  2. Şadi Evren ŞEKER Article Author

    Birincisi bastırdığınız ortama göre unicode dönüşümü yapmanız gerekiyor olması. Mesela ekrana System.out ile bastırıyorsanız aşağıdaki dönüşüm işe yarayabilir:

    PrintStream out = new PrintStream(System.out, true, ‘UTF-8’);
    out.println(basilacakString);

    Ayrıca apache commons lang kütüphanesi altında hazır bulunan fonksiyonları kullanarak aşağıdaki dönüşümü yapabilirsiniz (bunu daha çok tavsiye ederim).

    str = org.apache.commons.lang.StringEscapeUtils.unescapeJava(str);

    Bunun yanında programlama ortamınızda Türkçenin doğru ayarlanmış olduğundan emin olun (şayet ortamınız Türkçe desteklemiyorsa zaten doğru karakterleri göremezsiniz):

    http://www.bilgisayarkavramlari.com/2009/01/04/1640/

    Ve son olarak şayet verileri veri tabanı benzeri bir ortamda tutuyorsanız, bu ortamdaki ayarları da kontrol edin, UTF-8 ve Türkçe desteği bulunduğundan emin olun çünkü veriler bu ortama girince bozulabilir.

    Ayrıca en kötü ihtimalle, hiçbirisi çözüm olmadıysa, aşağıdaki tabloda bulunan unicode değerlerini kontrol edip bir dönüşüm yapabilirsiniz.

    ç –> u00E7
    ğ –> u011F
    ı –> u0131
    ş –> u015F
    ö –> u00F6
    ü –> u00FC
    Ç –> u00C7
    Ğ –> u011E
    İ –> u0130
    Ş –> u015E
    Ö –> u00D6
    Ü –> u00DC

  3. umut

    merhaba hocam ben projemde linkedin bağlantısını sağlıyorum ama verifier kodunu elle değil de otomatik girmenin yolu var mıdır acaba ? projem jsf projesi verifier kodunu kullanıcıdan istemek garip kaçıyor biraz

Şadi Evren ŞEKER için bir cevap yazın Cevabı iptal et

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