我正在尝试创建https://umod.org/login的登录名,但是我很难理解它的工作原理。为什么要创建登录名?他们的站点API的访客速率限制为40,会员的速率限制为100。我基本上想在使用api时保持登录会话。
我的理解是,我需要以某种方式登录并获取cookie。
我一直在查看一些帖子,但由于无法正常工作而感到沮丧。我发现了类似这样的问题:Log in to website from Delphi和Delphi - logging in to webpage from code,这使人们有些了解。
那我做了什么?我使用了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
答案 0 :(得分:2)
在Get()
用于Webform页面的HTML之后,您需要解析HTML以找到适当的<form>
元素,并提取所有需要提交的<input>
元素回到服务器。
该解析将为您提供实际的名称(尤其是随机生成的名称)和您需要放入TStringList
中的非用户提供的值。
任何具有非空<input>
属性(如果用户未提供)的value
元素(尤其是“隐藏”元素)都必须提交。
这正是Web浏览器将要执行的操作,也是服务器希望您执行的操作。 Indy不会帮助您进行解析,您需要自己处理。如果您四处看看,有很多HTML解析器可用。