我使用带有0
的Indy 9 TIdHTTP
组件发布到aspx页面(https://www.thedogs.co.nz/catch-the-action/results.aspx),以模拟浏览器中发生的事情以查看特定的月份比赛结果。
下面的代码应该下载2015年11月的结果。
首先,我获取URL然后解析它以提取TIdSSLIOHandlerSocket
(theVS),__VIEWSTATE
(theVSG)和__VIEWSTATEGENERATOR
(theEV)的值。
然后我这样做:
__EVENTVALIDATION
Sl是with HTTP do
begin
AllowCookies := True;
ProxyParams.BasicAuthentication := False;
ProxyParams.ProxyPort := 0;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.Accept := 'text/html, */*';
Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; rv:42.0)Gecko/20100101 Firefox/42.0';
Request.ContentType:= 'application/x-www-form-urlencoded';
Request.ContentEncoding := 'utf-8';
HTTPOptions := [hoForceEncodeParams];
end;
,M是TStringList
。
TMemoryStream
然而我回来的却是例外
HTTP / 1.1 404 Not Found
最值得赞赏的任何帮助!!
答案 0 :(得分:1)
您没有正确格式化TStringList
内容。您需要删除"
和&
字符,并且不要对值进行url编码。格式化实际的HTTP请求时,Post()
会在内部处理所有这些内容。
您还设置了一些您不需要设置的Request
属性,或者设置为无效值。
在您Get()
页面上检索Cookie和ViewState数据之后,在后续请求中,您没有将Request.Referer
属性设置为相同的URL。只要一个页面上的链接或表单用于访问另一个页面,就需要相应地设置Referer
标题。一些服务器验证确保请求来自正确的地方。
试试这个:
with HTTP do
begin
AllowCookies := True;
ProxyParams.BasicAuthentication := False;
ProxyParams.ProxyPort := 0;
Request.Accept := 'text/html, */*';
Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; rv:42.0)Gecko/20100101 Firefox/42.0';
HTTPOptions := [hoForceEncodeParams];
end;
Url := 'https://www.thedogs.co.nz/catch-the-action/results.aspx';
... := HTTP.Get(Url, ...);
// parse HTML as needed...
Sl.Add('__VIEWSTATE=' + theVS);
Sl.Add('__VIEWSTATEGENERATOR=' + theVSG);
Sl.Add('__EVENTVALIDATION=' + theEV);
Sl.Add( 'txtCurrentDate=1/12/2015 12:00:00 a.m.');
Sl.Add( 'txtAction=prevMonth');
HTTP.Request.Referer := Url;
HTTP.Post( Url, SL, M );
M.Position := 0;
SL.LoadFromStream(M);
SL.SaveToFile( '.\downloaded\theresults' );
// or simply: M.SaveToFile( '.\downloaded\theresults' );
答案 1 :(得分:0)
一个大"谢谢"给大家的帮助。问题原来是一个Windows'。几年前我的硬盘驱动器失败了,在更换它的过程中我升级到Win 7.大约一年后,我决定升级到Windows 8. HATED IT !! Asap,升级到8.1,最后几个月前,10。
想知道以上是否对我的Delphi问题有任何影响我想我会看看驱动器C上的实际内容: - 我注意到一个名为~windows或windows.old之类的文件夹。里面是一个完整的Windows文件集,但在其中也是另一个完整的WINDOWS文件夹。 长话短说 - 启动到DOS提示符并使用命令' del 删除文件夹中的所有文件。 / S / F / Q'然后删除了所有的文件夹,我现在非常高兴地报告说,最后我有一个非常好的Delphi + Indy10!