Вызов JavaScript в стороннем домене

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

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


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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
872
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

У 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>

Это может сработать. однако, если веб-страница выполняет какую-либо причудливую работу (например, имеет много javascript с собственным DOM), это не даст мне того, что мне нужно.

BCS 14.01.2009 09:38

О, да, но если вы действительно не можете добавить код на сторонний сайт, в чем я сомневаюсь, вероятно, нет никакого способа получить их манипуляции с DOM. Однако, если вы случайно работаете на компьютере Mac или Windows, я думаю, что Safari не имеет ограничения домена для localhost.

David 14.01.2009 09:41

Итак, страница, загруженная с локального хоста, может иметь javascript, который сбивается с фреймом / iframe, которого нет? хорошо знать.

BCS 14.01.2009 09:50

Я как бы надеялся на решение, которое не требует с моей стороны никакого сервера.

BCS 14.01.2009 10:17

+1 за включение вашего «экспериментального рабочего процесса» - очень информативно, более того, чем если бы вы только что упомянули результаты.

doug 04.06.2010 12:32

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

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, кажется, исправлена.

хрень, это много работы! (в большинстве случаев это хорошо)

BCS 14.01.2009 10:02

Обход безопасности не должен быть тривиальным =) Запрос появляется только один раз. Допустим, вы хотите, чтобы ваша веб-страница имела доступ к другим сайтам 1, 2 и 3. Вы загружаете свою страницу и получаете доступ к other1, и вы разрешаете междоменный доступ. Теперь, когда ваш сервер обращается к 1, 2 или 3, подсказки нет.

Bill 14.01.2009 10:21

Другие вопросы по теме