2009-01-14 101 views
3

我想寫一些javascript,並將它調用到我從第三方域加載的頁面的DOM中。這可以做到嗎? This看起來像我已經嘗試使用IFRAME,但它似乎不起作用。這些其他方式就像FF直接運行一些JavaScript而不是頁面的一部分?在第三方域調用JavaScript

我知道這有各種安全問題,但我是編寫代碼的人,也是唯一能夠運行它的人。


背景故事:我試圖自動化一些網站迭代。

我的拳頭IFRAME通過不起作用,因爲file:////....的網頁與http://whatever.com中的頁面不在同一個域中。驚喜,驚喜。

回答

4

如果我正確地理解了這個問題,由於您遇到的域限制,您可能無法單獨使用Javascript。但是,如果您有一些使用shell腳本或任何腳本語言的知識,那應該沒有問題,您只需調用舊的curl即可。

例在PHP中:

<?php 
$url = "http://www.example.com/index.html"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0'); 
$fp = curl_exec($ch); 
curl_close($ch); 
?> 

而這幾乎是它。您在$ fp變量中擁有實際的HTML代碼。所以,總而言之,我要做的是向PHP中寫入一個Javascript Ajax函數,它執行curl,然後通過echo將返回的$ fp變量返回給Javascript回調函數,然後將其插入到文檔中(使用innerHTML或DOM)和bam,你可以訪問所有的東西。或者你可以用PHP解析它。無論哪種方式,如果你通過捲曲來做,應該工作得很好。希望有所幫助。

編輯:經過一番思考,我似乎記得Safari刪除了本地主機的跨域限制。經過一番研究後,我找不到任何支持這種理論的文檔,所以我深入挖掘了一下,發現了一個更好的(雖然很冒險的)方式來通過Apache來完成整個混亂,如果你使用它(它你可能是)。

Apache的mod_proxy會收到類似「/ foo」的請求,並將請求實際傳送到某個遠程目標,如「http://dev.domain.com/bar」。最終的結果是,您的網絡瀏覽器認爲您撥打了http://localhost/foo,但實際上您正在從遠程服務器發送和檢索數據。解決安全問題!

例子:

LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_http_module modules/mod_proxy_http.so 
LoadModule rewrite_module modules/mod_rewrite.so 

讓我們假設我想在http://dev.domain.com/remote/api.php訪問文件。你會把所有以下的爲:

# start mod_rewrite 
RewriteEngine On 
ProxyRequests Off 
<Proxy> 
    Order deny,allow 
    Allow from all 
</Proxy> 

ProxyPass /apitest/ http://dev.domain.com/remote/api/ 
ProxyPassReverse /apitest/ http://dev.domain.com/remote/api/ 
RewriteRule ^/apitest/(.*)$ /remote/api/$1 [R] 

Source

更多編輯:

看到,只要你想如何避免整個服務器設置的東西,我用了它一個鏡頭一個IFRAME在Safari(蘋果機),和它的工作,至少我試過域:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> 
<html> 
<head> 
</head> 
    <body> 
     <iframe src="http://www.stackoverflow.com/"></iframe> 
    </body> 
</html> 
+0

這可能會起作用。然而,如果網頁做了任何一種奇特的步法(就像擁有它自己的DOM那麼多的javascript),那不會讓我得到我需要的東西。 – BCS 2009-01-14 06:38:26

+0

哦,是的,但除非你真的可以將代碼添加到第三方網站,我懷疑,可能沒有辦法實際獲得他們的DOM操作。 但是,如果有機會在Mac或Windows機器上工作,我認爲Safari沒有localhost的域限制。 – David 2009-01-14 06:41:36

+0

因此,從本地主機加載的頁面可以有一個JavaScript與非幀/ iframe的?很高興知道。 – BCS 2009-01-14 06:50:55

1

JavaScript具有相同的域策略。您無法訪問其他域。這是爲了保護你有黑客/壞人。

+0

好點(+1)但沒有幫助。 – BCS 2009-01-14 06:17:19

3

請閱讀bookmarklets。基本思想是創建一個書籤,該書籤執行一些Javascript代碼,動態地將Javascript注入到當前加載到瀏覽器中的頁面中。大多數網頁剪輯應用程序都這樣做。

0

我不確定我是否完全理解了這個問題,也許你可以更多地描述這種情況......但是我猜你正在跨域訪問跨站腳本安全問題。

所以..

也許檢出document.domain屬性,它可以使在大多數瀏覽器跨窗口對象的腳本訪問。

這兩個網站都必須通過相同的主域訪問,但只要document.domain設置爲兩個網站上的「主要」部分域,就可以有不同的子域。

0

不是我在想什麼,但:iMacros可能會做我想要的一些。

看起來似乎有點有限,文件是有點多錢,沒有足夠的肉。

1

看看Selenium Remote-Control。服務器充當您的瀏覽器的代理繞過同域策略:

最後,Selenium服務器充當 客戶端配置HTTP代理,站在 在瀏覽器和 網站之間。這允許 支持Selenium的瀏覽器在任意網站上運行 JavaScript。

您可能會考慮應用相同的方法並編寫自己的代理或甚至是一個簡單的Web應用程序,以響應其他域的頁面(請參閱Dave's answer)。

或者,只需使用Selenium進行自動化。

1

有一種方法可以放鬆Firefox的域安全。

1將此行添加到Firefox的user.js.

user_pref(「signed.applets.codebase_principal_support」,true);

2將此行添加到需要跨域的每個javascript函數。

netscape.security.PrivilegeManager.enablePrivilege(「UniversalBrowserRead UniversalBrowserWrite」);

3 Firefox第一次嘗試跨域時,它會警告您嘗試並提示您獲得許可。

好消息,阻止它與Firefox 3一起使用的錯誤似乎已修復。

相關問題