Google PageRank değerini hesaplama

PageRank, Google'ın site sıralamasında kullandığı algoritmanın sonucu sitenize verdiği değeri gösteren basitleştirilmiş 0'dan 10'a kadar olan bir değerdir. Bu değer genel olarak özgün bir içeriğe, sayfaya verilmiş bağlantılara ve bağlantı veren sayfaların kalitesine bağlı olarak değişir. PageRank, değer olarak sitenizin Google tarafından arama sonuçlarında sıralanmasını ve Google tarayıcısının sitenizi kontrol etme sıklığını etkiler.

Verilen bir URL bilgisine göre PageRank i hesaplayan sınıfımız:

public class GooglePageRank
{
    public GooglePageRank() { }

    private const UInt32 GOOGLE_MAGIC = 0xE6359A60;

    private void _mix(ref UInt32 a, ref UInt32 b, ref UInt32 c)
    {
        a -= b; a -= c; a ^= c >> 13;
        b -= c; b -= a; b ^= a << 8;
        c -= a; c -= b; c ^= b >> 13;
        a -= b; a -= c; a ^= c >> 12;
        b -= c; b -= a; b ^= a << 16;
        c -= a; c -= b; c ^= b >> 5;
        a -= b; a -= c; a ^= c >> 3;
        b -= c; b -= a; b ^= a << 10;
        c -= a; c -= b; c ^= b >> 15;
    }

    string GoogleCH(string url)
    {
        url = string.Format("info:{0}", url);

        int length = url.Length;

        UInt32 a, b;
        UInt32 c = GOOGLE_MAGIC;

        int k = 0;
        int len = length;

        a = b = 0x9E3779B9;

        while (len >= 12)
        {
            a += (UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
            b += (UInt32)(url[k + 4] + (url[k + 5] << 8) + (url[k + 6] << 16) + (url[k + 7] << 24));
            c += (UInt32)(url[k + 8] + (url[k + 9] << 8) + (url[k + 10] << 16) + (url[k + 11] << 24));
            _mix(ref a, ref b, ref c);
            k += 12;
            len -= 12;
        }
        c += (UInt32)length;
        switch (len)  /* all the case statements fall through */
        {
            case 11:
                c += (UInt32)(url[k + 10] << 24);
                goto case 10;
            case 10:
                c += (UInt32)(url[k + 9] << 16);
                goto case 9;
            case 9:
                c += (UInt32)(url[k + 8] << 8);
                goto case 8;
            /* c nin ilk karakteri uzunluk için ayrılmıştır */
            case 8:
                b += (UInt32)(url[k + 7] << 24);
                goto case 7;
            case 7:
                b += (UInt32)(url[k + 6] << 16);
                goto case 6;
            case 6:
                b += (UInt32)(url[k + 5] << 8);
                goto case 5;
            case 5:
                b += (UInt32)(url[k + 4]);
                goto case 4;
            case 4:
                a += (UInt32)(url[k + 3] << 24);
                goto case 3;
            case 3:
                a += (UInt32)(url[k + 2] << 16);
                goto case 2;
            case 2:
                a += (UInt32)(url[k + 1] << 8);
                goto case 1;
            case 1:
                a += (UInt32)(url[k + 0]);
                break;
            default:
                break;
            /* case 0: gerek yok */
        }

        _mix(ref a, ref b, ref c);

        return string.Format("6{0}", c);
    }

    public int GooglePR(string url)
    {
        string checksum = GoogleCH(url);
        string query = string.Format("http://toolbarqueries.google.com/tbr?client=navclient-auto&ch={0}&features=Rank&q=info:{1}", checksum, url);

        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(query);
            string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd();
            return int.Parse(Regex.Match(response, "Rank_1:[0-9]:([0-9]+)").Groups[1].Value);
        }
        catch (Exception)
        {
            return -1;
        }
    }
}

Kullanımı:

string adres = "daltinkurt.com"; 
GooglePageRank gpr = new GooglePageRank(); 
int pr = gpr.GooglePR(adres);

Kısaca açıklamak gerekirse, PR değerini döndüren adresimiz "http://toolbarqueries.google.com/tbr?client=navclient-auto&ch={0}&features=Rank&q=info:{1}" şeklinde. burada 2 parametre var önemli olan:

1. verilecek adrese göre özel oluşturulan bir cheksum değeri.
2. PR i istenen domain

yukarıda verdiğim adres size şu şekilde bir çıktı veriyor:

adres:

http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=64109543998&features=Rank&q=info:daltinkurt.com

çıktısı:

Rank_1:1:5

ufak bir RegExp kullanımı ile sondaki 5 değerini elde edebiliyoruz. Gerisi size kalmış, Veritabanına mı yazarsınız, SMS le ya da Email ile mi gönderirsiniz bilemem. :)

Herkese kolay gelsin.