Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 以编程方式从filehoster下载文件_Delphi_Redirect_Download_Idhttp - Fatal编程技术网

Delphi 以编程方式从filehoster下载文件

Delphi 以编程方式从filehoster下载文件,delphi,redirect,download,idhttp,Delphi,Redirect,Download,Idhttp,我在filehoster上传了一些文件,我想使用Delphi以编程方式下载这些文件。他们不需要任何验证码或类似的东西,通常你只需按下一个按钮就可以得到文件。让我们坐飞机吧 现在我想我可以简单地获取“立即下载”按钮指向的URL,使用一个TIdHTTP.Get请求,并将其保存为MemoryStream/Filestream/where。复制链接地址会导致,当输入到我的浏览器时,会弹出下载提示 var MemStream: TMemoryStream; code: string;

我在filehoster上传了一些文件,我想使用Delphi以编程方式下载这些文件。他们不需要任何验证码或类似的东西,通常你只需按下一个按钮就可以得到文件。让我们坐飞机吧

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

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请求时,我必须设置HandlerRedirects以避免错误消息,并且我得到的是原始站点的HTML代码,而不是我怀疑的文件

所以,我有点搞不懂怎么做 1)尽管URL仅包含指向上一页的302重定向,但我还是以某种方式从浏览器中获取了该文件 2)我可以在代码中实现同样的功能。你们中有人能在那里教我一点吗?;)

编辑


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

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

它可能是主机主想要检查的任何东西,从各种可能性来看,但最典型的检查是推荐人

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

Indy支持您添加推荐人:

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

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

文件托管网站会采取不同的技巧,以确保您没有广告,并向您展示广告,也许还会反击。可能有

  • 浅析请求中的HTTP referer字段
  • 设置和检查会话唯一cookie
  • 具有隐藏一次性值的HTTP表单和下载按钮将不是链接,而是表单的提交操作
  • 生成一次性哈希URL,并将IP和浏览器名称等不同参数编码到其中
  • 也许更多
像USDownloader和JDownloader这样的工具试图绕过它

虽然zippyshare似乎更为自由,但它仍然负担不起热链接,至少应该实施一些自卫措施。 在分析流量时-从全新的浏览器开始,在其生命周期中第一次加载zippyshare页面,并检查所有内容

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


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

显然,您试图下载png文件,但将其另存为bmp文件。@jachguate抱歉,输入错误,但通过将其另存为.html,我确保它是上一页的实际代码听起来似乎合理,但是,在get请求之前添加这一行并没有改变之前的地址anything@Heina因此,主机正在检查不同的内容。这取决于你去弄清楚它是什么,所以当成功下载发生时,分析你的浏览器和服务器之间的流量。你确定下载发生在get而不是post中吗?他可以在浏览器中禁用HTTP Referer,看看这是否会改变行为。URL是一次性的,但没有人知道其中散列了什么。只需启动两个不同的浏览器,并将链接从一个浏览器传递到另一个浏览器-相同的行为。因此,实际上HTTP日志中可能有任何内容,我们没有看到哪种格式适合我/这里更熟练的人解释的有意义的流量日志?pastebin上的一些文本,最好您禁用浏览器和插件上的图片,以减少不相关的请求-可能会有很多。首先使用delphi获取页面并显示其流量。然后分析line,但linem阅读HTTP上的帮助,并尝试匹配上面的项目符号。但是-也许你可以完全搞定,在Delphi中运行web浏览器,让它为你加载文件?运行时丑陋且缓慢,但编码速度更快。我完全可以尝试第二种方法,但是如果我不能以其他方式让它工作,这似乎是最后的手段。我并不想知道如何最有效地共享它,但是如何真正创建它,比如,你说的是什么类型的日志?Wireshark会话,Fiddler,还有什么?编辑:多亏了你的输入,我找到了一个解决方案,因为它可能会埋在这里。我编辑了开场白。接受你的答案,因为你提供了最多的意见,但也要感谢JachGrate。