delphi - 当名称与 indy 随机时发布网络表单数据
问题描述
我正在尝试创建https://umod.org/login的登录名,但我很难理解它是如何工作的。为什么我要创建登录?他们的站点 API 对访客的速率限制为 40,对会员的速率限制为 100。我基本上想在使用 api 时保持登录会话。
我的理解是我需要以某种方式登录并获取 cookie。
我一直在看一些帖子,我很沮丧,因为我根本无法让它工作。我发现了这样的问题:从Delphi和Delphi登录网站-从代码登录网页,这有点让人有点了解。
那我做了什么?我使用了检查元素来获取登录页面上输入字段的字段名称。电子邮件字段有一个名为 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
解决方案
在为 web 表单页面生成 HTML之后Get()
,您需要解析 HTML 以定位适当的元素并提取您需要提交回服务器的<form>
所有元素。<input>
该解析将为您提供实际名称(尤其是随机生成的名称)和您需要放入TStringList
.
必须提交<input>
具有非空属性(如果不是用户提供)的任何元素(尤其是“隐藏”元素)。value
这正是 Web 浏览器会做的事情,也是服务器希望您做的事情。Indy 不会帮助您进行解析,您需要自己处理。如果您环顾四周,有很多可用的 HTML 解析器。
推荐阅读
- android - 将 gatt 特性写入 BLE 设备时出现问题
- javascript - SQLITE 查询的“排序依据”结果未排序
- python - Pypyodbc TabError:缩进中制表符和空格的不一致使用
- php - 过滤不过滤
- r - 从 head() 函数中提取最大值和最小值?
- angular - 打开 Shift Angular 8 应用程序内存不足问题
- python - 如何从 pyomo 模型中删除 Set 元素(和相关组件)?
- docker - Docker:Dockerfile 无法执行 COPY
- javascript - React JS 路由仅在重新加载时有效
- azure - ValidationError:使用 AzureAD 进行 hapi JS 路由授权时不允许使用“tenantId”