Вызвать JavaScript на стороннем домене - PullRequest
3 голосов
/ 14 января 2009

Я хочу написать некоторый javascript и заставить его вызывать DOM для страницы, которую я загружаю из стороннего домена. Можно ли это сделать? Это похоже на то, что я уже пробовал использовать IFRAME, но может показаться, что это не работает. Является ли это каким-то другим способом, например, когда FF запускает какой-то javascript напрямую, а не как часть страницы?

Я знаю, что здесь есть всевозможные проблемы с безопасностью, но я парень, пишущий код, и единственный, кто его запустит.


Предыстория: я пытаюсь автоматизировать некоторые итерации веб-сайта.

Мой кулак IFRAME pass не сработал, потому что веб-страница из file:////.... не находится в том же домене, что и страница в http://whatever.com. Сюрприз, сюрприз.

Ответы [ 8 ]

4 голосов
/ 14 января 2009

Если я правильно понимаю вопрос, вы, вероятно, не сможете сделать это, используя только Javascript, из-за ограничений домена, с которыми вы столкнулись. Однако, если у вас есть знания по использованию сценариев оболочки или любого языка сценариев, это не должно быть проблемой, все, что вам нужно сделать, это вызвать старый добрый 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);
?>

И это во многом. У вас есть фактический HTML-код в переменной $ fp. Итак, в общем, я хотел бы написать небольшую Ajax-функцию Javascript для PHP, которая выполняет curl, а затем возвращает переменную $ fp через echo в обратный вызов Javascript, а затем, возможно, вставить ее в документ (используя innerHTML или DOM) и Бэм, у вас есть доступ ко всем вещам. Или вы можете просто разобрать его в PHP. В любом случае, должно работать нормально, если вы делаете это через curl. Надеюсь, это поможет.

Редактировать : После некоторых размышлений мне кажется, что я помню, что Safari снимает междоменное ограничение для localhost. После дополнительных исследований я не могу найти никакой документации, которая бы поддерживала эту мою теорию, поэтому я выкопал немного глубже и нашел лучший (хотя и более хакерский) способ выполнить весь этот беспорядок через Apache, если вы используете его (который Вы, вероятно,).

Apache mod_proxy примет запрос на что-то вроде «/ foo» и фактически направит запрос в какое-то удаленное место назначения, например «* 1014» * Конечный результат заключается в том, что ваш веб-браузер считает, что вы позвонили 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]

Источник

Больше править:

Видя, как вы хотите избежать всей настройки сервера, я попробовал использовать IFRAME в Safari (Mac), и это сработало, по крайней мере, для доменов, которые я пробовал:

<!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>
3 голосов
/ 14 января 2009

Читайте о букмарклетах . Основная идея состоит в том, чтобы создать закладку, которая выполняет некоторый код Javascript, который динамически внедряет Javascript в страницу, загруженную в настоящее время в вашем браузере. Большинство приложений для вырезки веб-страниц делают это.

1 голос
/ 14 января 2009

Есть способ ослабить безопасность домена в Firefox.

1 Добавьте эту строку в user.js. в Firefox.

user_pref ("signature.applets.codebase_principal_support", true);

2 Добавьте эту строку в каждую функцию javascript, которая должна пересекать домен.

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

3 Когда Firefox впервые пытается пересечь домен, он предупредит вас о попытке и запросит ваше разрешение.

Хорошая новость: ошибка, которая мешала этому работать с Firefox 3, по-видимому, исправлена.

1 голос
/ 14 января 2009

Взгляните на Selenium Remote-Control . Сервер действует как прокси для вашего браузера, чтобы обойти политику того же домена:

Наконец, Selenium Server действует как настроенный клиентом HTTP-прокси, чтобы стоять между браузером и вашим Веб-сайт. Это позволяет Браузер с поддержкой Selenium JavaScript на произвольных сайтах.

Возможно, вы захотите применить тот же подход и написать собственный прокси-сервер или даже простое веб-приложение, которое отображает страницы из других доменов (см. ответ Дейва ).

Или просто используйте Selenium для вашей автоматизации.

1 голос
/ 14 января 2009

JavaScript имеет ту же политику домена. Вы не сможете получить доступ к другому домену. Это для защиты от вас хакеров / плохих людей.

0 голосов
/ 22 марта 2010
0 голосов
/ 14 января 2009

Не то, о чем я думал, но: iMacros может делать то, что я хочу.

После просмотра он кажется немного ограниченным, и документы немного перегружены и не хватает мяса.

0 голосов
/ 14 января 2009

Я не уверен, что полностью понимаю проблему, возможно, вы могли бы описать ситуацию более подробно ... но я предполагаю, что вы сталкиваетесь с проблемами безопасности межсайтового скриптинга, если вы осуществляете доступ через домены.

Так ..

возможно извлекает свойство document.domain, которое может разрешить доступ скрипта к объектам окна в большинстве браузеров.

Оба сайта должны быть доступны через один и тот же основной домен, но могут иметь разные субдомены, если document.domain установлен на «основную» часть домена на обоих сайтах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...