json file in file op server zetten met php

Status
Niet open voor verdere reacties.

backnext

Gebruiker
Lid geworden
29 apr 2016
Berichten
176
Ik wil een json file in een file op de server van mijn website zetten in een mapje zodat ik deze dan kan gebruiken in de website.
(bv: https://api.myjson.com/bins/n3ddj)
(Het gaat hier over een "weather underground" file die ik voor het gemak in myjson gestopt heb. )
Ik wil namelijk dat de pageviews beperkt blijven op weather underground.
Een php scriptje zou bv om het uur automatisch de .json file naar mijn eigen server moeten kunnen posten.
Dan kan ik die file aanspreken om verder mee te werken.
Zoals je merkt ben ik niet goed thuis in php, wel javascript maar aangezien dit op de server moet draaien kan ik niet verder.
 
@PHP4U, Ik ben beetje bij beetje aan het bijleren maar nog niet goed genoeg om het zonder stevige hulp te klaren.
Ik behandel de arrays wel in javascript maar eerst moet ik met php het json bestandje van de ene server naar de andere server (mapje in mijn website) verplaatsen. Bewerken hoeft hier niet.
Na wat verder zoeken, kwam ik hier op:
https://stackoverflow.com/questions/3938534/download-file-to-server-from-url
Dus heb ik een php file aangemaakt met daarin:
HTML:
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <?php
    file_put_contents("Tmpfile.json", fopen("https://api.myjson.com/bins/n3ddj", 'w+'));
    ?>
</body>
Dit online gezet in een testmapje. Zo wordt er een file "Tmpfile.json" gemaakt maar de file is leeg.

Ik werk wel nog met php 5.6 is dat een probleem?
 
Laatst bewerkt:
Ik zou als ik jouw was liever file_get_contents() gebruiken om je JSON op te halen i.p.v fopen()
 
Nu heb ik
HTML:
 file_put_contents("Tmpfile.json", file_get_contents('https://api.myjson.com/bins/n3ddj', true));
gebruikt.
Eerst lukte niks maar nadat ik op mijn server "alow_url_fopen" had aangezet deed hij het wel...
Ik denk dus dat ik hiermee voldoende heb.
Bedankt!
 
Top, hopelijk kom je zo verder!
 
Nu kom ik toch even terug...
Ik check nu dus de tijd van de "weather underground" file (json) op mijn server.
Als die ouder is dan een bepaalde tijd wordt hij met 'file_put_contents' "ververst"... een nieuwe versie wordt van weather underground gehaald en in een mapje gezet op de server.
Ik kan de vernieuwde json informatie bekijken maar niet gebruiken met mijn scripts op de website die het echter wel doen als ik de originele json file van weather underground gebruik.
Nochtans zijn de tabellen identiek.
In de webconsole zie ik echter:
Cross-Origin-aanvraag geblokkeerd: de Same Origin Policy staat het lezen van de externe bron op https://mijnsite/weerberichtswitch.php niet toe. (Reden: CORS-header ‘Access-Control-Allow-Origin’ ontbreekt).
hier vind ik heel wat informatie hierover maar ik zie niet goed hoe ik er aan moet beginnen. Een tip?
 
Je probeert zeker een JSON binnen te halen die niet van jouw domein afkomstig is?
Als dit je eigen domein is: Probeer eens een relatieve verwijzing i.p.v een absolute URL. Vooral met en zonder de www. subdomein kan dit problemen opleveren.
 
Ik heb je raad opgevolgd maar het wil maar niet lukken.
Na wat verder zoeken zag ik in de Headers van de Json: "Pragma no-cache". Als ik het goed begrijp is dit een soort bescherming om de file niet in de cache op te slaan?
Zou dit de reden kunnen zijn waarom ik dit niet op mijn server kan zetten en correct gebruiken?
 
Dit staat los van de cache.
Maar laat je relevant code eens zien van je JavaScript? Is het dezelfde URL, of haal je een JSON van een externe URL op?
 
Ik heb alles een beetje ingekort maar hier heb je het script:
Code:
$(document).ready(function () {
    var x = document.getElementById("demo");
    function showPosition() {
        $.ajax({
            type: "POST",
            url: "https://mijnwebsite/sp_uploader/weerbericht/weerberichtswitch.php",// als file ouder is dan een half uur wordt een nieuw weerbericht in map geplaatst.
        });	
        $.ajax({
             url: "../../sp_uploader/weerbericht/weerbericht.json",
            dataType: "jsonp",
            contentType: "application/javascript; charset=utf-8",
            success: function (parsed_json) {
                var location = parsed_json['current_observation']['display_location']['city'];
                var wind1 = parsed_json['current_observation']['wind_kph'];
                var temp_c1 = parsed_json['current_observation']['temp_c'];
                var temp_c = Math.round(temp_c1)
                var weatherImage = parsed_json['current_observation']['icon_url'];
                var weather = parsed_json['current_observation']['weather'];
              //...
                fillIn(location, temp_c, weatherImage, weather, wind, voorspelregen);

                var voorspellingenAlgemeen = parsed_json['forecast']['txt_forecast']['forecastday'];
                voorspellingen(voorspellingenAlgemeen);
            }
        });
    }
    function fillIn(location, temp_c, weatherImage, weather, wind, voorspelregen) {
        var temperatureNode = document.getElementById('temperature');
        var locationNode = document.getElementById('location');
        var voorspelregenNode = document.getElementById('voorspelregen');
        document.getElementById('weatherImage').src = weatherImage;
        document.getElementById('weather').innerHTML = weather;
        document.getElementById('wind').innerHTML = wind;
        temperatureNode.innerHTML = "Buiten is het nu " + temp_c + " graden";
        locationNode.innerHTML = "Het weer, op dit moment in " + location;
        voorspelregenNode.innerHTML = voorspelregen;
    }
  //...
    showPosition();
});

en het php- filetje zie je hier. Dit ververst de file (na activering) indien ouder dan een half uur.
HTML:
<head>
    <meta charset="utf-8" />
    <title>check modtime file</title>
</head>
<body>
    <?php
  
    $filename = "weerbericht.json";
    header('Content-type:application/javascript;charset=utf-8');
    if (file_exists($filename)) {
    $filemodtime = filemtime($filename);
    $thistime = time();
    }
    if ($thistime >= $filemodtime + (1800)) {// als file ouder is dan een half uur wordt een nieuw weerbericht in map geplaatst.
    file_put_contents("weerbericht.json", file_get_contents('https://api.wunderground.com/api/cf11c2f4c366c6f6/conditions/forecast/lang:NL/q/BE/Evergem.json', true));
  
    } else {

    }
    ?>
</body>
 
Als ik de gewone json file van weather underground gebruik waarmee alles wel werkt, zie ik in webconsole bij het bekijken van de json file eerst "jQuery15108576945080248625_1511897012663" staan. Maar iedere keer als ik de pagina refresh wordt dit een ander getal.
Dit komt echter niet voor in de json file die ik download.
Bij jsonp "request" moet blijkbaar een "callback" staan om te kunnen werken. Zou het hierdoor kunnen zijn dat de jsonfile op mijn server niet werkt?
Zo ja kan ik hier iets mee aanvangen of werkt die callback als een soort bescherming zodat we die file niet kunnen verder gebruiken?
hier heb ik wat info hierover gevonden.
 
Ja, inderdaad maar ondertussen heb ik dat aangepast met steeds hetzelfde resultaat. Volgens mij zit er ergens een bescherming op die json met callbacks of zo, zodat die niet kan gecached worden en meerdere keren gebruikt worden.
 
(Reden: CORS-header ‘Access-Control-Allow-Origin’ ontbreekt).

Dat gaf de error al aan. Heb je die header al toegevoegd?
 
Ja, daar kom ik telkens bij terecht in mijn zoektocht. Hoe en waar moet ik die invoegen?
 
Ik heb het systeem met de headers verlaten. Daar weet ik te weinig van.
Wat ik nu wel doe, is alle variabelen die van de oorspronkelijke json file komen en enkel diegene die ik nodig heb in een txt file zetten in een mapje op de server.
Ik check eerst en vooral het uur en datum van dat tekstbestandje op de server, vergelijk dit met de huidige tijd.
Indien dit tekstje ouder is dan bv een half uur, dan wordt de originele json file gebruikt zoals eerder beschreven.
Indien dit tekstje jonger is, dan wil ik het tekstje op dezelde manier gebruiken als die json file. Zo moet die laatste niet nog eens gedownload worden.
Nu is mijn vraag: Hoe moet ik dit doen met de txt file als onderstaande mijn methode is om de json file te verwerken?

Code:
$.ajax({
            url: "https://api.wunderground.com/api/sleutel/conditions/forecast/lang:NL/q/BE/Brussel.json",
          
            dataType: "jsonp",
            contentType: "application/javascript; charset=utf-8",
            headers: {
            },
            success: function (parsed_json) {
                       
                var location = parsed_json['current_observation']['display_location']['city'];
                var wind1 = parsed_json['current_observation']['wind_kph'];// windsnelheid
               
                if (wind1 < 1) {
                    wind = "Het is windstil";
                } else if (wind1 < 11) {
                    wind = "Er is een zwakke wind";
                } else if (wind1 < 28) {
                    wind = "Er is een matige wind";
                } else if (wind1 < 38) {
                    wind = "Er is een vrij krachtige wind";
                } else if (wind1 < 49) {
                    wind = "Er is een krachtige wind";
                } else if (wind1 < 61) {
                    wind = "Er is een harde wind";
                } else if (wind1 < 74) {
                    wind = "Er is een stormachtige wind";
                } else if (wind1 < 88) {
                    wind = "Het stormt";
                } else if (wind1 < 102) {
                    wind = "Er is een zware storm";
                } else if (wind1 < 117) {
                    wind = "Er is een zeer zware storm";
                } else {
                    wind = "Er is een orkaan";
                }

                var temp_c1 = parsed_json['current_observation']['temp_c'];
                var temp_c = Math.round(temp_c1)// afgerond
		var weatherImage = parsed_json['current_observation']['icon_url'];
                var weather = parsed_json['current_observation']['weather'];
                var voorspelregen1 = parsed_json['current_observation']['precip_today_metric'];
.........
            
                }
        
		    	fillIn(location, temp_c, weatherImage, weather, wind, voorspelregen);
             		var voorspellingenAlgemeen=parsed_json['forecast']['txt_forecast']['forecastday'];
                 
                voorspellingen(voorspellingenAlgemeen);	

                var voorspellingenKort = parsed_json['forecast']['simpleforecast']['forecastday'];
                voorspellingen2(voorspellingenKort);	
	    	}
	    });
en ook:
Code:
function fillIn(location, temp_c, weatherImage, weather, wind, voorspelregen){
        var temperatureNode = document.getElementById('temperature');
        var locationNode = document.getElementById('location');
        var voorspelregenNode = document.getElementById('voorspelregen');
		document.getElementById('weatherImage').src=weatherImage;
        document.getElementById('weather').innerHTML = weather;
        document.getElementById('wind').innerHTML = wind;
        temperatureNode.innerHTML = "Buiten is het nu " + temp_c + " graden";
        locationNode.innerHTML = "Het weer, op dit moment in " + location;
        voorspelregenNode.innerHTML = voorspelregen;
        var myJSON = JSON.stringify({ location, temp_c, weatherImage, weather, wind, voorspelregen }, null, 2);
        var xmlhttp;
        if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();
        }
        else {// code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            }
        }
        xmlhttp.open("POST", "../../sp_uploader/weerbericht/weerbericht_txt_vernieuwen.php", true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send("test=" + myJSON);
    }
de php is hiervoor:
PHP:
<?php

$filename = "weerbericht.txt";

$fh = fopen($filename, 'w') or die("can't open file");
		$stringData = $_POST["test"];
		fwrite($fh, $stringData);
		fclose($fh);
?>
 
en hier nog even een voorbeeld van de txt file die op de server staat nl. weerbericht.txt:
{
"location": "Brussel",
"temp_c": -1,
"weatherImage": "http://icons.wxug.com/i/c/k/nt_fog.gif",
"weather": "Mist",
"wind": "Er is een zwakke wind",
"voorspelregen": "Het heeft vandaag nog niet of heel weinig geregend"
}{
"forecast_A": "Zich laat ontwikkelende lichte regen. Minimaal -3 graden.",
 
Ik heb het systeem met de headers verlaten. Daar weet ik te weinig van.
Daarom link ik ook naar die website. Daar staat genoeg informatie op. :)

Maar, waar loop je nu op vast? Of werkt het nu prima?
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan