Kısa URL Servisleri

Twitter gibi sosyal paylaşım siteleri arttıkça günümüzde popüler olan konulardan birisi de URL kısaltma servisleri oldu...

Twitter gibi sosyal paylaşım siteleri arttıkça günümüzde popüler olan konulardan birisi de URL kısaltma servisleri oldu. Nedeni oldukça basit. Twitter bildiğiniz gibi 144 karaktere kadar olan mesajları kabul ediyor. Bu durumda uzun bir URL yi twitterda paylaşmak istediğinizde size mesaj yazacak yer kalmayabiliyor. :)

Aynı şekilde, diğer sosyal paylaşım ortamlarında da bir URL paylaşmak istediğinizde karşı tarafa uzun ve bazen de bir o kadar da anlamsız linkler gönderiyorduk.

Yine benzer durum bir arkadaşınıza google da yaptığınız bir arama sonucunu göndermek istediğinizde de yaşanıyor.

Şu link örneklerine bir bakın:

/DevrimAltinkurt/CMS/Icerik/121/Internet-Programciligi-ve-Veritabani-dersleri-1--donem-1--sinav-sorulari.aspx

http://maps.google.com/maps?f=d&saddr=New+York+Penn+Station&daddr=9th+Ave+%26+14th+St,+New+York,+NY&hl=en&geocode=&mra=ls&dirflg=r&date=11%2F12%2F08&time=4:13pm&ttype=dep&noexp=0&noal=0&sort=&sll=40.746175,-73.998395&sspn=0.014468,0.036392&ie=UTF8&z=14

Çoook uzun. :)

Bu noktada yukarıda bahsettiğim URL kısaltma servisleri devreye giriyor. En popüler olanlar şunlar:

Ufak bir inceleme yapalım, yukarıdaki maps.google.com üzerindeki harita linkini bu servisler aracılığıyla kısaltalım:

Sonuçlar:

 Gördüğünüz gibi 252 karakterlik bir URL, yukarıdaki servisler aracılığıyla 20-25 karaktere kadar kısaltılıyor. :)

Şimdi gelelim bizler web sitelerimizde, URL kısaltma işlemini kendimiz yapmak istersek ne yapabiliriz.

Alternatif çözüm önerileri:

1. Yukarıdaki servislerin API lerini kullanabilirsiniz.. Öncelikle ilgili servise girip kayıt olmanız gerekiyor. (örn: http://bit.ly/apidocs) Bu işlemin ardından size APPID ve KEY şeklinde 2 bilgi alacaksınız. Bu 2 bilgiyi kullanarak programlarınızda bu API leri rahatlıkla kullanabilirsiniz. (Yazının esas konusu olmadığı için detaylı anlatmayacağım.)

bit.ly yi kullanabileceğiniz örnek bir metod:

string Shorten(string url, string login, string key, bool xml)
{
  url = Uri.EscapeUriString(url);
  string reqUri =
  String.Format("http://api.bit.ly/v3/shorten?" +
    "login={0}&apiKey={1}&format={2}&longUrl={3}",
    login, key, xml ? "xml" : "txt", url);

  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(reqUri);
  req.Timeout = 10000; // 10 seconds

  // if the function fails and format==txt throws an exception
  Stream stm = req.GetResponse().GetResponseStream();
  if (xml)
    {
      XmlDocument doc = new XmlDocument();
      doc.Load(stm);
      
      // error checking for xml
      if (doc["response"]["status_code"].InnerText != "200")
         throw new WebException(doc["response"]["status_txt"].InnerText);
      return doc["response"]["data"]["url"].InnerText;
    }
      else // Text
    using (StreamReader reader = new StreamReader(stm))
       return reader.ReadLine();
}

Bu konu ile ilgili kod örneklerini burada bulabilirsiniz.

2. Bu 3. parti kodlarla uğraşmaktansa kendiniz bu servisi yazmak isteyebilirsiniz. (Benim tercihim de budur.)

O zaman bunu nasıl yapabileceğimizi düşünmeye başlayalım:

Önce tablomuzu oluşturalım:

(Tıklanma sayısını tutmak istersek eklemeler yapabiliriz, çok da önemli değil şimdilik)

Şimdi bir sınıf yazalım. 2 metodu olsun, biri verilen uzuuuun url yi kisaurl ye çevirsin, diğeri de bu işlemin tam tersini yapsın.

Sınıfımız şu şekilde:

public class URLServisi
{
  public static string URLKisalt(string longurl)
  {
     string domain = "http://www.yoururl.com/";
     using (var db = new URLModel.URLEntities())
     {
      var url = db.urls.Where(x => x.longurl.Equals(longurl));

      // Tablomuza daha önceden eklendiyse varolanı döndürelim
      if (url.Count() > 0)
        return url.FirstOrDefault().shorturl;

      string unique = UniqueKey.RandomCharacters();
      URLModel.urls newUrl = new URLModel.urls();
      newUrl.longurl = longurl;
      newUrl.shorturl = domain + unique;
      db.AddTourls(newUrl);
      db.SaveChanges();
      return newUrl.shorturl;
     }
  }
  public static string URLGetir(string shorturl)
  {
     using (var db = new URLModel.URLEntities())
       {
         var url = db.urls.Where(x => x.shorturl.Equals(shorturl)).FirstOrDefault();
         if (url == null)
         throw new Exception("Böyle bir URL yok");
         else
         return url.longurl;
       }
  }
}

Ben Entity Framework ü kullandım. Siz istediğiniz şekilde implement edebilirsiniz. :)

Burada belirtmek istediğim bir husus var: Dikkat ettiyseniz kısa url yi oluştururken kullandığım UniqueKey.RandomCharacters() adında bir metod var. Yaptığı iş son derece basit. RNGCryptoServiceProvider ve Random sınıflarını kullanarak eşsiz (unique) bir rastgele değer üretiyor. (Bu konuda daha önceden bir yazı eklemiştim)

Eşsiz bir değer üretme işlemini değişik yolla da yapabilirdik.

Rastgele bir değer üretmek yerine, oluşan yeni url nin ID bilgisini kullanarak, uzun url yi a'dan z'ye 26 harf, A'dan Z'ye 26 harf ve 0'dan 9'a 10 harf toplam 62 karakter kombinasyonuna dönüştürebilirdik. (base 62)

Bunu yapabileceğimiz sınıf:

public static class ShortCodes
{
const string shortcode_Keyspace = "abcdefghijklmnopqrstuvwxyz0123456789";
const int shortcode_maxLen = 12;
public static string LongToShortCode(long number)
{
int ks_len = shortcode_Keyspace.Length;
string sc_result = "";
long num_to_encode = number;
long i = 0;
do
{
i++;
sc_result = shortcode_Keyspace[(int)(num_to_encode % ks_len)] + sc_result;
num_to_encode = ((num_to_encode - (num_to_encode % ks_len)) / ks_len);
} while (num_to_encode != 0);
return sc_result;
}
public static long ShortCodeToLong(string shortcode) {
int ks_len = shortcode_Keyspace.Length;
long sc_result = 0;
int sc_length = shortcode.Length;
string code_to_decode = shortcode;
for (int i = 0; i < code_to_decode.Length; i++)
{
sc_length--;
char code_char = code_to_decode[i];
sc_result += shortcode_Keyspace.IndexOf(code_char) * (long)(Math.Pow((double)ks_len, (double)sc_length));
} return sc_result;
} }

Tüm kodlara buradan ulaşabilirsiniz.

İşte böyle dostlar. Siz de kendiniz programlarınızda bu kodları kendinize uyarlayarak kullanabilirsiniz.

Herkese kolay gelsin.