以编程方式从filehoster下载文件

时间:2013-01-16 15:56:38

标签: delphi redirect download idhttp

我在filehoster上传了一些文件,我想用Delphi以编程方式下载。它们不需要任何验证码等,通常只需按一个按钮即可获得该文件。我们来看this as an example

现在我想我可以简单地将URL下载到现在 - 按钮指向,使用TIdHTTP.Get请求并使用MemoryStream / Filestream /保存它。复制链接地址会导致this site,当进入我的浏览器时弹出下载提示。

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

修改

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

2 个答案:

答案 0 :(得分:2)

文件托管网站提供不同的技巧,以确保您不是hotlinking,并向您展示广告,也许还有反击。可以

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

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

虽然zippyshare似乎更自由,但它仍然无法承受热链接,并且应该至少实施一些自卫措施。 分析流量时 - 从绝对新鲜的浏览器开始,首次加载zippyshare页面,并检查一切。

当我重新加载页面几次时,我看到数字“604061”不同,链接在每次重新加载后一次又一次地改变。您可能必须加载页面,解析链接,设置HTTP引用程序,然后才下载文件。

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

答案 1 :(得分:1)

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

这可能是主持人想要检查的任何内容,但是最常见的检查是推荐人。

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

Indy支持您添加推荐人:

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

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