Я хочу написать какой-нибудь javascript и вызвать его в DOM для страницы, которую я загружаю из стороннего домена. Можно ли это сделать? Этот выглядит так, как я уже пробовал использовать IFRAME, но, похоже, это не работает. Это какой-то другой способ, как если бы FF запускал какой-то javascript напрямую, а не как часть страницы?
Я знаю, что у этого есть всевозможные проблемы с безопасностью, но я парень, пишущий код, и единственный парень, который будет его запускать.
Предыстория: я пытаюсь автоматизировать некоторые итерации веб-сайта.
Мой первый проход IFRAME не работал, потому что веб-страница из file:////.... не находится в том же домене, что и страница в http://whatever.com. Сюрприз Сюрприз.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У JavaScript такая же доменная политика. Вы не сможете получить доступ к другому домену. Это для защиты вас есть хакеры / плохие люди.
Читайте на букмарклеты. Основная идея состоит в том, что вы создаете закладку, которая выполняет некоторый код Javascript, который динамически внедряет Javascript в страницу, загруженную в данный момент в вашем браузере. Большинство приложений для вырезания веб-страниц делают это.
Я не уверен, что полностью понимаю проблему, возможно, вы могли бы описать ситуацию подробнее ... но я предполагаю, что вы сталкиваетесь с проблемами безопасности межсайтового скриптинга, если вы осуществляете доступ через несколько доменов.
Так..
возможно, проверьте свойство document.domain, которое может разрешить доступ сценария к объектам окна в большинстве браузеров.
Оба сайта должны быть доступны через один и тот же основной домен, но могут иметь разные поддомены, если document.domain установлен как «основная» часть домена на обоих сайтах.
Не то, о чем я думал, но: iMacros может делать кое-что из того, что я хочу.
После просмотра это кажется немного ограниченным, а документы слишком много шика и недостаточно мяса.
Если я правильно понимаю вопрос, вы, вероятно, не сможете сделать это, используя только 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. Итак, в общем, я бы написал небольшую функцию Javascript Ajax для PHP, которая выполняет завиток, а затем возвращает переменную $ fp через echo в обратный вызов Javascript, а затем, возможно, вставляет ее в документ (используя innerHTML или DOM), и бац, у вас есть доступ ко всему. Или вы можете просто проанализировать его на PHP. В любом случае, все должно работать нормально, если вы делаете это через завиток. Надеюсь, это поможет.
Редактировать: Поразмыслив, я вспомнил, что Safari снимает междоменное ограничение для localhost. Изучив еще немного, я не смог найти никакой документации, подтверждающей эту мою теорию, поэтому я копнул немного глубже и нашел лучший (хотя и более хакерский) способ решить весь этот беспорядок через Apache, если вы его используете (который вы, вероятно, есть).
Apache’s mod_proxy will take a request for something like “/foo” and actually tunnel the request to some remote destination like “http://dev.domain.com/bar”. The end result is that your web browser thinks you’ve made a call to http://localhost/foo but in reality you’re sending and retrieving data from a remote server. Security implications solved!
Пример:
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>
О, да, но если вы действительно не можете добавить код на сторонний сайт, в чем я сомневаюсь, вероятно, нет никакого способа получить их манипуляции с DOM. Однако, если вы случайно работаете на компьютере Mac или Windows, я думаю, что Safari не имеет ограничения домена для localhost.
Итак, страница, загруженная с локального хоста, может иметь javascript, который сбивается с фреймом / iframe, которого нет? хорошо знать.
Я как бы надеялся на решение, которое не требует с моей стороны никакого сервера.
+1 за включение вашего «экспериментального рабочего процесса» - очень информативно, более того, чем если бы вы только что упомянули результаты.
Взгляните на Дистанционное управление селеном. Сервер действует как прокси-сервер для вашего браузера, чтобы обойти политику того же домена:
Finally, the Selenium Server acts as a client-configured HTTP proxy, to stand in between the browser and your website. This allows a Selenium-enabled browser to run JavaScript on arbitrary websites.
Вы можете рассмотреть возможность применения того же подхода и написания собственного прокси-сервера или даже простого веб-приложения, которое отображает страницы из других доменов (см. Ответ Дэйва).
Или просто используйте Selenium для автоматизации.
Есть способ ослабить безопасность домена Firefox.
1 Добавьте эту строку в файл Firefox user.js.
user_pref ("signed.applets.codebase_principal_support", истина);
2 Добавьте эту строку к каждой функции javascript, которая должна проходить через домен.
netscape.security.PrivilegeManager.enablePrivilege ("UniversalBrowserRead UniversalBrowserWrite");
3 При первой попытке Firefox перейти через домен он предупредит вас об этой попытке и запросит ваше разрешение.
Хорошие новости: ошибка, мешавшая этому работать с Firefox 3, кажется, исправлена.
хрень, это много работы! (в большинстве случаев это хорошо)
Обход безопасности не должен быть тривиальным =) Запрос появляется только один раз. Допустим, вы хотите, чтобы ваша веб-страница имела доступ к другим сайтам 1, 2 и 3. Вы загружаете свою страницу и получаете доступ к other1, и вы разрешаете междоменный доступ. Теперь, когда ваш сервер обращается к 1, 2 или 3, подсказки нет.
Это может сработать. однако, если веб-страница выполняет какую-либо причудливую работу (например, имеет много javascript с собственным DOM), это не даст мне того, что мне нужно.