2011-04-20 54 views
3

我試圖登錄到網站,但這個網站總是德爾福HTTP POST方法 - 曲奇問題

迴應「你似乎並不接受Cookies Cookies是需要的,以登錄。」

爲什麼我的程序不允許cookies?

function HF_Login(): boolean; 
var 
HTTP : TIDHTTP; 
Cookie : TidCookieManager; 
Data, Page : TStringList; 
begin 
HTTP := TIDHTTP.Create(NIL); 
Cookie := TidCookieManager.Create(NIL); 

HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1'; 
HTTP.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; 
HTTP.Request.AcceptLanguage := 'en-us;q=0.7,en;q=0.3'; 
HTTP.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7'; 
HTTP.Request.Pragma := 'no-cache'; 
HTTP.Request.CacheControl := 'no-cache'; 
HTTP.Request.RawHeaders.Add('X-Requested-With: XMLHttpRequest'); 
HTTP.AllowCookies := True; 
HTTP.HandleRedirects := True; 
HTTP.ProtocolVersion := pv1_1; 
HTTP.Request.Connection := 'Keep-Alive'; 
HTTP.CookieManager := Cookie; 

Data := TStringList.Create; 
Page := TStringList.Create; 

     // returnto=%2F&user=[user]&pass=[pass] 
Data.Add('returnto=%2F&user=csz0021&pass=Yese0071'); 

page.Text := HTTP.Post('http://hotfile.com/login.php', Data); 
//form1.RichEdit1.Text := HTTP.Post('http://hotfile.com/login.php', Data); 

If Pos('Bad username/password combination.', Page.Text) <> 0 Then Result := False 
else Result := True; 

Page.Free; 
Data.Free; 
end; 

這是一個免費的帳戶來測試網站。

csz0021

Yese0071


感謝

+0

這個C#代碼工作完美也許這可以幫助你在delphi代碼中找到我的問題http://stackoverflow.com/questions/2151576/c-http-post-method-cookies-issue – MeRo 2011-04-20 14:19:09

回答

4

爲你這樣做是它不會一步到位的工作,需要做的是在兩個步驟。首先請求登錄頁面(GET),然後發送您的登錄憑證(POST)。確保你使用相同的CookieManager進行這兩項操作。


編輯以幫助匿名downvoter明白爲什麼這個答案是明顯的。 OP得到以下錯誤信息:

「您似乎無法接受Cookie,需要使用Cookie才能登錄。」

因此服務器期望從客戶端看到一些cookie。由於OP僅執行一個POST請求,因此CookieManager不包含cookie,因此不會發送任何cookie。服務器希望看到一些cookie的人數越少。這些cookies來自正常的基於瀏覽器的會話在哪裏?那麼,填寫登錄表單非常非常困難,而沒有實際先導航到表單(GET請求)。

+0

@downvoter,解釋。 – 2011-04-20 05:50:05

+0

+1。 :-) – 2011-04-20 08:16:30

+0

感謝您的評論,我已添加此行HTTP.Get('http://wwww.hotfile.com');但沒有發生同樣的問題apears – MeRo 2011-04-20 14:12:51

1

我建議你安裝一個HTTP請求監視工具,將你的請求與標準瀏覽器的請求進行比較。

HTTP分析器是一個很好的開始。

+0

+1我建議wireshark – ComputerSaysNo 2011-04-20 11:58:21

+0

@多林,你忘了實際上upvote!無論如何,在我看來,使用像wireshark這樣的大工具(以及任何其他HTTP分析器)這樣一個簡單的問題,只是簡單地掩蓋了無關信息牆背後的問題。有沒有看過瀏覽器用任何請求發送的HTTP頭的數量?搞清楚什麼是相關的,什麼不是更難,然後搞清楚什麼「你似乎不接受餅乾。」的意思。 – 2011-04-20 12:34:56

+0

感謝您的評論我已經嘗試過,HTTP分析器我沒有看到任何差異我的請求是好的 – MeRo 2011-04-20 14:16:08

1

請確保您使用的是Indy 10的最新版本。Indy 10的Cookie支持很長一段時間被打破,但幾個月前終於修復。即使您可能啓用了Cookies,Indy可能會拒絕接收的Cookie,或者不會將Cookie發送回服務器。

附註:使用Request.CustomHeaders屬性而不是Request.RawHeaders屬性,並且不要對傳遞給Post()的TStringList數據進行URL編碼。發佈會在內部爲您編碼數據(如果hoForceEncodeParams標誌在TIdHTTP.HTTPOptions屬性中啓用,則默認爲此屬性)。