2012-01-17 140 views
1

我使用下面的代碼,但它是給出超時錯誤。雖然我的IP沒有被阻止,我可以通過firefox addon searchstatus進行檢查。我使用的下面的代碼看起來像過時的,而不是體面的。所以我的問題是我怎麼能得到URL的網頁排名與C#4.0如何使用c#獲取網址谷歌網頁排名#

 private const UInt32 GOOGLE_MAGIC = 0xE6359A60; 

    private static 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; 
    } 

    public static 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; 
      /* the first byte of c is reserved for the length */ 
      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: nothing left to add */ 
     } 

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

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

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

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

C#4.0

通知:當有在網址中使用特殊字符,例如&

+0

您可能會考慮運行提琴手,看看確切的查詢是由firefox發送的。 – NotMe 2012-01-17 21:36:33

+0

Chris Lively謝謝你的回答,但我發現了錯誤。錯誤是哈希函數。當網址中有特殊字符時,它就會失敗。那麼我該如何解決哈希問題 – MonsterMMORPG 2012-01-17 21:37:33

回答

0

只是檢查出現問題爲特定網站的主機,而不是完整的網址

網站的URL主機有&?

+0

這會如何幫助。這裏的目的是獲得完整的網址pagerank – MonsterMMORPG 2012-02-17 09:26:45

+0

你好,我跑你發佈的代碼,並且它是拋出一個錯誤。算術錯誤。當我檢查時,上面的代碼沒有獲得PR,而是在搜索框中返回一個帶有「info:domain」的網頁作爲查詢,並且返回一個結果。該代碼仍然有效,也許我可以幫你調試 – Smith 2012-02-17 13:38:12

+0

是的代碼工程。我的成功率約爲90% – MonsterMMORPG 2012-02-17 20:12:46