2

我有一些文件上传到文件主机,我想使用 Delphi 以编程方式下载这些文件。它们不需要任何验证码或类似的东西,通常您只需按一个按钮即可获得文件。让我们以此为例

现在我想我可以简单地获取立即下载 - 按钮指向的 URL,使用 TIdHTTP.Get 请求并将其保存为 MemoryStream / Filestream / 任何东西。复制链接地址指向这个站点,当输入到我的浏览器时会弹出下载提示。

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)我可以在我的代码中实现相同的目标。你们中的任何人可能会在那里教育我一点吗?;)

编辑

感谢您的输入,我可以找到问题,结果是我必须使用的地址是使用随机数生成的,该随机数可以在原始源中找到。因此,首先发布一个获取号码的请求就可以了。我已经相应地编辑了代码。

4

2 回答 2

2

文件托管网站采用不同的技巧来确保您没有进行盗链,并向您展示广告和反击。可以有

  • 请求中HTTP Referrer字段的简单分析
  • 设置和检查会话唯一 cookie
  • 具有隐藏的一次性值的 HTTP 表单,下载按钮不是链接,而是表单的提交操作。
  • 生成一次性哈希 URL,并将不同的参数(如您的 IP 和浏览器名称)编码到其中
  • 也许更多

像 USDownloader 和 JDownloader 这样的工具做了很多尝试来规避它。

虽然 zippyshare 似乎更加自由,但它仍然无法承受盗链,应该至少采取一些自卫措施。在分析流量时 - 从绝对新鲜的浏览器开始第一次加载 zippyshare 页面并检查所有内容。

当我重新加载页面几次时,我看到数字“604061”不同,并且每次重新加载后链接都会不断变化。您可能必须加载页面,解析链接,设置 HTTP 引用,然后才下载文件。

您没有显示 HTTP 流量日志,因此很难确定。

于 2013-01-16T16:09:05.930 回答
1

服务器可能正在检查某些跟踪以避免以编程方式下载文件。

它可能是主机管理员想要检查的任何内容,有多种可能性,但最典型的检查是推荐人。

当您在 Web 浏览器中使用链接从一个页面导航到另一个页面时,浏览器会将第一个页面作为引用者添加到请求标头中的第二个页面。

Indy 支持您添加推荐人:

IdHTTP1.Request.Referer := 'http://www.any.other.page';

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

于 2013-01-16T16:05:35.913 回答