Извлечение данных из внешнего домена

Я создаю аналитический проект. Моя цель - предоставить владельцу x-домена небольшое количество javascript, которое включает мой сайт. Это дает мне способность отслеживать движения мыши. Я получил отслеживание, все, что мне нужно сделать, это отправить данные обратно на мой сервер, чтобы он мог храниться в моей БД. моя проблема в том, что данные слишком велики для отправки через getJSON.

Помните.. Я не могу использовать $.Post или любой запрос XMLhttp, потому что мой домен и x-домен являются REMOTE. И браузер не допускает этого. Я могу использовать только getJSON.

Так как это не работает, мне сказали настроить прокси. Ну, из того, что я узнал, прокси работает только на сервере с настройкой прокси-сервера. Не для сервера, который пытается отправить мне данные

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

Спасибо большое

Ответ 1

Вы можете создать свой JavaScript для создания iframe и формы, а затем отправить сообщение формы в iframe. Вы можете позиционировать его на экране, чтобы сделать скрытым. Например:

function post_my_data(json){

    var f = document.createElement('form');
    f.action = 'http://www.my-domain.com/receive.php';
    f.method = 'post';
    f.target = 'posttarget';

    var i = document.createElement('input');
    i.type = 'hidden';
    i.name = 'json';
    i.value = json;

    f.appendChild(i);

    var ifr = document.createElement('iframe');
    ifr.name = 'posttarget';
    ifr.style.display = 'absolute';
    ifr.style.left = '-1000px';

    document.body.appendChild(ifr);
    document.body.appendChild(f);

    f.submit();
}

Ответ 2

Считаете ли вы использование чего-то вроде JSONP?

Ответ 3

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

Ответ 4

Вы можете использовать javascript для разговора с флэш-памятью и иметь флэш файл для междоменной части, см. http://www.xml.com/pub/a/2006/06/28/flashxmlhttprequest-proxy-to-the-rescue.html

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

Ответ 5

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

         $.ajax({
       type: "POST",
       url: "http://mywebsite.com/ajax-proxy.php",
       data: 'csurl=www.google.com',
       error: function(e) {console.log(e);}, 
       success: function(msg){console.log(msg)}

    });

Вам также нужно передать csurl, который является URL-адресом, к которому перенаправляет прокси-сервер. в этом примере я использовал google. но то, что я бы обычно использовал, поскольку csurl - это каталог, в котором я буду хранить данные ajax

В прокси файле есть

$valid_requests = array()

В этом массиве вы указываете все URL-адреса, которые вы хотите одобрить прокси. в этом примере вы помещаете www.google.com(Примечание: должно быть точно таким же, как параметр csurl, или он не работает)

Ниже представлен прокси файл

  <?php
/**
 * AJAX Cross Domain (PHP) Proxy 0.6
 *    by Iacovos Constantinou (http://www.iacons.net)
 * 
 * Released under CC-GNU GPL
 */

/**
 * Enables or disables filtering for cross domain requests.
 * Recommended value: true, for security reasons
 */
define('CSAJAX_FILTERS', true);


/**
 * A set of valid cross domain requests
 */
$valid_requests = array(
    'www.google.com'
);

/*** STOP EDITING HERE UNLESS YOU KNOW WHAT YOU ARE DOING ***/

// identify request headers
$request_headers = array();
foreach ( $_SERVER as $key=>$value ) {
    if( substr($key, 0, 5) == 'HTTP_' ) {
        $headername = str_replace('_', ' ', substr($key, 5));
        $headername = str_replace(' ', '-', ucwords(strtolower($headername)));
        $request_headers[$headername] = $value;
    }
}

// identify request method, url and params
$request_method = $_SERVER['REQUEST_METHOD'];
$request_params = ( $request_method == 'GET' ) ? $_GET : $_POST;
$request_url    = urldecode($request_params['csurl']);
$p_request_url  = parse_url($request_url);
unset($request_params['csurl']);

// ignore requests for proxy :)
if ( preg_match('!'. $_SERVER['SCRIPT_NAME'] .'!', $request_url) || empty($request_url) ) {
    exit;
}

// check against valid requests
if ( CSAJAX_FILTERS ) {
    $parsed     = $p_request_url;
    $check_url  = isset($parsed['scheme']) ? $parsed['scheme'] .'://' : '';
    $check_url .= isset($parsed['user']) ? $parsed['user'] . ($parsed['pass'] ? ':'. $parsed['pass']:'') .'@' : '';
    $check_url .= isset($parsed['host']) ? $parsed['host'] : '';
    $check_url .= isset($parsed['port']) ? ':'.$parsed['port'] : '';
    $check_url .= isset($parsed['path']) ? $parsed['path'] : '';
    if ( !in_array($check_url, $valid_requests) ) {
        exit;
    }
}

// append query string for GET requests
if ( $request_method == 'GET' && count($request_params) > 0 && ( !array_key_exists('query', $p_request_url) || empty($p_request_url['query']) ) ) {
    $request_url .= '?'. http_build_query($request_params);
}

// let the request begin
$ch = curl_init($request_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);         // (re-)send headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                 // return response
curl_setopt($ch, CURLOPT_HEADER, true);                         // enabled response headers

// add post data for POST requests
if ( $request_method == 'POST' ) {
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($request_params));
}

// retrieve response (headers and content)
$response = curl_exec($ch);
curl_close($ch);

// split response to header and content
list($response_headers, $response_content) = preg_split('/(\r\n){2}/', $response, 2);

// (re-)send the headers
$response_headers = preg_split('/(\r\n){1}/', $response_headers);
foreach ( $response_headers as $key => $response_header )
    if ( !preg_match('/^(Transfer-Encoding):/', $response_header) ) 
        header($response_header);

// finally, output the content
print($response_content);
?>

Опять же, если я помещаю http://mywebsite.com/ajax-proxy.php?csurl=www.google.com с моего сайта. он отлично работает. или даже поместить его в URL. работает отлично. но если вы вызываете его с внешнего сервера, используя пост ajax. не работает.