2013-01-16 50 views
2

我有一些文件上傳到filehoster,我想用編程方式下載,使用Delphi。他們不需要任何驗證碼或類似的東西,通常只需按下一個按鈕即可獲取文件。我們來看this as an example以編程方式從filehoster下載文件

現在我想我可以簡單地使用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)我可以實現從相同在我的代碼中。你有什麼機會可以教我一點嗎? ;)

編輯

感謝您輸入我能找到的問題,事實證明,我必須使用的地址被使用隨機數,它是在原來的源被發現產生。所以發佈一個請求來獲取號碼的訣竅。我已編輯相應的代碼。多謝你們 !

+0

顯然你試圖下載一個PNG文件,但保存爲一個BMP文件。 – jachguate

+0

@jachguate抱歉,錯字,但通過將其保存爲一個.html我確信它是上一頁的實際代碼 – DNR

回答

2

文件託管網站做出不同的技巧,以確保您不是hotlinking並向您展示廣告和可能的計數器。可以有

  • 在請求HTTP引用字段的簡單分析
  • 設置和檢查會話唯一的餅乾有
  • HTTP表單與隱藏一個時間值,和下載按鈕將不會鏈接,但表單的提交操作。
  • 產生一次性混編網址,以及不同的參數,如您的IP及您的瀏覽器名稱編碼爲它
  • 也許更多

工具像USDownloader和JDownloader使得很多試圖繞過它。

儘管zippyshare似乎更自由,但它仍然無法負擔盜鏈,並應實施至少一些自衛措施。 在分析流量時 - 從絕對新鮮的瀏覽器加載zippyshare頁面開始,在其生命中第一次檢查它。

由於我重新加載頁面幾次,我看到數字「604061」是不同的,並且鏈接在每次重新加載後不斷變化。您可能必須加載頁面,解析鏈接,設置HTTP引用程序,然後才能下載文件。

您不顯示HTTP流量日誌,因此很難說清楚。

+0

哪種格式適合有意義的流量日誌,可以由我/這裏更熟練的人解釋? – DNR

+0

pastebin上的一些文本,最好是您應該禁用瀏覽器和插件上的圖片,以減少不相關的請求 - 其中會有很多。 首先用delphi獲取PAGE並顯示其流量。 然後分析線條,但linem在HTTP上讀取幫助,並嘗試與上面的項目符合匹配。 –

+0

但是 - 也許你可以把它全部搞定,在Delphi中運行web瀏覽器並使它爲你加載文件?在運行時很醜,速度較慢,但​​代碼更快。而不是重新實現這一切。 –

1

服務器可能正在檢查某些跟蹤以避免以編程方式下載文件。

它可能是東道主希望檢查的東西,從廣泛的可能性,但最典型的檢查是引用。

當您使用鏈接在網頁瀏覽器中從一個頁面導航到另一個頁面時,瀏覽器將第一頁作爲referrer添加到請求頁眉的第二頁。

印有支持,爲您添加引用:

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

如果檢查失敗,該服務器腳本只是重定向輸入到donwload頁面。這樣做是爲了顯示廣告或填補文件託管服務的其他目標。

+0

聽起來似乎合理,但在與先前地址的獲取請求之前添加此行不會改變任何內容 – DNR

+0

@因此,主持人正在檢查不同的事情。您需要弄清楚它是什麼,以便在發生成功下載時分析瀏覽器和服務器之間的流量。 – jachguate

+0

您確定下載發生在get而不是post嗎? – jachguate

相關問題