[英]Posting webform data when the names are random with indy
我正在嘗試創建https://umod.org/login的登錄名,但是我很難理解它的工作原理。 為什么要創建登錄名? 他們的站點API的訪客速率限制為40,會員的速率限制為100。 我基本上想在使用api時保持登錄會話。
我的理解是,我需要以某種方式登錄並獲取Cookie。
我一直在看一些帖子,但因為無法正常工作而感到沮喪。 我發現了這樣的問題: 從Delphi和Delphi 登錄到網站 -從使您有所了解的代碼登錄到網頁 。
那我做了什么? 我使用了inspect元素來獲取登錄頁面上輸入字段的字段名稱。 電子郵件字段具有一個名為電子郵件的ID,但是當我點擊刷新時,這兩個字段的名稱都會更改。
我編寫了以下代碼,但沒有成功:
procedure Login(const aUsername, aPassword: string);
var
http: TIdHTTP;
ssl: TIdSSLIOHandlerSocketOpenSSL;
params: TStringList;
begin
http := TIdHTTP.Create(nil);
try
ssl := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
ssl.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
http.IOHandler := ssl;
http.HandleRedirects := True;
http.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0';
http.AllowCookies := True;
http.Get('https://umod.org/login');
params := TStringList.Create;
try
params.Add('email=' + aUsername);
params.Add('password=' + aPassword);
params.Add('remember=1');
params.Add('redirect=https://umod.org/');
http.Post('https://umod.org/login', params);
finally
params.Free;
end;
finally
ssl.Free;
end;
finally
http.Free;
end;
end;
我收到以下錯誤: EIdHTTPProtocolException: HTTP/1.1 419 unknown status
在Get()
Web表單頁面的HTML之后,需要解析HTML以找到適當的<form>
元素,並提取所有需要提交回服務器的<input>
元素。
該解析將為您提供實際名稱(尤其是隨機生成的名稱)和您需要放入TStringList
非用戶提供的值。
必須提交具有非empy value
屬性(如果未由用戶提供)的任何<input>
元素(尤其是“隱藏”元素)。
這正是Web瀏覽器將要執行的操作,也是服務器希望您執行的操作。 Indy不會幫助您進行解析,您需要自己處理。 如果您四處看看,有很多HTML解析器可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.