2011-03-21 46 views
1

我可以使用C#以編程方式創建Google提醒(http://www.google.com/alerts),並使用該提要在asp.net應用程序中顯示嗎?我知道Google沒有提供這樣做的API。我需要你的建議/想法。如何以編程方式創建Google提醒

在此先感謝,

+1

的可能重複[?谷歌快訊API(http://stackoverflow.com/questions/860442/google-alerts-api) – jgauffin 2011-03-21 14:46:04

+1

這個問題並沒有要求創建警報,只是解析它們。我不認爲它是一個確切的重複。 – 2011-03-21 14:47:15

+0

這可能與此[問題](http://stackoverflow.com/questions/860442/google-alerts-api) – Richard 2011-03-21 14:45:21

回答

4

由於這只是一個HTML形式的職位,以http://www.google.com/alerts/create?gl=us&hl=en(本地化當然不談,),你可以編程式地做同樣的事情。因爲(如你所說)沒有公開的API,這個頁面/表單/ URL /等的任何部分。可隨時更改,並破壞您的申請。

+0

是的但在發佈操作之前,(如該頁面中提到的:http://stackoverflow.com/questions/26857/how-do-你以編程方式填寫表單和發佈網頁/ 26881#26881)我必須登錄到我的谷歌帳戶。我不是嗎?在我的代碼可以工作的機器上將我的谷歌身份驗證設置爲「記住我」就足夠了嗎? – anilca 2011-03-21 14:56:51

+0

否;您的應用程序必須在每個帖子中發送會話cookie。 – 2011-03-21 14:58:40

+0

如何找出我要發送參數的格式?使用嗅探器? – anilca 2011-03-21 15:24:38

3

對不起,這不是C#,但應該是任何人想要實現這樣的事情的幫助。此PHP代碼創建Feed並返回RSS網址以供使用。

基於此頁面代碼:

Login to Google with PHP and Curl, Cookie turned off?

function createAlert($search) { 

     $USERNAME = 'EMAIL_ADDRESS'; 
     $PASSWORD = 'PASSWORD'; 
     $COOKIEFILE = 'cookies.txt'; 

     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
     curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
     curl_setopt($ch, CURLOPT_COOKIEJAR, $COOKIEFILE); 
     curl_setopt($ch, CURLOPT_COOKIEFILE, $COOKIEFILE); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 120); 

     curl_setopt($ch, CURLOPT_URL, 
     'https://accounts.google.com/ServiceLogin?hl=en&service=alerts&continue=http://www.google.com/alerts/manage'); 
     $data = curl_exec($ch); 

     $formFields = $this->getFormFields($data); 

     $formFields['Email'] = $USERNAME; 
     $formFields['Passwd'] = $PASSWORD; 
     unset($formFields['PersistentCookie']); 

     $post_string = ''; 
     foreach($formFields as $key => $value) { 
     $post_string .= $key . '=' . urlencode($value) . '&'; 
     } 

     $post_string = substr($post_string, 0, -1); 

     curl_setopt($ch, CURLOPT_URL, 'https://accounts.google.com/ServiceLoginAuth'); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); 

     $result = curl_exec($ch); 

     if (strpos($result, '<title>Redirecting') === false) { 
      var_dump($result); 
      die("Login failed"); 
     } else { 
      curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/alerts'); 
      curl_setopt($ch, CURLOPT_POST, 0); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, null); 

      $result = curl_exec($ch); 

      // Create alert 

      preg_match('/<input type="hidden" name="x" value="([^"]+)"/', $result, $matches); 

      $post = array(
       "x" => $matches[1],  // anti-XSRF key 
       "q" => $search,  // Search term 
       "t" => 7,  // Result type (everything) 
       "f" => 1,  // Frequency (once a day) 
       "l" => 1,  // How many (all results) 
       "e" => "feed"  // Type of delivery (RSS) 
      ); 

      $post_string = ''; 

      foreach($post as $key => $value) { 
       $post_string .= $key . '=' . urlencode($value) . '&'; 
      } 

      $post_string = substr($post_string, 0, -1); 

      curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/alerts/create'); 
      curl_setopt($ch, CURLOPT_POST, 1); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); 

      $result = curl_exec($ch); 
      $matches = array(); 
      preg_match('#<a href="(http://www.google.com/alerts/feeds/[\d/]+)"#', $result, $matches); 

      $top_alert = $matches[1]; 

      return $top_alert; 
     } 
    } 


    function getFormFields($data) 
    { 
     if (preg_match('/(<form.*?id=.?gaia_loginform.*?<\/form>)/is', $data, $matches)) { 
      $inputs = $this->getInputs($matches[1]); 

      return $inputs; 
     } else { 
      die("didn't find login form"); 
     } 
    } 

    function getInputs($form) 
    { 
     $inputs = array(); 

     $elements = preg_match_all('/(<input[^>]+>)/is', $form, $matches); 

     if ($elements > 0) { 
      for($i = 0; $i < $elements; $i++) { 
       $el = preg_replace('/\s{2,}/', ' ', $matches[1][$i]); 

       if (preg_match('/name=(?:["\'])?([^"\'\s]*)/i', $el, $name)) { 
        $name = $name[1]; 
        $value = ''; 

        if (preg_match('/value=(?:["\'])?([^"\'\s]*)/i', $el, $value)) { 
         $value = $value[1]; 
        } 

        $inputs[$name] = $value; 
       } 
      } 
     } 

     return $inputs; 
    } 
+0

您可能想要尋找一個PHP問題。您不應該發佈與問題所需語言不同的答案。 – 2013-02-16 01:26:44

+1

你不認爲使用稍微不同的語言的實際代碼比「哦,這種方法可能奏效,祝你好運!」更好?在我看來,翻譯現有代碼要比編寫自己的代碼容易得多。我在尋找這個問題的答案時發現了這個問題,如果它有C#代碼,我會用它作爲一個起點,並且是一個快樂的人。 – 2013-02-16 05:48:04