2009-06-03 13 views
3

私はwebから見つけた次のコードで自分のアプリケーションでgoogleにログインできます。それは応答として認証コードを返しています。 Googleのヘルプによると、この認証コードは将来のPOST/GETリクエストの送信に使用する必要があります。C#を使用してGoogle Spreadsheetsをダウンロードするには?

Googleにログインしているときに普通に行うことができる http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=DOCUMENT_ID&fmcmd=4からExcel形式のスプレッドシートをダウンロードする必要があります。

C#で認証コードを使用して上記ファイルのリクエストを送信するにはどうすればよいですか? 私はGoogle Data APIを使用しているスレッドを見ました。私はそれを利用したくありません。

以下は、ログインするためのコードサンプルです。正常に動作します。私はHTMLとしてストリームを保存して、それがためにプロンプ​​トされたブラウザで開く場合

<html><head><title>Redirecting</title> 
<meta http-equiv="refresh" content="0; url=&#39;http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=p_zC6U3bOsLTuXeUdmQI1RA&amp;fmcmd=4&amp;pli=1&amp;auth=DQAAAIoAAAAfbQUnX8EaZzQcBSIRJSeU4xtFF6ITt9069JLJyJsoqFGMzSE8HrvArHmGPoA-Wf2CbhnDQv_bGKXye2_qyL6EAhTEdOs6Alz-VMeYFsqdGlYjxospBokgCO1958kSVuVFRe9UuKkfV2f_6ZX8SROMkMNdMz3MW8Wh3UNmflIX4E92CpnMleSjCRVpH9x5gSQ&amp;gausr=username%40gmail.com&#39;"></head> 
<body bgcolor="#ffffff" text="#000000" link="#0000cc" vlink="#551a8b" alink="#ff0000"><script type="text/javascript" language="javascript"> 
    location.replace("http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key\x3dp_zC6U3bOsLTuXeUdmQI1RA\x26fmcmd\x3d4\x26pli\x3d1\x26auth\x3dDQAAAIoAAAAfbQUnX8EaZzQcBSIRJSeU4xtFF6ITt9069JLJyJsoqFGMzSE8HrvArHmGPoA-Wf2CbhnDQv_bGKXye2_qyL6EAhTEdOs6Alz-VMeYFsqdGlYjxospBokgCO1958kSVuVFRe9UuKkfV2f_6ZX8SROMkMNdMz3MW8Wh3UNmflIX4E92CpnMleSjCRVpH9x5gSQ\x26gausr\x3dusername%40gmail.com") 
    </script></body></html> 

 string str = "/accounts/ClientLogin HTTP/1.0 Content-type: application/x-www-form-urlencoded accountType=GOOGLE&[email protected]&Passwd=password&service=cl&source=Gulp-CalGulp-1.05"; 

     string uri = "https://www.google.com/accounts/ClientLogin"; 

     HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri); 
     request.KeepAlive = false; 
     request.ProtocolVersion = HttpVersion.Version10; 
     request.Method = "POST"; 

     byte[] postBytes = Encoding.ASCII.GetBytes(str); 

     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = postBytes.Length; 
     Stream requestStream = request.GetRequestStream(); 


     requestStream.Write(postBytes, 0, postBytes.Length); 
     requestStream.Close(); 


     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     StringBuilder sb = new StringBuilder(); 

     string webresponse = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
     int AuthIndex = webresponse.IndexOf("Auth="); 

     sb.Append(webresponse); 
     sb.Append("\n"); 
     sb.Append(response.StatusCode); 

     richTextBox1.Text = sb.ToString(); 
     string authCode = webresponse.Substring(AuthIndex + 5, webresponse.Length - (AuthIndex + 5)); 

EDITED: これは私がmiffTheFoxは答えた内容に応じなかった場合の応答として取得されるものです私が直接ダウンロードする必要があるExcelファイルをダウンロードします。

+0

あなた自身の質問の記事:http://stackoverflow.com/questions/943270/getting-google-spreadsheets-as-excel-using-c 新しい質問をするのではなく、質問を編集することをお勧めします。 –

+0

これはあなたの問題を解決する関連する質問です:http://stackoverflow.com/questions/725627/accessing-google-spreadsheets-with-c-using-google-data-api –

+0

私はそれをより明確にするGoogle Data API Plsはもう一方の質問を破棄します。 –

答えて

2

Google認可プロセスが同じであると仮定していますが、私は実際にこれまでのようなことをしたプロジェクトを行っていました。

まず、レスポンスの各キーと値のペアについて、ログインして取得したものをクッキーにする必要があります。

string loginResponseText = new StreamReader(loginResponse.GetResponseStream()).ReadToEnd(); 
CookieContainer cookies = new CookieContainer(); 
foreach (string ln in loginResponseText.Split('\n')) 
{ 
    if (!ln.Contains("=")) continue; 
    string tId = ln.Substring(0, ln.IndexOf('=')).Trim(); 
    string tVal = ln.Substring(ln.IndexOf('=') + 1).Trim(); 
    cookies.Add(new Cookie(tId, tVal, "/", "www.google.com")); 
} 

次に、作成するリクエストに対してCookieコンテナを設定する必要があります。

string url = string.Format("http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key={0}&fmcmd=4", documentID); 
HttpWebRequest rqForFile = (HttpWebRequest)WebRequest.Create(url); 
rqForFile.CookieContainer = cookies; 
WebResponse respForFile = rUnread.GetResponse(); 

お楽しみください!

EDIT:返されるHTMLのデコード方法

正規表現を使用してURLを解析し、HTMLデコードにメソッドを使用する必要があります。 幸いにも私たちのために、MicrosoftはSystem.Webに1つを提供しています。プロジェクトへの参照を追加するだけです。

ファイルの先頭にSystem.Text.RegularExpressionsを使用して追加してください。

Match m = Regex.Match("content=\"0; url=&#39;(.+)&#39;"); 
if (!m.Success) throw new Exception(); // Or some other method of making sure the result is okay. 
string finalurl = m.Groups[1].ToString(); 
finalurl = System.Web.HttpUtility.HtmlDecode(finalurl); 

次に、CookieContianerを使用してfinalurlをフェッチしてください。 (これはテストされていませんが、うまくいくはずです)

+0

ありがとうございます。出来た! しかし私には小さな問題があります。 xlsファイルを直接入手することはできません。 WebResponseをHTMLファイルに書き込んだ後、ファイルを開いてxlsを取得する必要があります。任意のアイデアを直接XMLを取得する方法。 –

+0

@MiffTheFox:Pls編集済みの質問 –

+0

@Clair Vengsそこを参照して、私の応答を更新しました! – MiffTheFox

関連する問題