在本文中,将探讨如何使用C#语言通过HTTPGET和POST方法来执行Facebook的一些基本任务,如登录、搜索、更新状态和上传图片。将使用Facebook移动版网站来获取响应,并通过正则表达式解析HTML以获取所需数据。
在之前的文章《C#中的多线程Web抓取》中,介绍了使用正则表达式、WebClient和HTTPWebRequest以及Response进行Web抓取的技术。基于那篇文章中介绍的技术,编写了本文附带的代码。本文的目的是解释如何使用HTTPWebRequest和HTTPWebReponse,如何向Web服务器发送GET和POST数据,如何收集Cookies以及如何维护会话。
以下是一些类方法的描述:
以下是如何使用上述方法的示例:
执行登录
Facebook fb = Facebook.Login("USERNAME", "PASSWORD");
更新状态
fb.StatusUpdate("Text Status");
上传图片
fb.UploadPhoto(@"C:\Users\..\...\...\IMAGE.jpg", "Its the Caption");
搜索群组
Dictionary<string, string> groups;
int startCount = 1;
do {
groups = fb.SearchGroups("diet coke", startCount);
startCount += groups.Count;
string txt = "";
foreach (string k in groups.Keys)
txt += k + "\t\t" + groups[k] + Environment.NewLine;
MessageBox.Show(txt);
} while (groups.Count > 0);
同样的方法也可以用来搜索页面。
在用C#进行登录之前,先在Mozilla中进行登录,并通过LiveHTTPHeaders分析HTTP头。可以从Firefox网站安装LiveHTTPHeader插件。启动LiveHTTPHeaders,浏览到http://www.facebook.com,输入用户名和密码,点击登录按钮。浏览器发送的HTTP Web请求看起来像这样:
第一行是URL,用户名和密码将被发送到该URL(稍后在示例3中,将看到如何找到这个URL)。第二行告诉使用的HTTP方法和版本,分别是POST和1.1。
然后所有的字段就像在示例1中看到的正常的HTTP头一样。重要的东西从Cookie头开始,在示例1中,一旦浏览到http://www.facebook.com,就没有Cookie头,而在响应头中收到了一些Cookies,现在当点击登录按钮时,之前收到的一组Cookies正在这个Cookie头中被发送。
下一个头显示内容类型,用于POST数据的两种主要内容类型是application/x-www-form-urlencoded和multipart/form-data。可以在这里找到更多信息。
下一个头显示内容长度,最后一行显示内容。将在这一行看到电子邮件地址和密码。实际上,最后一行显示的是HTTP Post方法发送到服务器的数据。
还有其他一些值,稍后在示例中,将看到这些值是什么,以及如何获得这些值!!!
让检查上述请求的响应头。
响应头显示了很多Cookies,这些是服务器在成功登录后颁发的Cookies,现在对于任何后续请求,浏览器将把这些Cookies发送到服务器,通过这种方式会话将被维护。
转到工具->清除最近的历史记录并删除Cookies,然后尝试浏览到Facebook个人资料页面,将看到会重定向到Facebook登录页面。
现在让创建与上述屏幕截图相同的登录请求头,并测试否能够成功登录。
string getUrl = "https://www.facebook.com/login.php?login_attempt=1";
string postData = "lsd=AVo_jqIy&email=YourEmailAddress&pass=YourPassword&default_persistent=0&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%6C%B0%B4%2C%D0%94%2C%D0%84&timezone=-300&lgnrnd=072342_0iYK&lgnjs=1348842228&locale=en_US";
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Firefox 15.0.0.1";
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(cookies);
getRequest.Method = WebRequestMethods.Http.Post;
getRequest.ProtocolVersion = HttpVersion.Version11;
getRequest.AllowAutoRedirect = false;
getRequest.ContentType = "application/x-www-form-urlencoded";
getRequest.Referer = "https://www.facebook.com";
getRequest.KeepAlive = true;
getUrl被分配到数据将被发布的地址,postData变量是上述HTTP请求数据包的内容副本。然后创建了一个HTTPWebRequest对象,并设置了它的User-Agent头。
在请求http://www.facebook.com时收到的Cookies被添加到HTTPWebRequest对象中,如果不添加这些Cookies,那么服务器将不会处理登录请求,而是将重定向到登录页面。接下来将HTTP方法设置为Post,版本设置为1.1(用于HTTPS)。
将AllowAutoRedirect属性设置为false对于尝试登录的请求非常重要,如果这个属性被设置为true,那么HTTPWebRequest对象将遵循重定向响应。在重定向过程中,可能会丢失服务器在登录请求响应中发送的Cookies。
现在让将登录信息发送到服务器。
// Converting postData to Array of Bytes
byte[] byteArray = Encoding.ASCII.GetBytes(postData);
// Setting Content-Length Header of the Request
getRequest.ContentLength = byteArray.Length;
// Obtaining the Stream To Write Data
Stream newStream = getRequest.GetRequestStream();
// Writing Data To Stream
newStream.Write(byteArray, 0, byteArray.Length);
newStream.Close();
数据被写入流中,现在让获取响应并看看收到了哪些Cookies:
成功登录系统并收到了9个Cookies,上面的截图显示了关于收到的Cookies的很少信息,可以通过访问Cookies的属性来获取更多信息。将收到的Cookies添加到全局定义的CookieCollection中,以便在后续请求中使用。
通常Cookies数量是一个简单的方法来确定登录是否成功,为了更确定,可以尝试获取首页的HTML,如果没有被重定向到登录页面,那就意味着成功登录了。
通过这种方式,可以检查每个任务的post数据,并编写正则表达式来在页面的HTML中找到这些数据,然后生成后续的post数据请求。上面的大多数函数都使用这种机制。
尽管这些是非常基本的函数,但通过理解这些,代码可以被增强以执行更高级的功能,如加入群组、点赞页面、获取时间线故事、向群组和页面发布图片、对帖子发表评论、发送好友请求等。