Bir sitenin FavIcon'unu bulma

URL'i verilen bir sitenin favicon'unu nasıl bulursunuz? İster kod yazın, ister Google'dan faydalanın...

Üzerinde çalıştığım bir projede URL'i verilen bir sitenin FAVICON'unu bulmam gerekti.

(Bu arada FavIcon ile ilgili detaylı bilgiyi FAVICON Kullanımı başlıklı yazımda bulabilirsiniz.)

Ben de bu yazıda, bu işi gerçekleştiren kodlarımı göstereceğim, ardından da "ne gerek var bu kadar koda, Google Amca zaten bu işi yapıyor" diyerek Google aracılığıyla FavIcon bulmayı anlatacağım.

Buyrun kodlarım:

.aspx tarafında bir textbox, bir button ve bir de image var. (textbox a url gireriz, butona basarız, image te favicon gösterilirsmiley)

URL: <asp:TextBox ID="txtUrl" runat="server" Width="300px" />
<asp:Button ID="btnUrl" runat="server" Text="Favicon getir" 
    onclick="btnUrl_Click" />
<asp:Image ID="imgFavicon" runat="server" Style="display: block;" />

.aspx.cs te faviconu getirelim:

protected void btnUrl_Click(object sender, EventArgs e)
{
    string url = txtUrl.Text;
    if (!url.StartsWith("http://") || !url.StartsWith("https://"))
        url = "http://" + url;
    Uri uri = new Uri(url);
    var url2 = uri.Scheme + "://" + uri.Authority;
    string userAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7";

    var doc = new HtmlDocument
    {
        OptionCheckSyntax = true,
        OptionFixNestedTags = true,
        OptionAutoCloseOnEnd = true,
        OptionReadEncoding = true
    };
    HttpDownloader downloader = new HttpDownloader(url, null, userAgent);
    string html = downloader.GetPage();

    doc.LoadHtml(html);

    var favicon = doc.DocumentNode.SelectSingleNode("//link[@rel='shortcut icon']");
    string faviconimg = "";
    if (favicon != null)
        faviconimg = favicon.GetAttributeValue("href", String.Empty);
    else
    {
        favicon = doc.DocumentNode.SelectSingleNode("//link[@rel='icon']");
        if (favicon != null)
            faviconimg = favicon.GetAttributeValue("href", String.Empty);
    }
    if (!string.IsNullOrEmpty(faviconimg))
        if (!faviconimg.StartsWith("http"))
            faviconimg = url2 + ("/" + faviconimg).Replace("//", "/");
    imgFavicon.ImageUrl = faviconimg;
}

Bu kodlar için 2 adet yardımcı kullandım. Biri Html Agility Pack kütüphanesi, diğeri de HttpDownloader sınıfı.

Özellikle Html Agility Pack sayfasını incelemenizi tavsiye ederim. Kısaca "Html Parser" işini görüyor. Parse işleminde LINQ'i bile kullanabiliyorsunuz.

Bu yazının konusu değil ama örnek olması açısından sitedeki tüm "a" etiketlerinden "target" attribute ü "_blank" olanları listelemek istersek şu kodu kullanabiliyoruz:

var tumlinkler = from l in document.DocumentNode.Descendants()
                  where l.Name == "a" && 
                       l.Attributes["href"] != null && 
                       l.Attributes["target"] == "_blank"
                  select new
                  {
                     Url = l.Attributes["href"].Value,
                     Text = l.InnerText
                  };

HttpDownloader sınıfı ise kısaca, sıkıntısız bir şekilde sitenin html kodlarını elde etmeyi sağlıyor diyebilirim. İsteyen kodları indirme linkinden demo projeyi indirip inceleyebilirler.


Neyse biz konumuza dönelim; favicon getirme kodlarını paylaştım. Şimdi de ekran görüntüleri ile sayfanın nasıl çalıştığını görelim:

gibi.

Şimdi de bu kadar hikayeye ne gerek var ki diyelim ve kısa yoldan Google ile bu işi nasıl yapacağımızı görelim:

Bunun için aynı .aspx tarafında bir değişikliğe gitmeyip sadece kod tarafını değiştiriyoruz:

protected void btnUrl_Click(object sender, EventArgs e)
{
    string url = txtUrl.Text;
    imgFavicon.ImageUrl = string.Format("http://www.google.com/s2/favicons?domain={0}", url);
}

Bu kadar smiley.

Bizim yapacağımız tek şey http://www.google.com/s2/favicons?domain=daltinkurt.com şeklinde URL'i çağırmak.

İsteyen yukardaki linke tıklayıp sonucu görebilir.

Aynı sonucu https://s2.googleusercontent.com/s2/favicons?domain=daltinkurt.com adresinden elde edebiliyoruz.

Google Profil sayfamdan (Bağlantılar) bu yöntemi kullanarak profilime eklediğim sitelerimin faviconlarımın nasıl getirildiğini görebilirsiniz.

Sizi bilmem ama ben bir daha favicon elde etmek için Google Amca'dan faydalanacağım. Bu kadar kod yazmaya ne gerek var?...

Herkese iyi çalışmalar...

Websitesi projesini buradan indirebilisiniz.