3

我想编写一些 javascript 并让它调用我从 3rd 方域加载的页面的 DOM。这可以做到吗?看起来像是我已经尝试过使用的IFRAME,但似乎不起作用。这些是其他方式吗,比如让 FF 直接运行一些 javascript 而不是作为页面的一部分?

我知道这有各种各样的安全问题,但我是编写代码的人,也是唯一会运行它的人。


背景故事:我正在尝试自动化一些网站迭代。

我的第IFRAME一次通过没有奏效,因为来自file:////....的网页与http://whatever.com. 惊喜,惊喜。

4

8 回答 8

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 解析它。无论哪种方式,如果您通过 curl 进行操作,应该可以正常工作。希望有帮助。

编辑:经过一番思考,我似乎记得 Safari 删除了 localhost 的跨域限制。在研究了更多之后,我找不到任何支持我的这个理论的文档,所以我挖得更深一点,找到了一个更好(虽然更黑客)的方法来通过 Apache 完成这整个混乱,如果你正在使用它(哪个你可能是)。

Apache 的 mod_proxy 将接受“/foo”之类的请求,并将请求通过隧道传送到某个远程目标,例如“<a href="http://dev.domain.com/bar" rel="nofollow noreferrer">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上的文件。您可以将以下所有内容放入 a 中:

# 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>
于 2009-01-14T06:30:34.087 回答
3

阅读书签。基本思想是您创建一个书签,该书签执行一些 Javascript 代码,该代码将 Javascript 动态注入到您浏览器中当前加载的页面中。大多数网页剪辑应用程序都是这样做的。

于 2009-01-14T02:03:23.720 回答
1

JavaScript 具有相同的域策略。您将无法访问其他域。这是为了保护你有黑客/坏人。

于 2009-01-14T02:02:58.650 回答
1

看看Selenium 远程控制。服务器充当浏览器绕过同域策略的代理:

最后,Selenium 服务器充当客户端配置的 HTTP 代理,位于浏览器和您的网站之间。这允许支持 Selenium 的浏览器在任意网站上运行 JavaScript。

您可能会考虑应用相同的方法并编写自己的代理,或者甚至是一个简单的 Web 应用程序来回显来自其他域的页面(请参阅Dave 的回答)。

或者,只需使用 Selenium 进行自动化。

于 2009-01-14T06:34:14.300 回答
1

有一种方法可以放松 Firefox 的域安全性。

1 将此行添加到 Firefox 的 user.js。

user_pref("signed.applet.codebase_principal_support", true);

2 将此行添加到需要跨域的每个 javascript 函数中。

netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead UniversalBrowserWrite");

3 Firefox 第一次尝试跨域时,它会警告您尝试跨域并提示您的许可。

好消息,阻止它与 Firefox 3 一起使用的错误似乎已修复。

于 2009-01-14T06:50:26.543 回答
0

我不确定我是否完全理解这个问题,也许你可以更详细地描述这种情况......但我猜如果你跨域访问,你会遇到跨站点脚本安全问题。

所以..

也许签出document.domain可以在大多数浏览器中跨窗口对象启用脚本访问的属性。

两个站点必须通过同一个主域访问,但可以有不同的子域,只要document.domain在两个站点上都设置为域的“主”部分。

于 2009-01-14T02:06:30.937 回答
0

不是我想的,而是:iMacros可能会做一些我想做的事情。

看起来它似乎有点有限,而且文档有点金光闪闪而且肉不够。

于 2009-01-14T06:23:46.270 回答
0

http://en.wikipedia.org/wiki/JSONP#JSONP

于 2010-03-22T18:02:14.173 回答