Как скачать Google SpreadSheets с помощью C #? - PullRequest
4 голосов
/ 03 июня 2009

Я могу войти в Google с моим приложением, используя следующий код, который я нашел в Интернете. Он возвращает код авторизации в качестве ответа. Справка Google говорит, что этот код авторизации должен использоваться для отправки будущих запросов POST / GET.

Мне нужно скачать электронную таблицу в формате Excel с http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=DOCUMENT_ID&fmcmd=4, что я обычно могу сделать из браузера, когда захожу в Google.

Как я могу отправить запрос на вышеуказанный файл с кодом авторизации в C #? Я видел поток в SO, который использовал Google Data API. Я не хочу этим пользоваться.

Ниже приведен пример кода для входа в систему. Работает нормально.

        string str = "/accounts/ClientLogin HTTP/1.0 Content-type: application/x-www-form-urlencoded accountType=GOOGLE&Email=myname@gmail.com&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));

Редакция: Это то, что я получаю в ответ, когда поступаю в соответствии с ответом miffTheFox:

<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>

Если я сохраню поток в формате HTML и открою его в браузере, появится запрос на загрузку файла Excel, который мне нужно загрузить напрямую.

1 Ответ

2 голосов
/ 03 июня 2009

Я на самом деле делал проект, который делал нечто подобное раньше, только он использовал Google Reader, хотя я предполагаю, что процесс авторизации Google такой же.

Прежде всего, для каждой пары ключ / значение в ответе, который вы получаете при входе в систему, вы должны превратить его в файл cookie.

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();

Наслаждайтесь!

РЕДАКТИРОВАТЬ : как декодировать возвращенный HTML!

Вам необходимо использовать Regex для анализа URL, а затем использовать метод для его HTML-декодирования. К счастью для нас, Microsoft предоставляет один в System.Web. Просто добавьте ссылку на него в ваш проект.

Обязательно добавьте с помощью 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);

Тогда просто загрузите finalurl, используя ваш CookieContianer! (Это не проверено, но должно работать!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...