2010-01-14 128 views
3

我想做一個程序,登錄到一個網站,並執行一些自動化的活動。我一直在使用HttpClient 4.0.1,並使用它開始:http://hc.apache.org/httpcomponents-client/primer.html用HttpClient登錄站點Post

在這個特定的網站上,cookie不是通過「set-cookie」頭設置的,而是通過javascript設置的。

到目前爲止,我無法實現登錄。

我嘗試了以下事情:

  1. 手動添加標頭中出現的螢火
 
    NameValuePair[] data = { 
     new BasicNameValuePair("Host",host), 
     new BasicNameValuePair("User-Agent"," Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"), 
     new BasicNameValuePair("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), 
     new BasicNameValuePair("Accept-Language","en-us,en;q=0.5"), 
     new BasicNameValuePair("Accept-Encoding","gzip,deflate"), 
     new BasicNameValuePair("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7"), 
     new BasicNameValuePair("Keep-Alive","300"), 
     new BasicNameValuePair("Connection","keep-alive"), 
     new BasicNameValuePair("Referer",referer), 
     new BasicNameValuePair("Cookie",cookiestr) 
    }; 

    for(NameValuePair pair : data){ 
     loginPost.addHeader(pair.getName(),pair.getValue()); 
    } 

  • 創建BasicClientCookies和所有請求頭使用setCookieStore進行設置。不幸的是,我不知道如何測試cookie是否實際發送。還有,有什麼方法可以測試發送其他自動參數嗎? (如正在模擬的瀏覽器等)。
  • 我得到的迴應是:HTTP/1.1 417預期失敗

    我還是新來這一點,所以沒有人知道離手的問題可能是什麼?如果沒有,我會發布更多的細節,代碼和網站。

    回答

    1

    您需要WireSharkFiddler。第一個是網絡分析儀(所以你會看到發生了什麼事情在一個非常低的水平);第二個作爲代理 - 不太透明,但更高層次。

    通過這種方式,您可以詳細瞭解使用瀏覽器登錄時會發生什麼情況,以及當您在代碼中執行相同的操作時發生了什麼。

    +0

    我會盡力,謝謝! – humoeba 2010-01-14 16:18:24

    0

    您可以使用FireBug的「網絡」功能來查看當您使用瀏覽器登錄時發生了什麼,這樣您應該能夠找出哪個方法生成cookie值,以及如何設置它(哪條路徑,名)使用此設置上HttpClient的cookie的喜歡自己。

    method.setRequestHeader("Cookie", "special-cookie=value"); 
    
    +0

    我已經這樣做了,但並非所有的cookies都是這樣設置的。另外,我認爲setRequestHeader適用於舊版本的httpclient。 – humoeba 2010-01-14 16:21:10

    1

    我附和評論以上 - 使用Wireshark來獲取正從您的客戶端發送什麼明確的說法我剛使用Wireshark自己調試類似的問題。必要的。

    如果你還沒有這樣做,我會建議研究http://hc.apache.org/httpcomponents-client/examples.html中的例子特別是「基於表單的登錄」。

    我會避免使用BasicNameValuePair設置Http標頭,HttpClient應該爲您提供基礎知識。使用HttpParams和HttpConnectionParams/HttpProtocolParams進一步修改。示例conn/ManagerConnectDirect顯示瞭如何修改標題。