Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить JSON с другого домена и отобразить на странице. (https://javascript.ru/forum/misc/54615-poluchit-json-s-drugogo-domena-i-otobrazit-na-stranice.html)

VVi3ard 24.03.2015 21:45

Получить JSON с другого домена и отобразить на странице.
 
Добрый день, делаю виджет для Win7 сам по себе виджет это обычная HTML страничка.

по ссылке: http://tsw.ru.forexprostools.com/api...6&timeframe=60
возвращается json.

я для теста сделал в блокноте страничку и в ней написал код:

<html>

<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>


<script language="JavaScript">

function Refresh(){
$.get("http://tsw.ru.forexprostools.com/api.php?action=refresher&pairs=2186&timeframe=60",
ParseAnswer(data));
};

function ParseAnswer (data)
{data = $.parseJSON(data); $("#question").text(data.summaryLast); }
</script>

</head>

<body onLoad="Refresh()">

</body>

</html>

Открываю ее в Chrome и получаю в консоли ошибку:
XMLHttpRequest cannot load http://tsw.ru.forexprostools.com/api...6&timeframe=60. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

Подскажите как правильно сделать?

Вообще цель получить HTML который при открытии отобразит содержимое "summaryLast" и будет каждые 10 секунд обновлять страничку.

danik.js 24.03.2015 21:55

Цитата:

Сообщение от VVi3ard
Подскажите как правильно сделать?

Не предусмотрели владельцы forexprostools.com доступа из Браузера. Не выставили спец-заголовок.
Положи на сервер свой php-скрипт, который будет делать запрос и отдавать результат. И из js обращайся к нему.

VVi3ard 24.03.2015 22:00

Сервера нет :( Да и настраивать сервер ради одной цифры на страничке как то не хочется.

Может быть можно как то не через ajax я в html не сильно разбираюсь... ?

рони 24.03.2015 22:16

VVi3ard,

<!DOCTYPE HTML>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script>
        $(document).ready(function() {
            function Refresh() {
                $.get("http://tsw.ru.forexprostools.com/api.php?action=refresher&pairs=2186&timeframe=60",
                    ParseAnswer);
            };
            Refresh()
            function ParseAnswer(data) {
                data = $.parseJSON(data);
                $("#question").text(data["2186"]["summaryLast"]);
            }
            window.setInterval(Refresh, 10000)
        });
    </script>
</head>
<body>
    <div id="question"></div>
</body>
</html>

laimas 24.03.2015 22:27

рони, не будет это работать, нужен JSONP.

VVi3ard, виджет для Win, тогда нафик вам нужны хромы и прочие?

рони 24.03.2015 23:03

laimas,
работает в ie,если не с инета.
Цитата:

Сообщение от laimas
нужен JSONP

можно поподробнее ?

и наконец танец с бубнами :)
<!DOCTYPE HTML>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <script src="http://code.jquery.com/jquery-latest.js"></script>
    <script>jQuery.ajax = function (d) {
    var b = location.protocol,
        e = RegExp(b + "//" + location.hostname),
        f = "http" + (/^https/.test(b) ? "s" : "") + "://query.yahooapis.com/v1/public/yql?callback=?";
    return function (a) {
        var c = a.url;
        if (/get/i.test(a.type) && !/json/i.test(a.dataType) && !e.test(c) && /:\/\//.test(c)) {
            a.url = f;
            a.dataType = "json";
            a.data = {
                q: 'select * from html where url="{URL}" and xpath="*"'.replace("{URL}", c + (a.data ? (/\?/.test(c) ? "&" : "?") + jQuery.param(a.data) : "")),
                format: "xml"
            };
            !a.success && a.complete && (a.success = a.complete, delete a.complete);
            var b = a.success;
            a.success = function (a) {
                b && b.call(this, {
                    responseText: (a.results[0] || "").replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, "")
                }, "success")
            }
        }
        return d.apply(this, arguments)
    }
}(jQuery.ajax);</script>
    <script>
        $(document).ready(function() {
            function Refresh() {
                 $.ajax({
                         url: 'http://tsw.ru.forexprostools.com/api.php?action=refresher&pairs=2186&timeframe=60',
                         type: 'GET',
                         success: ParseAnswer
            })};
            Refresh()
            function ParseAnswer(data) {
            data =  $('<div/>',{'html': data.responseText}).text();
            data = JSON.parse(data);
            $("#question").text(data["2186"]["summaryLast"]);;
            }
            window.setInterval(Refresh, 10000)
        });
    </script>
</head>
<body>
    <div id="question"></div>
</body>
</html>

laimas 24.03.2015 23:08

https://ru.wikipedia.org/wiki/JSONP

В jQuery нужно указать этот тип данных.

А вообще ведь под систему, и хватило бы ресурсов IE и одного iframe.

laimas 24.03.2015 23:11

>работает в ie,если не с инета.

Ну так можно и так тогда, попробовать выполнить это:

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

Но зачем это все?

рони 24.03.2015 23:37

laimas,
то есть можно сделать рабочий код на jQuery без танцев с бубнами?
если да то можно ли увидеть код?
сам я не смог применить JSONP к данному случаю

laimas 24.03.2015 23:47

Можно конечно, описание есть у разработчиков, в сети описаний и примеров тоже полно, вот первое что под руки попало.

Ну ведь пишется виджет для системы Win, то смысл в поддержке браузеров? Если не знать какого либо языка серьезного, ну можно использовать VBS. Не зная его, ну можно JS + IE + IFRAME как контейнер, и без проблем, зачем выпендриваться. :)

рони 24.03.2015 23:55

laimas,
спасибо за ссылку но видимо моих знаний недостаточно чтоб воспользоваться тем кодом.

laimas 25.03.2015 00:38

Так надо чтобы и запрашиваемый сервер эту технологию поддерживал. Запросив по данному адресу jsonp проблем с доступом не будет, но будут проблемы:

SyntaxError: missing ; before statement
{"2186":{"row":{"last":"57,760","ma":"\u041f....


Под Win, значит хватит:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<hta:application applicationname="myapp"
border="thin" borderstyle="normal" caption="yes" icon="icon.ico" scroll="no"
showintaskbar="yes" singleinstance="yes" maximizebutton="yes" contextmenu="yes"
windowstate="maximize" selection="yes" innerborder ="no" />
<meta http-equiv="msthemecompatible" content="no" />
<meta http-equiv="X-UA-Compatible" content="IE=11" />

<script>
function f(d) {
    alert(d)
}
</script>

</head>

<body>
<iframe style="display:none" src="http://tsw.ru.forexprostools.com/api.php?action=refresher&pairs=2186&timeframe=60" name="frame" onload="f(frame.document.body.innerHTML)"></iframe>
</body>
</html>

Сохранить с расширением .hta, вот и весь Ajax. )

laimas 25.03.2015 00:50

Это пример jsonp с поддержкой сервером:
<!DOCTYPE HTML> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function() {
    $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
        function(data){
          $.each(data.items, function(i,item){
            $("<img/>").attr("src", item.media.m).appendTo("#ims");
            if ( i == 4 ) return false;
          });
        });
});
</script>     
</head> 
<body>
<div id="ims">
</div>
</body>
</html>

рони 25.03.2015 00:52

laimas,
причину и решение расказал danik.js, ещё во 2 посте других решений видимо нет.

laimas 25.03.2015 01:01

То о чем говорил danik.js, было бы идеальным, но у автора нет сервера, но для того что он хочет ему эти проблемы и не мешают, если он только сам их не захочет. )

VVi3ard 26.03.2015 11:46

Вложений: 1
В итоге сделал часть скрипта на VBS (исходники гаджета прилагаю)

То чего хотел добился все работает четко.

Возникла новая проблема. хочу теперь выводить текст: из тега "technicalSummary" но он в json кодировке, не могу понять как силами VBS его перевести в обычный текст... (Напомню что я делаю гаджет для win7)

Вот функция на VBS
Function objXML_onreadystatechange()
    If (objXML.readyState = 4) Then
    	'msgbox objXML.statusText
		If (objXML.status = 200) Then
		  s = objXML.responseText
		  
		  StartUSD = InStr(1,s,"summaryLast")
		  USDS = Mid(s,StartUSD+14,6)	
		  StartTime = InStr(StartUSD,s,"time")
		  TimeS = Mid(s,StartTime+18,8)	
		  
		  StartText = InStr(1,s,"technicalSummary")+19
		  
		  EndText = InStr(StartText,s,"""")
		  
		  TextS = Mid(s,StartText,EndText-StartText)	
		  'ResText = json_decode(TextS)

		  
		  document.getElementById("summaryLast").innerHTML = USDS
		  document.getElementById("Time").innerHTML = TimeS
		else 
		  'msgbox objXML.statusText
		  document.getElementById("summaryLast").innerHTML = "" 'убираем индикатор загрузки
		End If
  End If
  
End Function


Нужно тарабарщину из TextS превратить в нормальный текст...

VVi3ard 26.03.2015 12:03

Может быть можно как то эту тарабарщину из VBS вывести в HTML и уже там как то при рендеренге страницы заменить на обычный текст с помощью json_decode.

laimas 26.03.2015 13:30

json_decode - это в чем?

JSON в разных средах http://json.org/, и увы в VBS нужно писать парсер, есть на git

PS. А подключить JS-библиотеку json2.js, и не париться?

VVi3ard 26.03.2015 14:14

Цитата:

PS. А подключить JS-библиотеку json2.js, и не париться?
Именно это и хочу, только не пойму как ее вызвать из VBS скрипта...

laimas 26.03.2015 14:34

JSON.parse(TextS)

После Mid() у вас должен быть валидный json.

VVi3ard 26.03.2015 14:50

Цитата:

Сообщение от laimas (Сообщение 363298)
JSON.parse(TextS)

После Mid() у вас должен быть валидный json.

Не работает в VBS нет объекта JSON.

Вот если бы можно было описать функцию на JS в HTML и потом вызвать ее из VBS...

jsnb 26.03.2015 14:52

Вообще под виндой можно данные получать через ActiveX используя WinHttpRequest

Цитата:

Сообщение от VVi3ard
Вот если бы можно было описать функцию на JS в HTML и потом вызвать ее из VBS...

Так вроде оно и должно вызываться.

laimas 26.03.2015 14:59

>Не работает в VBS нет объекта JSON.

Значит не подключен скрипт.

>Вот если бы можно было описать функцию на JS в HTML и потом вызвать ее из VBS...

А что вообще должен из себя представлять этот виджет?

VVi3ard 26.03.2015 15:00

Цитата:

Так вроде оно и должно вызываться.
Не получается :(
Я прикрепил исходник виджета можете попробовать сами.
(Нужно сменить расширение с ZIP на .gadget
или распаковать в папку: %USERPROFILE%\AppData\Local\Microsoft\Windows Sidebar\Gadgets

VVi3ard 26.03.2015 15:04

Цитата:

Сообщение от laimas (Сообщение 363309)
>Не работает в VBS нет объекта JSON.

Значит не подключен скрипт.

>Вот если бы можно было описать функцию на JS в HTML и потом вызвать ее из VBS...

А что вообще должен из себя представлять этот виджет?

Отображение курса $ форекс в реальном времени, все что я нашел отображает курс ЦБ РФ или обновляется раз в минуту.

Сам виджет работает и устраивает меня на 90% но хотелось бы теперь расширить его возможности добавив вывод остальной информации которую отдает сервис.

Эту ссылку я вытащил из кода HTML виджета (для браузера) там много всего лишнего да и не удобно постоянно в браузер смотреть.

Я понимаю что близок к разгадке но вот знаний не хватает, я java программист от веба и VBS далек...

Можете установить виджет себе и посмотреть как он работает...

VVi3ard 26.03.2015 15:05

Цитата:

Сообщение от laimas (Сообщение 363309)
>Не работает в VBS нет объекта JSON.

Значит не подключен скрипт.

>Вот если бы можно было описать функцию на JS в HTML и потом вызвать ее из VBS...

А что вообще должен из себя представлять этот виджет?

А что разве в VBS можно подключить скрипт?
Или его нужно подключить в HTML?

laimas 26.03.2015 15:11

У вас же исходник это html, вы же в нем подключаете и js свой. Ссылка на git, это не декодер, а кодер. Где-то на нем был и декодер, вернее конвертер json в xml, но что-то не нашел, уберите то, что из него взяли.

В html подключайте, например, отсюда http://ajax.cdnjs.com/ajax/libs/json...3/json2.min.js.

Но вот что интересно. Вы сами урезаете строку, а если сервер изменит структуру массива, ведь тогда ничего не получится. А зная что вам надо, может тогда проще рег. выражением получить, и зачем json?

PS. СБ РФ имеет сервисы, и там можно получить курсы валют в хml, может проще это использовать?

VVi3ard 26.03.2015 15:14

Ответ от сервера приходит в таком виде:

{"2186":{"row":{"last":"56,381","ma":"\u041a\u0443 \u043f\u0438\u0442\u044c","ma_class":"greenFont"," clock":"<span class=\"newSiteIconsSprite greenClockIcon\">&nbsp;<\/span>"},"arrowBoxClass":"upArrow","summaryLast":"5 6,381","summaryName":"USD\/RUB","summaryNameAlt":"USD\/RUB","summaryChange":"-1,037 (-1,81%)","summaryChangeClass":"redFont","technicalS ummary":"\u041a\u0443\u043f\u0438\u0442\u044c","te chnicalSummaryClass":"buy","maBuy":6,"maSell":6,"t iBuy":6,"tiSell":2},"time":"2015-03-26 08:30:06 GMT"}

Я выделяю: technicalSummary и получаю такой текст: \u041a\u0443\u043f\u0438\u0442\u044c
Задача превратить это в обычный текст.

Я попробую подключить http://ajax.cdnjs.com/ajax/libs/json...3/json2.min.js. и обратится к его методам из скрипта VBS.


Часовой пояс GMT +3, время: 03:11.