聲明:本人只在業余空閒時間寫寫《開心網輔助程序》,目的只是學習!
由於之前有寫過類似的程序,也寫過相關的文章介紹過(C#網站登錄學習筆記(一):登錄簡單網站、C#網站登錄學習筆記(二):訪問需登錄後才能訪問的頁面),這次寫起“開心網輔助程序”也可以算是得心應手了,直接從電腦中翻出塵封已久的HttpHelper(前面提到的兩篇文章就是居於這個操作類進行的),稍微分析了一下網頁結構(爭車位),就寫起程序來了!
在開始寫手記前,讓我們看看寫這樣的“外掛”程序需要准備什麼軟件?
1. 抓包工具:Http Analyzer V3。既然要實現的是Http模擬請求,抓包工具肯定少不了了
2. 網頁分析工具:Firefox 3.0 + Firebug 1.2.1。沒錯,可愛的火狐狸又來幫忙了
在這篇手記中,將簡單的介紹一下如何登錄開心網、獲取爭車位相關數據。
一、稍微修改了一下HttpHelper類的代碼:
Code
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; namespace SNSHelper.Common { class HttpHelper { #region 私有變量 private CookieContainer cc; private string contentType = "application/x-www-form-urlencoded"; private string accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight-2-b1, */*"; private string userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"; private Encoding encoding = Encoding.GetEncoding("utf-8"); #endregion #region 屬性 /// <summary> /// Cookie容器 /// </summary> public CookieContainer CookieContainer { get { return cc; } } /// <summary> /// 獲取網頁源碼時使用的編碼 /// </summary> /// <value></value> public Encoding Encoding { get { return encoding; } set { encoding = value; } } #endregion #region 構造函數 /// <summary> /// Initializes a new instance of the <see cref="HttpHelper"/> class. /// </summary> public HttpHelper() { cc = new CookieContainer(); } /// <summary> /// Initializes a new instance of the <see cref="HttpHelper"/> class. /// </summary> /// <param name="cc">The cc.</param> public HttpHelper(CookieContainer cc) { this.cc = cc; } /// <summary> /// Initializes a new instance of the <see cref="HttpHelper"/> class. /// </summary> /// <param name="contentType">Type of the content.</param> /// <param name="accept">The accept.</param> /// <param name="userAgent">The user agent.</param> public HttpHelper(string contentType, string accept, string userAgent) { this.contentType = contentType; this.accept = accept; this.userAgent = userAgent; } /// <summary> /// Initializes a new instance of the <see cref="HttpHelper"/> class. /// </summary> /// <param name="cc">The cc.</param> /// <param name="contentType">Type of the content.</param> /// <param name="accept">The accept.</param> /// <param name="userAgent">The user agent.</param> public HttpHelper(CookieContainer cc, string contentType, string accept, string userAgent) { this.cc = cc; this.contentType = contentType; this.accept = accept; this.userAgent = userAgent; } #endregion #region 公共方法 /// <summary> /// 獲取指定頁面的HTML代碼 /// </summary> /// <param name="url">指定頁面的路徑</param> /// <param name="postData">回發的數據</param> /// <param name="isPost">是否以post方式發送請求</param> /// <param name="cookieCollection">Cookie集合</param> /// <returns></returns> public string GetHtml(string url, string postData, bool isPost, CookieContainer cookieContainer) { if (string.IsNullOrEmpty(postData)) { return GetHtml(url, cookieContainer); } byte[] byteRequest = Encoding.Default.GetBytes(postData); HttpWebRequest httpWebRequest; httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); httpWebRequest.CookieContainer = cookieContainer; httpWebRequest.ContentType = contentType; httpWebRequest.Referer = url; httpWebRequest.Accept = accept; httpWebRequest.UserAgent = userAgent; httpWebRequest.Method = isPost ? "POST" : "GET"; httpWebRequest.ContentLength = byteRequest.Length; Stream stream = httpWebRequest.GetRequestStream(); stream.Write(byteRequest, 0, byteRequest.Length); stream.Close(); HttpWebResponse httpWebResponse; httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); Stream responseStream = httpWebResponse.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream, encoding); string html = streamReader.ReadToEnd(); streamReader.Close(); responseStream.Close(); return html; } /// <summary> /// 獲取指定頁面的HTML代碼 /// </summary> /// <param name="url">指定頁面的路徑</param> /// <param name="cookieCollection">Cookie集合</param> /// <returns></returns> public string GetHtml(string url, CookieContainer cookieContainer) { HttpWebRequest httpWebRequest; httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); httpWebRequest.CookieContainer = cookieContainer; httpWebRequest.ContentType = contentType; httpWebRequest.Referer = url; httpWebRequest.Accept = accept; httpWebRequest.UserAgent = userAgent; httpWebRequest.Method = "GET"; HttpWebResponse httpWebResponse; httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); Stream responseStream = httpWebResponse.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream, encoding); string html = streamReader.ReadToEnd(); streamReader.Close(); responseStream.Close(); return html; } /// <summary> /// 獲取指定頁面的HTML代碼 /// </summary> /// <param name="url">指定頁面的路徑</param> /// <returns></returns> public string GetHtml(string url) { return GetHtml(url, cc); } /// <summary> /// 獲取指定頁面的HTML代碼 /// </summary> /// <param name="url">指定頁面的路徑</param> /// <param name="postData">回發的數據</param> /// <param name="isPost">是否以post方式發送請求</param> /// <returns></returns> public string GetHtml(string url, string postData, bool isPost) { return GetHtml(url, postData, isPost, cc); } #endregion } }