SuperWebClient -一個基於CURL的.NET HTTP/HTTPS模擬神組件(2)

今天咱們討論SuperWebClient組件使用中的幾個簡單主題javascript

1: UserAgent
2: Cookies
3: POST登陸


1:UserAgent
這個是客戶端標識信息,此信息是用於鑑別正在訪問WEB服務的客戶端的類型,下面咱們經過抓包工具Fiddler,來獲取幾個典型瀏覽器
的此項信息是怎麼樣的. Fiddler是一個.NET的開源HTTP/HTTPS協議分析軟件,後來被收購後就沒開源了好像。
Fiddler 下載地址 http://www.telerik.com/fiddler,運行後以下所示php

首先咱們打開IE瀏覽器-輸入博客園網站,就會看到Fiddler抓到不少數據包,咱們選取首頁的那條就能夠查看具體的http 請求信息java

咱們能夠知曉IE瀏覽器的userAgent信息以下
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
(機器上IE版本和安裝的軟件不同,USER-AGENT也會有些許差別)
咱們在看基於谷歌CHROME瀏覽器的相似下面
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.48 Safari/537.36
還有衆多獵豹,火狐,遨遊和其它都有本身的一些附加信息在User-Agent中,那這個東西可能會有哪些用途了。
通常而言,WEB服務器並不看重這個信息,但有些也會檢查,並根據不一樣的客戶端給出適當的輸出反饋,另外就是客戶端JS腳本會根據
這個信息作些兼容性的檢查和調整。
        對於爬蟲好比百度,谷歌或其它都有本身獨特的userAgent信息,SuperWebClient默認模擬的是IE瀏覽器的,固然,你徹底能夠設置
模擬任何信息,好比下面這樣 SuperWebClient 應用代碼示例以下
注意代碼紅色區域的部分,原本是做爲後面的主題來討論的,如今是爲了演示如何用FIDDLER抓取到SuperWebClient的請求包纔會提早標註下
默認是模擬的IE瀏覽器的,下面我修改這個User-Agent信息爲 「i-love-you」json

  1. // 首先構建一個 嗨 對象-也就是模擬訪問的輸入對象
  2.             HttpInput hi = new HttpInput();
  3.             // 須要初始化這個hi,設置是否啓用HTTP 1.1,後面是鏈接和傳輸超時設定(秒)
  4.             HttpManager.Instance.InitWebClient(hi, true, 60, 60);
複製代碼

                           // 代理設置-否則FIDDLER是沒法抓取到的
                            hi.EnableProxy = true;
                            hi.ProxyIP = "127.0.0.1";
                            hi.ProxyPort = 8888;

                           hi.UserAgent = "i-love-you";            
                         // 接下來就是設置訪問的URL,和其它譬如UserAgent,Cookies,Proxy....等等各類特性的設置
                         // 通常,咱們就設置Url 訪問路徑,其它都是在有須要的時候設置就能夠了瀏覽器

    1.             hi.Url = "http://www.cnblogs.com/";
    2.             // 有輸入對象,就有對應的輸出對象-注意,這個方法是阻塞的,只到結果反饋回來
    3.             // 因此,你能夠把代碼放入獨立的線程或是線程池中進行數據的採集
    4.             HttpOutput ho = HttpManager.Instance.ProcessRequest(hi);
    5.             if (ho.IsOK)
    6.             {
    7.                 // 若是HO的標誌IsOK成立,則頁面訪問是成功的,不然就是頁面訪問失敗
    8.                 // 遇到失敗-你能夠本身作後續處理,好比重發起請求或是寫LOG
    9.                 richTextBox1.Text = ho.TxtData;
    10.             }
    11.             else
    12.             {
    13.                 richTextBox1.Text = "頁面訪問錯誤";
    14.             }
    15.             // 最後銷燬對象
    16.             hi.Dispose();

你能夠根據須要假裝成任何須要的,好比微信,陌陌啥的特有的信息。
2:Cookie
SuperWebClient 默認處理WEB服務器發送來的COOKIE,無需你本身大費腦筋,那從服務器發來的COOKIE信息怎麼讀取呢服務器

HttpOutput ho = HttpManager.Instance.ProcessRequest(hi);
            if (ho.IsOK)
            {
                richTextBox2.Text = ho.Cookies;

                // 若是HO的標誌IsOK成立,則頁面訪問是成功的,不然就是頁面訪問失敗
                // 遇到失敗-你能夠本身作後續處理,好比重發起請求或是寫LOG
                richTextBox1.Text = ho.TxtData;
            }

 在輸出對象的ho.Cookies屬性裏面哦。

好比訪問C#蟻工窩 http://www.csharpworker.com/微信

拿到的cookies是
hTQ9_2132_pc_size_c=0;hTQ9_2132_onlineusernum=2;hTQ9_2132_lastact=1488261049%09forum.php%09;hTQ9_2132_sid=mRojS6;hTQ9_2132_lastvisit=1488257449;hTQ9_2132_saltkey=p7EgLlZg;
WEB服務器會在不一樣的請求屢次發送不一樣的cookies, SuperWebClient的輸出對象httpoutput只是當次請求時的服務器發送COOKIES信息,不會累計,雖然SuperWebClient內部會累計全部從服務器發送的COOKIE並在向服務器提交時一併回傳回去,可是目前並無提供讀取全部累計COOKIE的方法,你能夠本身收集每次請求的反饋對象httpoutput中的COOKIES信息,通常而言,我不怎麼理會這個東西,除非你是要保存COOKIES另作它用。


3:POST登陸
        通常狀況下,如無心外,WEB服務的不少操做請求都是基於POST協議的,AJAX也是,極少是基於GET協議的,由於請求字符串是有長度限制的
大量的參數須要經過POST來發送,接下來,咱們看看SuperWebClient如何經過POST方式來登陸一個網站,在展現以前,咱們有必要分析網站登陸
的請求協議,而後使用SuperWebClient進行模擬。
咱們就以登陸博客園的過程來講明下,首先咱們用Fiddler進行抓取博客園的登陸協議,注意,若是你抓取不到博客園的登陸協議,請看以下2個FIDDLER中針對的兩個最多見的問題,由於博客園登陸是採用的HTTPS,因此須要開啓FIDDLER中相應的HTTPS解碼選項。
點擊FIDDLER菜單的 TOOL->TERERIK  FIDDLER OPTIONScookie

若是你遇到能夠抓取,可是發現沒法解碼的狀況,那就是你的證書問題,證書問題-能夠參閱http://blog.csdn.net/chjqxxxx/article/details/53666175 這裏-從新構建證書-問題就會解決

這裏是博客園的登陸協議
app

POST https://passport.cnblogs.com/user/signin HTTP/1.1
x-requested-with: XMLHttpRequest
Accept-Language: zh-cn
Referer: https://passport.cnblogs.com/user/signin?ReturnUrl=http%3A%2F%2Fwww.cnblogs.com%2F
Accept: application/json, text/javascript, */*; q=0.01
verificationtoken: _Q9B84azUZnUTIffmygxm8pONeAnXanp7gw7sqep3b3Lqk-opvj5wPgeAN6SM6lN1qFi6y8-36GAyjMDYYBuf_cy6iE1:fmSuVFj_iIGBnMV7N3TydHUuc8ORlIkNw7eSCsGqwV2BX7lM64bNoMV0X3S-t2-rlDcBpfuYnK3_In_fMNTFaPhE3Cw1
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
Host: passport.cnblogs.com
Content-Length: 386
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: Hm_lvt_cc17b07fc9529e3d80b4482c9ce09086=1482645471; _ga=GA1.2.806287383.1482645352; __gads=ID=cde93307386572b7:T=1488262791:S=ALNI_MbB1oiDaPhuYt-REwWv3uYFQG8-AA; AspxAutoDetectCookieSupport=1; SERVERID=227b087667da6f8e99a1165002db93f6|1488285061|1488285061

{"input1":"a9Q+6M4EwC0HlHafyL8GYvd5zcFP+tUMV+F2P+aF0FdzrtY9nqPdkjCDctPQlY37EI/VzpLc9z+SAKXaWpWa0yDUM3USN+b7W+m6t7p8qRS+nuHu1G6wJ34IyuAruQ5gE3+r30PKy65q9dD0F5ruOSZizIYgCvm2/WrQfQsdYiQ=","input2":"fGOIEUEG5HP6tt3c/q9z0DuLyc9qeq0GiJQyTGNhTL/sCriRomR2G8gtn+AurDFzH/dDzMOYrBfEJ97n454gg8Ppd5cRe3qaNBTPebCJrIK3chv/Mupe+liFvEu6MwOgPqFBRm6GQCSZBHaVfRpHBKYrQkEaWRZ6ItSjKCBKpQc=","remember":false}

帳號和密碼都是通過加密處理的,至於加密過程,你須要仔細分析博客園的JS代碼,這裏咱們僅僅是用來講明如何使用SuperWebClient進行
POST表單登陸,因此對於帳號,密碼的加密分析略過,若是後面特別有空閒,我會補充一篇文章分析博客園的帳號,密碼加密,主要是對相關
JS代碼的調試和分析。

那麼使用 SuperWebClient如何進行博客園登陸了。很簡單。ide

HttpInput hi = new HttpInput();
          
            HttpManager.Instance.InitWebClient(hi, true, 60, 60);
            // 這裏設置博客園登陸URL
            hi.Url = "https://passport.cnblogs.com/user/signin";
            hi.Refer = "https://passport.cnblogs.com/user/signin?ReturnUrl=http%3A%2F%2Fwww.cnblogs.com%2F"; 
            // 咱們僞造下來路,證實咱們是從哪裏來的,根據協議
            // POST數據

            hi.PostData = "input1=a9Q+6M4EwC0HlHafyL8GYvd5zcFP+tUMV+F2P+aF0FdzrtY9nqPdkjCDctPQlY37EI/Vzp"
            +"Lc9z+SAKXaWpWa0yDUM3USN+b7W+m6t7p8qRS+nuHu1G6wJ34IyuAruQ5gE3+r30PKy65q9dD0F5ruOSZizIYgCvm2/WrQfQsdYiQ="
            +"&input2=fGOIEUEG5HP6tt3c/q9z0DuLyc9qeq0GiJQyTGNhTL/sCriRomR2G8gtn+AurDFzH/dDzMOYrBfEJ97n454gg8Ppd5cRe3qa"
            +"NBTPebCJrIK3chv/Mupe+liFvEu6MwOgPqFBRm6GQCSZBHaVfRpHBKYrQkEaWRZ6ItSjKCBKpQc="
            +"&remember=false";

            HttpOutput ho = HttpManager.Instance.ProcessRequest(hi);
            if (ho.IsOK)
            {
              
                richTextBox1.Text = ho.TxtData;
            }
            else
            {
                richTextBox1.Text = "頁面訪問錯誤";
            }

            // 最後銷燬對象
            hi.Dispose();

 hi.PostData="設置POST表單數據"       格式是:   key1=value1&key2=value2.....依次若干今天的主題分享完了,有了今天的一些東西,你已經能處理大部分的模擬請求,SuperWebClient的大部分功能也是圍繞目前的GET,POST服務。

相關文章
相關標籤/搜索