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リファラーフィールドの簡単な分析
  • セッション固有のCookieの設定と確認
  • ワンタイム値が非表示のHTTPフォームがあり、[ダウンロード]ボタンはリンクではなく、フォームの送信アクションになります。
  • ワンタイムハッシュURLを生成し、IPやブラウザ名などのさまざまなパラメータをそのURLにエンコードします
  • おそらくもっとある

USDownloaderやJDownloaderのようなツールは、それを回避するために多くの試みを行います。

zippyshareはよりリベラルなように見えますが、それでもホットリンクを使用する余裕はなく、少なくともいくつかの自己防衛手段を実装する必要があります。トラフィックを分析するとき-人生で初めてzippyshareページをロードするまったく新しいブラウザから始めて、すべてをチェックしてください。

ページを数回リロードすると、番号「604061」が異なり、リロードするたびにリンクが何度も変更され続けることがわかります。おそらく、ページをロードし、リンクを解析し、HTTPリファラーを設定してから、ファイルをダウンロードする必要があります。

HTTPトラフィックログを表示しないため、確実に判断するのは困難です。

于 2013-01-16T16:09:05.930 に答える
1

The server may be checking for some trace to avoid the file to be downloaded programmatically.

It may be anything the hostmaster wants to check, from a wide range of possibilities, but the most typical check is the referrer.

When you navigate in a web browser from one page to another using an link, the browser adds the first page as a referrer to the second page in the request header.

Indy have support for you to add a referrer:

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

If the check fails, the server script just redirects the input to the donwload page. This is done to show advertising or to filfull other goals of the file hosting service.

于 2013-01-16T16:05:35.913 に答える