使用 Indy 随机命名时发布网络表单数据
Posting webform data when the names are random with indy
我正在尝试创建 https://umod.org/login 的登录名,但我很难理解其具体工作原理。为什么要创建登录名?他们的站点 API 对访客的速率限制为 40,对会员的速率限制为 100。我基本上想在使用 api.
时保持登录会话
我的理解是我需要以某种方式登录并获取 cookie。
我一直在看一些帖子,我感到很沮丧,因为我根本无法让它工作。我发现了这样的问题:Log in to website from Delphi and 有点理解。
那我做了什么?我已经使用 inspect element 来获取登录页面上输入字段的字段名称。电子邮件字段有一个名为 email 的 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()
HTML 之后,您需要解析 HTML 以找到适当的 <form>
元素并提取其所有 <input>
个您需要提交回服务器的元素。
该解析将为您提供您需要放入 TStringList
.
中的实际名称(尤其是随机生成的名称)和非用户提供的值
必须提交任何具有非空 value
属性(如果不是用户提供)的 <input>
元素(尤其是 "hidden" 元素)。
这正是网络浏览器会执行的操作,也是服务器希望您执行的操作。 Indy 不会帮你解析,你需要自己处理。如果您环顾四周,有很多 HTML 可用的解析器。
我正在尝试创建 https://umod.org/login 的登录名,但我很难理解其具体工作原理。为什么要创建登录名?他们的站点 API 对访客的速率限制为 40,对会员的速率限制为 100。我基本上想在使用 api.
时保持登录会话我的理解是我需要以某种方式登录并获取 cookie。
我一直在看一些帖子,我感到很沮丧,因为我根本无法让它工作。我发现了这样的问题:Log in to website from Delphi and
那我做了什么?我已经使用 inspect element 来获取登录页面上输入字段的字段名称。电子邮件字段有一个名为 email 的 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()
HTML 之后,您需要解析 HTML 以找到适当的 <form>
元素并提取其所有 <input>
个您需要提交回服务器的元素。
该解析将为您提供您需要放入 TStringList
.
必须提交任何具有非空 value
属性(如果不是用户提供)的 <input>
元素(尤其是 "hidden" 元素)。
这正是网络浏览器会执行的操作,也是服务器希望您执行的操作。 Indy 不会帮你解析,你需要自己处理。如果您环顾四周,有很多 HTML 可用的解析器。