我試圖抓取一個在auth牆後按需生成的PDF文件。基於我的測試,流程如下:通過302重定向維護會話和cookie
我做了一個GET
請求與幾個參數(包括身份驗證憑據)到適當的頁面。該頁面驗證我的憑據,然後處理我的請求。當請求完成處理(幾乎是即時)時,我發送一個302
響應,將我重定向到生成的PDF的位置。此PDF只能通過該會話訪問。
使用瀏覽器,確實沒有什麼奇怪的事情發生。我試圖通過curl
和wget
來做同樣的事情,沒有任何可選參數,但都失敗了。雖然(按照重定向和存儲Cookie),但我可以通過添加-L -b /tmp/cookie.txt
作爲選項來獲得curl
。
According to the ruby-doc,使用Net::HTTP.start
應該讓我接近我想要的。在玩過之後,我確實相當接近。然而,我認爲唯一的問題是我的Set-Cookie
值在請求之間是不同的,即使它們在相同的start
塊中使用相同的http
對象。
我試圖保持它儘可能簡單,然後不斷擴大,一旦我得到了我想要的結果:
url = URI.parse("http://dev.example.com:8888/path/to/page.jsp?option1=test1&option2=test2&username=user1&password=password1")
Net::HTTP.start(url.host, url.port) do |http|
# Request the first URL
first_req = Net::HTTP::Get.new url
first_res = http.request first_req
# Grab the 302 redirect location (it will always be relative like "../servlet/sendfile/result/543675843657843965743895642865273847328.pdf")
redirect_loc = URI.parse(first_res['Location']
# Request the PDF
second_req = Net::HTTP::Get.new redirect_loc
second_res = http.request first_req
end
我也嘗試使用http.get,而不是每次都創建一個新的請求,但仍然沒有運氣。
'second_req = Net :: HTTP :: Get.new(uri.path,{'Cookie'=> first_req ['Set-Cookie']})'應該有幫助。 – mudasobwa
這使我找到了解決方案 - 如果您想將上述內容作爲答案發布,我會很樂意將其標記爲正確。 –