2011-09-27 61 views
0

有一個網站,其中包含一個JS代碼。通常,當用戶打開該頁面時,該JS代碼將手動啓動並提供約10秒的鏈接。 我想抓住這個鏈接。在PHP中,我使用file_get_contents函數調用此頁面,但是您預測鏈接不存在。如何使用包含JS的PHP調用外部服務器頁面?

有什麼辦法可以向這個頁面發出HTTP請求並等到javascript代碼啓動。或者我可以通過使用JQuery來調用這個JS函數嗎?

如果問題不清楚,我可以提供更多的細節。提前致謝。

+0

您可以使用PHP中的sleep()函數等待JS執行10秒鐘。 – Ameer

+0

我需要在file_get_contents之後調用sleep()嗎? –

+2

這沒有什麼幫助,你會得到文本內容,所以不會啓動JS執行,因此'sleep'沒用。如果鏈接被添加到帶有JS的頁面中,你將不得不實現其他一些方法,例如,使用嵌入式瀏覽器就我所知,在PHP中這是不可能的,但C#,Java,C++,Delphi肯定有這樣的瀏覽器。 – J0HN

回答

2

我建議查看頁面上的JavaScript並反向工程如何動態生成鏈接。然後,您可以使用正則表達式從file_get_contents返回的字符串中提取該信息。

如果您可以在有問題的頁面(或類似頁面)上提供額外信息,我可以幫助您進行逆向工程。

更新: 經過一番反轉之後,我發現mp3 ripper站點使用2個api:一個推動視頻進行處理,一個推動當前狀態。

首先API:

http://www.youtube-mp3.org/api/pushItem/?item=http%3A//www.youtube.com/watch%3Fv%3DXXXXXXXX&xy=trve 

第二API:

http://www.youtube-mp3.org/api/itemInfo/?video_id=XXXXXXXX&adloc= 

XXXXXXXX是YouTube視頻ID。第二個api返回JSONP,其中填充是一個變量賦值(info = {...};)。在json中,有一個「h」成員返回一個長哈希,可用於最終構建mp3下載文件鏈接。

但是有點道德,我可以建議尋找另一種方法(如果您的主機環境允許)?您可以使用FFmpeg自行轉換視頻。這裏有一個包裝類:YouTube-to-MP3 conversion class

+0

我在說的網站是[this](http://www.youtube-mp3.org/) 如果我通過提供youtube video id來調用這個網頁,它會生成例如try [this]的結果( http://www.youtube-mp3.org/?c#v=fJ9rUzIMcZQ) 我有我的PHP中的視頻ID,我想在後臺調用此頁面並返回MP3鏈接。 –

+0

你想要鏈接到實際的mp3文件,或點擊「鏈接這個mp3」後,該網站提供的「直接鏈接」? – Dave

+0

哇!我對你的逆向工程感到驚訝。你對倫理問題也是正確的。我也會嘗試實施你的建議。但是這種轉換可能需要很大的帶寬。 我也想知道你是如何做倒車的?我只花了幾個小時來理解這個機制。有什麼方法可以改進我的逆向工程,還是僅僅是經驗? –

0

Javascript在客戶端執行,需要一個解釋器來執行它。執行HTTP請求調用的PHP服務器不會解釋任何JavaScript,它只是簡單地檢索HTML。

你可以使用一些軟件如HtmlUnit來發出請求並執行javascript,然後看看你是否可以在鏈接完成後提取鏈接。這將取決於您對正在執行PHP的服務器有多少訪問權限。

或者您可以研究您所針對的網站使用的JS文件,確定它是如何請求該鏈接並查看您是否可以直接自行獲取該鏈接。請記住,您直接瞭解網站的工作方式,因此這不會是一個特別優雅的解決方案,並且他們的JS中的單個更改可能會導致您的應用程序失敗。這很公平,因爲他們可能已經制定了這個流程來阻止人們以您所描述的方式收集鏈接。

0

file_get_contents只提取請求的URL的HTML源代碼,它不會爲您執行JavaScript代碼,也不會模擬dom及其所有事件。

簡短的答案是,這是不容易做到的。你可以做的一件事就是解析源代碼並尋找鏈接,如Dave suggested