我有一些文件上传到一个文件主机,我想以编程方式下载,使用Delphi。它们不需要任何验证码或类似的东西,通常你只需要按下一个按钮就可以获得文件。我们以这个为例。
现在我想我可以简单地采取URL下载现在-按钮是指向,使用TIdHTTP。获取请求并将其保存为MemoryStream/fileststream/任何东西。复制链接地址会指向这个站点,在我的浏览器中输入该站点时,会弹出下载提示。
var
MemStream: TMemoryStream;
code: string; // added for solution
number: integer; // added for solution
begin
with TIdHTTP.Create(nil) do
try
HandleRedirects := true;
System.Delete(code,1,AnsiPos('var n =',code)+7); // added
number := StrToInt(AnsiLeftStr(code,AnsiPos(' ',code)-1)) + 1; // added
MemStream := TMemoryStream.Create;
try
// Get('http://www56.zippyshare.com/d/5862319/604061/bgAvgTable.png', MemStream);
Get(TIdURI.URLEncode('http://www56.zippyshare.com/d/5862319/' + IntToStr(number)
+ '/bgAvgTable.png'), MemStream); // added for solution
MemStream.SaveToFile('test.png');
finally
MemStream.Free;
end;
finally
Free;
end;
end;
但是,使用检查工具我发现它包含到原始站点的302重定向,因此在执行get请求时,我必须设置HandleRedirects以避免错误消息,并且我得到了原始站点的HTML代码,而不是我怀疑的文件。
所以,我有点困惑如何1)我以某种方式从浏览器获得文件,尽管URL只包含到前一页的302重定向和2)我可以在我的代码中实现相同的功能。你们谁能教我一点吗?;)
编辑
多亏了你的输入,我才能找到问题,原来我必须使用的地址是使用随机数生成的,这是在原始源代码中找到的。因此,发布请求先获得号码是可行的。我对代码进行了相应的编辑。
文件托管网站有不同的技巧,以确保你不是热链接,并显示你的广告,也许反击。可以有
- 请求中HTTP Referrer字段的简单分析
- 设置和检查会话唯一cookie
- 具有隐藏一次性值的HTTP表单,并且下载按钮将不是链接,而是表单的提交动作。
- 生成一次性散列URL,并将不同的参数(如IP和浏览器名称)编码到其中
- maybe more
像USDownloader和JDownloader这样的工具做了很多尝试来绕过它。
虽然zippyshare似乎更自由,但它仍然负担不起热链接,至少应该实施一些自卫措施。当分析流量时-从绝对新鲜的浏览器开始加载zippyshare页面,这是它生命中的第一次,并检查这一切。
当我重新加载页面几次时,我看到数字"604061"是不同的,每次加载后链接不断变化。你可能需要加载页面,解析链接,设置HTTP引用,然后下载文件。
您没有显示HTTP流量日志,因此很难确定
服务器可能正在检查某些跟踪,以避免以编程方式下载文件。
它可能是主机管理员想要检查的任何东西,从广泛的可能性中,但最典型的检查是referrer。
当你在浏览器中使用链接从一个页面导航到另一个页面时,浏览器会在请求头中添加第一页作为第二页的引用。
Indy已经支持你添加一个引用:
IdHTTP1.Request.Referer := 'http://www.any.other.page';
如果检查失败,服务器脚本只是将输入重定向到下载页面。这样做是为了显示广告或满足文件托管服务的其他目标。