浏览帖子时,发现一段读取cookie的代码,感觉不错,对自己启发挺大,转过来学习一下
一直以来想要做个程序,将google doc用作网盘,程序做 的差不多了才发现不是所有的人都可以上传任意类型的文件,只有商业用户才可以。商业用户是要交钱的的,这与我们倡导的免费精神相关太远。怎么办,我的心血 不能白费,google还算厚道没有把门关死,可以通过form的形式上传,我们可以模拟form的动作,就能上传了。好了费话少话,说实在的。
Google在上传时要进行身份验证。取得身份验证后,提出上传要求,这时返回一个上传地址,然后上传文件。下面一步步来。
第一步,通过网页访问DOC,其身份认证是通过cookie进行的,取得cookie的过程是
1、先访问http://docs.google.com,它通过自动跳转将你带到一个登录页面。按登录页面中的头部的set- cookie设置httpwebrequest的cookie,cookie中最重要的是HSID,然后设置url为 https://www.google.com/accounts/ServiceLoginAuth?service=writely 。然后设置提交数据ltmpl=homepage&continue=http://docs.google.com/& followup=http://docs.google.com/&service=writely&nui=1& rm=false&dsh={0}<mpl=homepage<mpl=homepage&GALX={1}& amp;Email={2}&Passwd={3}&rmShown=1&signIn=登录&asts=
其中Email填google帐户名,passwd填密码,GALX可以从cookie中找到,dsh可从页面的数据中得到。
2、再访问网址:https://www.google.com/accounts /CheckCookie?continue=http%3A%2F%2Fdocs.google.com%2F&followup=http %3A%2F%2Fdocs.google.com%2F&service=writely<mpl=homepage& chtml=LoginDoneHtml,取得下一步的访问地址,
3、再访问网 址:http://docs.google.com/?auth=.......,根据回应设置cookie,这时的cookie就是可以访问相当于 doc api中的token了。cookie中包含三条记录HSI,SID,writelySID。
下面是原程序:
private CookieContainer GetAuthenticationCookie(string User,string Passwd)
{
string GALX;
string dsh;
string resText = "";
CookieContainer Auth = new CookieContainer();
//第一步
HttpWebRequest req = CreatRequest("http://docs.google.com/");
req.Method = "POST";
req.ContentLength = 0;
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
//第二步
resText = getResponseText(res);
GALX = resText.Substring(resText.IndexOf("GALX") + 26, 11);
if ((resText.Substring(resText.IndexOf("dsh") + 32, 1)) == "-")
dsh = resText.Substring(resText.IndexOf("dsh") + 32, 20);
else
dsh = resText.Substring(resText.IndexOf("dsh") + 32, 19);
string postData = string.Format(
"ltmpl=homepage&continue=http://docs.google.com/&followup=http: //docs.google.com/&service=writely&nui=1&rm=false&dsh= {0}<mpl=homepage<mpl=homepage&GALX={1}&Email={2}& amp; amp;Passwd={3}&rmShown=1&signIn=登录&asts="
, dsh, GALX, User, Passwd);
req = CreatRequest("https://www.google.com/accounts/ServiceLoginAuth?service=writely ");
req.AllowAutoRedirect = false;
req.Method = "POST";
//设置cookie及提交数据
Auth.Add(setCookie(res, "www.google.com"));
req.CookieContainer = Auth;
setPostData(req, postData);
res = (HttpWebResponse)req.GetResponse();
//第三步
req = CreatRequest(res.Headers["Location"]);
Auth.Add(setCookie(res, "www.google.com"));
req.CookieContainer = Auth;
res = (HttpWebResponse)req.GetResponse();
//第四步
resText = getResponseText(res);
string url = resText.Substring(resText.IndexOf("url=")).Split('\"')[0];
url = HttpUtility.HtmlDecode(url);
url = url.Substring(5, url.Length - 6);
req = CreatRequest(url);
req.Method = "GET";
req.AllowAutoRedirect = false;
Auth.Add(setCookie(res, "www.google.com"));
req.CookieContainer = Auth;
res = (HttpWebResponse)req.GetResponse();
Auth.Add(setCookie(res, "www.google.com"));
return Auth;
}
private string getResponseText(HttpWebResponse res)
{
if (res.StatusCode != HttpStatusCode.OK)
return null;
Stream dataStream = res.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string str = reader.ReadToEnd();
reader.Close();
return str;
}
/// <summary>
///设置传送的数据
/// </summary>
/// <param name="req">The req.</param>
/// <param name="postData">The post data.</param>
private void setPostData(HttpWebRequest req, string postData)
{
byte[] bytes = Encoding.UTF8.GetBytes(postData);
req.ContentLength = bytes.Length;
using (Stream dataStream = req.GetRequestStream())
{
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();
}
}
/// <summary>
/// 根据response中头部的set-cookie对request中的cookie进行设置
/// </summary>
/// <param name="setCookie">The set cookie.</param>
/// <param name="defaultDomain">The default domain.</param>
/// <returns></returns>
private CookieCollection setCookie(HttpWebResponse res, string defaultDomain)
{
string[] setCookie = res.Headers.GetValues("Set-Cookie");
// there is bug in it,the datetime in "set-cookie" will be sepreated in two pieces.
List<string> a = new List<string>(setCookie);
for (int i = setCookie.Length - 1; i > 0; i--)
{
if (a[i].Substring(a[i].Length - 3) == "GMT")
{
a[i - 1] = a[i - 1] + ", " + a[i];
a.RemoveAt(i);
i--;
}
}
setCookie = a.ToArray<string>();
CookieCollection cookies = new CookieCollection();
foreach (string str in setCookie)
{
NameValueCollection hs = new NameValueCollection();
foreach (string i in str.Split(';'))
{
int index = i.IndexOf("=");
if (index > 0)
hs.Add(i.Substring(0, index), i.Substring(index + 1));
else
switch (i)
{
case "HttpOnly":
hs.Add("HttpOnly", "True");
break;
case "Secure":
hs.Add("Secure", "True");
break;
}
}
Cookie ck = new Cookie();
foreach (string Key in hs.AllKeys)
{
switch (Key)
{
case "Path":
ck.Path = hs[Key];
break;
case "Expires":
ck.Expires = DateTime.Parse(hs[Key]);
break;
case "Domain":
ck.Domain = hs[Key];
break;
case "HttpOnly":
ck.HttpOnly = true;
break;
case "Secure":
ck.Secure = true;
break;
default:
ck.Name = Key;
ck.Value = hs[Key];
break;
}
}
if (ck.Domain == "") ck.Domain = defaultDomain;
if (ck.Name != "") cookies.Add(ck);
}
return cookies;
}
/// <summary>
/// 对request进行基本的设置
/// </summary>
/// <param name="URL">The URL.</param>
/// <returns></returns>
private HttpWebRequest CreatRequest(string URL)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2";
req.ServicePoint.Expect100Continue = false;
req.ContentType = "application/x-www-form-urlencoded";
return req;
}
整个过程很简单,但调试花了我很长时间,主要是在https下调试走了很多弯路,一 开始使用httpanalyzer,结果有bug显示的传送数据总是重复。后来还是使用fiddler才解决。但使用fiddler时在https下会出 现证书与网站 不符的错误。
解决办法是:
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
第 一个函数在设置httpwebquest时调用就不会出现错误了。这时就可以用fiddler捕获https包了。今天就写到这里。
这里有几点猜 想未证实,授权cookie中的writelySID及SID可能与google 的client的LSID和SID相同,但HSID不知从何而来。
cookie 可以反复使用,不用每次对话都要取得cookie。
代码写得很笨拙,大家不吝赐教。
转载:http://www.cnblogs.com/zcmky/archive/2010/04/02/1703397.html
分享到:
相关推荐
操作系统课程设计_模拟一个简单二级文件管理系统 在操作系统课程设计中,模拟一个简单二级文件管理系统是一个重要的知识点。本文将对该知识点进行详细的解释和分析。 文件管理系统是操作系统中一个核心组件,负责...
"Spire.Doc.Free.jar" 文件是一个与文档处理相关的Java库,主要用于在Java应用程序中创建、编辑和处理Microsoft Word文档。这个库提供了丰富的API,使得开发者能够方便地在Java环境中实现对DOC、DOCX格式文件的操作...
在IT行业中,文件类型的转换是一项常见的任务,尤其是在文档处理领域。本项目专注于“doc2docx 文件类型转换”,使用Java后台技术实现。Eclipse作为流行的Java集成开发环境,被选为开发工具,使得开发者能够方便地...
无所不在的Google API.doc很可能包含了一系列的使用示例、最佳实践和常见问题解答,是开发者学习和解决问题的重要参考资料。readme.txt通常会提供初步的介绍、安装指南或使用注意事项,也是开始探索这个资源包的好...
它不仅能够帮助研究者在不受物理条件限制的情况下进行成像实验,而且能够大幅提高成像模拟研究的效率和精确度。这一技术的应用前景广泛,从医学成像到工业设计,再到安全检测等多个领域都将受益于这一仿真技术的发展...
"j2ee_doc api文档"是Java EE的重要组成部分,它包含了详尽的API参考指南,是开发者在进行Java EE开发时不可或缺的参考资料。 这个文档集合主要涵盖以下几个核心知识点: 1. **Servlet**:Servlet是Java EE中的...
- 使用二进制文件模拟磁盘空间。 - 使用文件块操作模拟磁盘块操作。 - 数据结构设计: - FAT表:用于跟踪每个簇的状态。 - 目录表:记录文件的基本属性(文件名、大小、创建日期等)。 - 文件控制块:用于管理...
模拟电子技术:模拟电子5卷.doc
模拟成像图像文件的输出是该系统的重要功能之一。输出的图像文件可以是二维投影图像、三维重建图像或是其他用户指定的成像结果。这些图像文件能够直观展现射线与物体相互作用后的模拟结果,为后续分析和研究提供了...
在这个设计中,学生被要求模拟构建一个针对Linux系统的二级文件系统,以实现一系列基本的文件操作,包括用户登录、目录列举、文件创建、删除、打开、关闭、读取、写入以及进出目录等功能。设计中涉及的关键技术点...
这个`jaxws-api-doc.zip`文件包含了JAX-WS的API文档,对于理解、使用和调试基于JAX-WS的Web服务非常有帮助。 **文件详细解析:** 1. **stylesheet.css**:这是一个样式表文件,用于格式化HTML文档的显示,使文档更...
总结来说,理解.doc文件的内部结构是IT专业人员必备的技能之一。通过使用二进制流查看工具,我们可以揭示看似复杂无序的二进制数据背后的秩序,进一步增强对文档处理的掌控能力。对于那些对底层数据有兴趣或需求的...
在Hadoop生态系统中,API扮演着至关重要的角色,它们提供了与Hadoop分布式文件系统(HDFS)以及其他核心组件交互的接口。以下是对给定文件中提到的Hadoop API的详细说明: 1. **org.apache.hadoop.conf**: 这个包...
这次的课程设计主要通过编写一个模拟的单级目录FAT文件系统,来实现文件文件空间空间模拟磁盘空间,用文件块操作模拟磁盘块操作。它是通过对文件系统分配一个FAT表,FAT表的表项中存放下一个盘块号,它实际上是用于...
8. **JAF(JavaBeans Activation Framework)**:JAF提供了一种标准的方式来处理和激活MIME类型的对象,如电子邮件附件。 9. **JAFR(Java Authorization Contract for Containers)**:JAFR定义了容器(如应用...
8. 研究文档的结构组织,如不同文件类型的分工和内容概述。 研究成果的应用前景广阔,可被广泛应用于精密工程、材料科学、生物医学等领域,对相关行业技术进步有着显著的推动作用。同时,该研究也体现了在科学研究...
微软提供的“微软DOC二进制文件格式解析”文档详细介绍了每种结构的组成和含义,是学习和研究DOC格式的宝贵资源。通过阅读这份文档,你可以深入理解文件的内部工作原理,从而更好地处理与DOC文件相关的编程任务。...
微软DOC二进制文件格式解析主要关注的是微软Word在DOC97到DOC2007版本中的文件存储机制。这个时期的Word文档是以二进制格式存储的,而非后来的基于XML的Open XML标准。以下是对这个主题的详细阐述: 1. **文件结构*...
"jQuery 无刷新上传图片、文件(doc、excel)"是一种优化用户体验的技术,它允许用户在不重新加载整个网页的情况下提交文件,提高网页的响应速度和交互性。下面将详细介绍这个主题涉及的关键知识点。 1. jQuery库:...
根据提供的文档信息,本次实验的主要目的是让学生理解和模拟操作系统中的页面置换算法,特别是最近最久未使用算法(LRU)。下面将详细介绍实验的目的、内容、要求以及实现方式。 ### 实验目的 1. **理解虚拟存储...