以编程方式从文件主机下载文件



我有一些文件上传到一个文件主机,我想以编程方式下载,使用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';

如果检查失败,服务器脚本只是将输入重定向到下载页面。这样做是为了显示广告或满足文件托管服务的其他目标。

最新更新