我想写一些javascript并让它调用DOM来获取我从第三方域加载的页面。可以这样做吗? This看起来就像我使用IFRAME
尝试的那样,但似乎不起作用。这些是其他方式,如FF直接运行一些JavaScript而不是作为页面的一部分?
我知道这有各种各样的安全问题,但我是编写代码的人,也是唯一能够运行代码的人。
背景故事:我正在尝试自动化一些网站迭代。
我的IFRAME
次传递不起作用,因为来自file:////....
的网页与http://whatever.com
中的网页不在同一个域中。惊喜,惊喜。
答案 0 :(得分:4)
如果我正确理解了这个问题,您可能无法单独使用Javascript,因为您遇到了域限制。但是,如果您对使用shell脚本或任何脚本语言有一些了解,那么它应该没有问题,您需要做的只是调用旧的卷曲。
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删除了localhost的跨域限制。在研究了一些之后,我找不到任何支持我这个理论的文档,所以我挖得更深一点,找到了一个更好的(虽然更黑客)的方式来通过Apache完成这个混乱,如果你正在使用它(你可能是。)
Apache的mod_proxy将接受类似“/ foo”的请求,并实际将请求隧道传送到某个远程目标,如“http://dev.domain.com/bar”。最终结果是您的Web浏览器认为您已拨打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]
更多编辑
看到你想如何避免整个服务器安装的事情,我在Safari(Mac)上使用IFRAME进行了一次拍摄,它起作用了,至少对于我尝试过的域名是这样的:
<!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>
答案 1 :(得分:3)
阅读bookmarklets。基本思想是创建一个书签,执行一些Javascript代码,动态地将Javascript注入到浏览器中当前加载的页面中。大多数网页剪辑应用程序都是这样做的。
答案 2 :(得分:1)
JavaScript具有相同的域策略。您将无法访问其他域。这是为了保护你有黑客/坏人。
答案 3 :(得分:1)
看看Selenium Remote-Control。服务器充当您的浏览器的代理,以绕过同一域策略:
最后,Selenium Server充当了 客户端配置的HTTP代理,站起来 在浏览器和你的之间 网站。这允许一个 启用Selenium的浏览器运行 任意网站上的JavaScript。
您可以考虑应用相同的方法并编写自己的代理,甚至是一个简单的Web应用程序,它可以回应其他域中的页面(参见Dave's answer)。
或者,只需使用Selenium进行自动化。
答案 4 :(得分: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的错误似乎已得到修复。
答案 5 :(得分:0)
我不确定我是否完全理解这个问题,也许你可以更多地描述这种情况......但是如果你跨域访问,我猜你正在遇到跨站点脚本的安全问题。 / p>
所以..
可能会检查document.domain
属性,该属性可以在大多数浏览器中启用跨窗口对象的脚本访问。
两个网站必须通过相同的主域访问,但只要document.domain
设置为两个网站上域的“主要”部分,就可以拥有不同的子域。
答案 6 :(得分:0)
不是我的想法,但是:iMacros可能会做我想要的一些事情。
看了之后看起来似乎有点受限制,而且文档有点多,而且吃得不够。
答案 7 :(得分:0)