• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[GELOEST] Externe JSON abfragen und in Tabelle darstellen

Es gibt jedoch einen anderen Fehler: Der Variablenname bei $apiToken muss in geschweifte Klammern.
Ich habe auch das Einfügen der Parameter ergänzt und dann sieht es so aus:
Code:
                    neueEinsaetze.forEach(einsatz => {
                        const
                            apiToken = 'xxx',
                            datum = (new Date()).toLocaleDateString(),
                            ort = einsatz.ort,
                            adr = einsatz.adresse.default,
                            alarmzeit = einsatz.startzeit,
                            msgURL = `https://api.telegram.org/bot${apiToken}/sendMessage`,
                            msgText = `EINSATZ für ‍ ---   Datum:  ${datum}  Einsatzort: ${ort} Adresse: ${adr}  Anforderung durch: ??? ⏱️ Alarmierung um: ${alarmzeit}`,
                            params = {
                                'chat_id': 'xxx',
                                text: msgText
                            },
                            paramsObj = new URLSearchParams(params),
                            fetchURL = `${msgURL}?${paramsObj.toString()}`;
                        console.log(fetchURL);
                        // fetch(fetchURL)
                        //     .then(response => text())
                        //     .then(responseText => {
                        //         console.log(responseText);
                        //     });
                    });
Die Parameter müssen natürlich im PHP auch bereit gestellt werden:
Code:
foreach ($data['einsaetze'] as $einsatz) {
    $dtStr = makeLocalDateStr($einsatz['einsatz']['startzeit']);
    $id = $einsatz['einsatz']['num1'];
    $einsatzParams[] = [
        'id' => $id,
        'zeit' => makeLocalDateStr('now'),
        'ort' => $einsatz['einsatz']['einsatzort'],
        'adresse' => $einsatz['einsatz']['adresse'],
        'startzeit' => $dtStr,
    ];
    $art = $einsatz['einsatz']['einsatzart'];
    $K1 = $einsatz['einsatz']['einsatzart'];
Dann prüfe zunächst, ob die fetchURL OK ist und wenn ja, aktiviere das Senden mit fetch.
DANKE DANKE DANKE, er funktioniert jetzt SUPER nachrichten werden versendet ! LG Stefan
 
Werbung:
@Sempervivum

Habe ich habe gerade vesucht anpassungen durchzuführen aber es scheint so als hätte ich da was falsch gemacht kannst du es dir mal ansehen ?

Code:
neueEinsaetze.forEach(einsatz => {
                        const
                            apiToken = 'xx',
                            datum = (new Date()).toLocaleDateString(),
                            ort = einsatz.ort,
                            adr = einsatz.adresse.default,
                            alarmzeit = einsatz.startzeit,
                            fw = einsatz.feuerwehrenarray,
                            msgURL = `https://api.telegram.org/bot${apiToken}/sendMessage`,
                            msgText =
                            `EINSATZ für ${fw} 
                            Datum:  ${datum}
                            Einsatzort: ${ort}
                            Adresse: ${adr}
                            02547Alarmierung: ${alarmzeit}`,
                            params = {
                                'chat_id': '@xxx',
                                text: msgText
                            },
                            paramsObj = new URLSearchParams(params),
                            fetchURL = `${msgURL}?${paramsObj.toString()}`;
                        console.log(fetchURL);
                         fetch(fetchURL)
                             .then(response => text())
                             .then(responseText => {
                                console.log(responseText);
                             });                    });
                    einsatzParams = html.einsatzParams;
                });

Code:
foreach ($data['einsaetze'] as $einsatz) {
    $dtStr = makeLocalDateStr($einsatz['einsatz']['startzeit']);
    $id = $einsatz['einsatz']['num1'];
    $einsatzParams[] = [
        'id' => $id,
        'zeit' => makeLocalDateStr('now'),
        'ort' => $einsatz['einsatz']['einsatzort'],
        'adresse' => $einsatz['einsatz']['adresse'],
        'startzeit' => $dtStr,
        'fw' => $einsatz['einsatz']['feuerwehrenarray'],
    ];
    $art = $einsatz['einsatz']['einsatzart'];
    $K1 = $einsatz['einsatz']['einsatzart'];

Des weitern ist mir aufgefallen das beim Datum immer das selbe geschrieben wird und nicht die tatsächliche Alamierungszeit.

Code:
   "einsaetze": {
        "0": {
            "einsatz": {
                "num1": "E240803934",
                "einsatzort": "RO - Klaffer am Hochficht",
                "startzeit": "Fri, 23 Aug 2024 10:11:27 +0200",
                "inzeit": "",
                "status": "offen",
                "alarmstufe": "0",
                "einsatzart": "SELBST",
                "einsatztyp": {
                    "id": "SELBST",
                    "text": "Selbstst\u00e4ndiger Einsatz"
                },
                "einsatzsubtyp": {
                    "id": "TETRA-SELBST",
                    "text": "Einsatz od. Einsatz\u00fcbung"
                },
                "adresse": {
                    "default": "Klaffer am Hochficht",
                    "earea": "Klaffer am Hochficht",
                    "emun": "Klaffer am Hochficht",
                    "efeanme": "",
                    "estnum": "",
                    "ecompl": ""
                },
                "wgs84": {
                    "lng": "13.8824",
                    "lat": "48.6956"
                },
                "bezirk": {
                    "id": 9,
                    "text": "Rohrbach"
                },
                "feuerwehren": {
                    "409104": {
                        "feuerwehr": "Feuerwehr\/Florian Klaffer (44104)"
                    }
                },
                "feuerwehrenarray": {
                    "0": {
                        "fwnr": 409104,
                        "fwname": "Feuerwehr\/Florian Klaffer (44104)"
                    }
                },
                "cntfeuerwehren": 1
            }
        },
        "1": {
            "einsatz": {
                "num1": "E240803933",
                "einsatzort": "RO - Julbach",
                "startzeit": "Fri, 23 Aug 2024 10:07:14 +0200",
                "inzeit": "",
                "status": "offen",
                "alarmstufe": "0",
                "einsatzart": "SELBST",
                "einsatztyp": {
                    "id": "SELBST",
                    "text": "Selbstst\u00e4ndiger Einsatz"
                },
                "einsatzsubtyp": {
                    "id": "TETRA-SELBST",
                    "text": "Einsatz od. Einsatz\u00fcbung"
                },
                "adresse": {
                    "default": "Julbach",
                    "earea": "Julbach",
                    "emun": "Julbach",
                    "efeanme": "",
                    "estnum": "",
                    "ecompl": ""
                },
                "wgs84": {
                    "lng": "13.8713",
                    "lat": "48.6586"
                },
                "bezirk": {
                    "id": 9,
                    "text": "Rohrbach"
                },
                "feuerwehren": {
                    "409103": {
                        "feuerwehr": "Feuerwehr\/Florian Julbach (44103)"
                    }
                },
                "feuerwehrenarray": {
                    "0": {
                        "fwnr": 409103,
                        "fwname": "Feuerwehr\/Florian Julbach (44103)"
                    }
                },
                "cntfeuerwehren": 1
            }
        },

LG Stefan
 

Anhänge

  • Screenshot 2024-08-23 102842.png
    Screenshot 2024-08-23 102842.png
    16,2 KB · Aufrufe: 2
  • Screenshot 2024-08-23 102806.png
    Screenshot 2024-08-23 102806.png
    23,1 KB · Aufrufe: 2
Zuletzt bearbeitet:
Werbung:
... weiter handelt es sich dann um ein verschachteltes Objekt, wir müssen die Namen heraus holen und in einen String umwandeln:
Code:
fw = Object.values(einsatz.fw).map(fw => fw.fwname).join(', '),
 
Werbung:
Code:
                    neueEinsaetze.forEach(einsatz => {
                        const
                            apiToken = 'xxx',
                            datum = (new Date()).toLocaleDateString(),
                            ort = einsatz.ort,
                            adr = einsatz.adresse.default,
                            alarmzeit = einsatz.startzeit,
                            msgURL = `https://api.telegram.org/bot${apiToken}/sendMessage`,
                            …
                    });
Herzlichen Glückwunsch. Damit hast du das API-Token veröffentlicht und für jeden (egal ob mit guten oder schlechten Absichten) zugänglich/nutzbar gemacht. Solche Nachrichten dürfen nicht über den Browser verschickt werden, das muss über den Server laufen damit das Token eben nicht öffentlich ist (siehe auch z.B. c't 3003, gibt aber von der c't auch Artikel dazu) - CSRF-Token o.ä. dabei nicht vergessen.
 
Herzlichen Glückwunsch. Damit hast du das API-Token veröffentlicht und für jeden (egal ob mit guten oder schlechten Absichten) zugänglich/nutzbar gemacht. Solche Nachrichten dürfen nicht über den Browser verschickt werden, das muss über den Server laufen damit das Token eben nicht öffentlich ist (siehe auch z.B. c't 3003, gibt aber von der c't auch Artikel dazu) - CSRF-Token o.ä. dabei nicht vergessen.
DANKE für den Hinweis, habe es schon behoben !!
 
Werbung:
DANKE für den Hinweis, habe es schon behoben !!
Nein, hast du nicht: der Key darf überhaupt nicht im Javascript-Code auftauchen, der Code von Sempervivum ist Müll (nicht nur deswegen). Du hattest das irgendwo weiter oben schonmal richtig angedacht und den API-Aufruf im PHP-Code angedacht, Sempervivum hat ihn dann aber in den JS-Code geschrieben.
 
@Sempervivum

Habe ich habe gerade vesucht anpassungen durchzuführen aber es scheint so als hätte ich da was falsch gemacht kannst du es dir mal ansehen ?

Code:
neueEinsaetze.forEach(einsatz => {
                        const
                            apiToken = 'xx',
                            datum = (new Date()).toLocaleDateString(),
                            ort = einsatz.ort,
                            adr = einsatz.adresse.default,
                            alarmzeit = einsatz.startzeit,
                            fw = einsatz.feuerwehrenarray,
                            msgURL = `https://api.telegram.org/bot${apiToken}/sendMessage`,
                            msgText =
                            `EINSATZ für ${fw}
                            Datum:  ${datum}
                            Einsatzort: ${ort}
                            Adresse: ${adr}
                            02547Alarmierung: ${alarmzeit}`,
                            params = {
                                'chat_id': '@xxx',
                                text: msgText
                            },
                            paramsObj = new URLSearchParams(params),
                            fetchURL = `${msgURL}?${paramsObj.toString()}`;
                        console.log(fetchURL);
                         fetch(fetchURL)
                             .then(response => text())
                             .then(responseText => {
                                console.log(responseText);
                             });                    });
                    einsatzParams = html.einsatzParams;
                });

Code:
foreach ($data['einsaetze'] as $einsatz) {
    $dtStr = makeLocalDateStr($einsatz['einsatz']['startzeit']);
    $id = $einsatz['einsatz']['num1'];
    $einsatzParams[] = [
        'id' => $id,
        'zeit' => makeLocalDateStr('now'),
        'ort' => $einsatz['einsatz']['einsatzort'],
        'adresse' => $einsatz['einsatz']['adresse'],
        'startzeit' => $dtStr,
        'fw' => $einsatz['einsatz']['feuerwehrenarray'],
    ];
    $art = $einsatz['einsatz']['einsatzart'];
    $K1 = $einsatz['einsatz']['einsatzart'];

Des weitern ist mir aufgefallen das beim Datum immer das selbe geschrieben wird und nicht die tatsächliche Alamierungszeit.

Code:
   "einsaetze": {
        "0": {
            "einsatz": {
                "num1": "E240803934",
                "einsatzort": "RO - Klaffer am Hochficht",
                "startzeit": "Fri, 23 Aug 2024 10:11:27 +0200",
                "inzeit": "",
                "status": "offen",
                "alarmstufe": "0",
                "einsatzart": "SELBST",
                "einsatztyp": {
                    "id": "SELBST",
                    "text": "Selbstst\u00e4ndiger Einsatz"
                },
                "einsatzsubtyp": {
                    "id": "TETRA-SELBST",
                    "text": "Einsatz od. Einsatz\u00fcbung"
                },
                "adresse": {
                    "default": "Klaffer am Hochficht",
                    "earea": "Klaffer am Hochficht",
                    "emun": "Klaffer am Hochficht",
                    "efeanme": "",
                    "estnum": "",
                    "ecompl": ""
                },
                "wgs84": {
                    "lng": "13.8824",
                    "lat": "48.6956"
                },
                "bezirk": {
                    "id": 9,
                    "text": "Rohrbach"
                },
                "feuerwehren": {
                    "409104": {
                        "feuerwehr": "Feuerwehr\/Florian Klaffer (44104)"
                    }
                },
                "feuerwehrenarray": {
                    "0": {
                        "fwnr": 409104,
                        "fwname": "Feuerwehr\/Florian Klaffer (44104)"
                    }
                },
                "cntfeuerwehren": 1
            }
        },
        "1": {
            "einsatz": {
                "num1": "E240803933",
                "einsatzort": "RO - Julbach",
                "startzeit": "Fri, 23 Aug 2024 10:07:14 +0200",
                "inzeit": "",
                "status": "offen",
                "alarmstufe": "0",
                "einsatzart": "SELBST",
                "einsatztyp": {
                    "id": "SELBST",
                    "text": "Selbstst\u00e4ndiger Einsatz"
                },
                "einsatzsubtyp": {
                    "id": "TETRA-SELBST",
                    "text": "Einsatz od. Einsatz\u00fcbung"
                },
                "adresse": {
                    "default": "Julbach",
                    "earea": "Julbach",
                    "emun": "Julbach",
                    "efeanme": "",
                    "estnum": "",
                    "ecompl": ""
                },
                "wgs84": {
                    "lng": "13.8713",
                    "lat": "48.6586"
                },
                "bezirk": {
                    "id": 9,
                    "text": "Rohrbach"
                },
                "feuerwehren": {
                    "409103": {
                        "feuerwehr": "Feuerwehr\/Florian Julbach (44103)"
                    }
                },
                "feuerwehrenarray": {
                    "0": {
                        "fwnr": 409103,
                        "fwname": "Feuerwehr\/Florian Julbach (44103)"
                    }
                },
                "cntfeuerwehren": 1
            }
        },

LG Stefan
Hast du bezüglich dem Datum/Uhrzeit schon einen Fehler gefunden ?
Danke
LG Stefan
 
Ich nehme an, Du meinst Datum und Uhrzeit in der Nachricht über Telegram? Da ist es so, dass mir nicht ganz klar war, was dort eingetragen werden soll. Für das Datum oben habe ich das aktuelle genommen und für die Alarmzeit das was im JSON unter "startzeit" steht, Datum und Uhrzeit. Soll oben nur das Datum aus der startzeit stehen und unten nur die Uhrzeit?
 
Werbung:
Ich nehme an, Du meinst Datum und Uhrzeit in der Nachricht über Telegram? Da ist es so, dass mir nicht ganz klar war, was dort eingetragen werden soll. Für das Datum oben habe ich das aktuelle genommen und für die Alarmzeit das was im JSON unter "startzeit" steht, Datum und Uhrzeit. Soll oben nur das Datum aus der startzeit stehen und unten nur die Uhrzeit?
NEIN es geht um die Alarmierungszeit diese wird in der Anzeigt und in der Nachricht falsch dargestellt !!

DIe tatsächeliche Alamierungszeit von dem Einsatz in den Fotos ist
"startzeit": "Fri, 23 Aug 2024 19:37:11 +0200", und "startzeit": "Fri, 23 Aug 2024 19:37:27 +0200",
 

Anhänge

  • Screenshot 2024-08-23 194326.png
    Screenshot 2024-08-23 194326.png
    23,8 KB · Aufrufe: 3
  • Screenshot 2024-08-23 194404.png
    Screenshot 2024-08-23 194404.png
    14,7 KB · Aufrufe: 3
Verstehe, wenn es ein oder zwei Stunden Unterschied wären würde ich ein Problem mit Zeitzone und/oder Sommerzeit vermuten. Aber das ist ja ca. 1/2 Stunde. Muss ich mir genauer ansehen.
 
Fehler gefunden: Der Formatstring für die Minuten war falsch, mm, Kleinbuchstaben, ist richtig, MM, Großbuchstaben, liefert dagegen den Monat.
D. h. so ist die Funktion in hole_einsatzdaten richtig:
Code:
function makeLocalDateStr($dateStr)
{
    $dt = new DateTime($dateStr);
    $formatter = new IntlDateFormatter('de_DE', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
    // Wochentag in Kurzform:
    // $formatter->setPattern('E d.M.yyyy HH:mm');
    // Wochentag in Langform:
    $formatter->setPattern('cccc d.M.yyyy HH:mm');
    return $formatter->format($dt);
}
 
Werbung:
Wenn diese Übersicht so weit funktioniert, können wir uns ja dem Formular zuwenden. Ich habe meinen Vorschlag von früher dort eingebaut:
Code:
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Einsatzdaten</title>
    <style>
        body {
            font-family: Helvetica, Sans-Serif;
        }
    </style>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p"
        crossorigin="anonymous"></script>
    <style>
        .wrapper-einsatz-id {
            display: flex;
            align-items: center;
        }

        .prev-btn,
        .next-btn {
            padding: 0 5px;
        }
    </style>
</head>

<body>
    <form action="einsatzanlegen.php" method="post">
        <div class="form-group row">
            <label for="einsatz-id" class="col-sm-2 col-form-label">Einsatz-ID</label>
            <div class="col-sm-10 wrapper-einsatz-id">
                <div class="prev-btn">
                    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="8" height="16" viewBox="0 0 5 10">
                        <polygon fill="black" points="0,5 5,0 5,10" />
                    </svg>
                </div>
                <input type="text" class="form-control" id="einsatz-id" name="Einsatzort" placeholder="" value="">
                <div class="next-btn">
                    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="8" height="16" viewBox="0 0 5 10">
                        <polygon fill="black" points="0,0 5,5 0,10" />
                    </svg>
                </div>
            </div>
        </div>
        <div class="form-group row">
            <label for="Datum" class="col-sm-2 col-form-label">Datum</label>
            <div class="col-sm-10">
                <input type="date" class="form-control" id="Datum" name="Datum" placeholder="Datum" value="">
            </div>
        </div>
        <div class="form-group row">
            <label for="Einsatzort" class="col-sm-2 col-form-label">Einsatzort</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" id="Einsatzort" name="Einsatzort" placeholder="" value="">
            </div>
        </div>
        <div class="form-group row">
            <label for="Adresse" class="col-sm-2 col-form-label">Adresse</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" id="Adresse" name="Adresse" placeholder="" value="">
            </div>
        </div>

        <div class="form-group row">
            <label for="anforderung" class="col-sm-2 col-form-label">Anforderung durch</label>
            <div class="col-sm-10">
                <select class="form-control" id="Anforderung" name="Anforderung" value="">
                    <option></option>
                    <option value="POLIZEI">POLIZEI</option>
                    <option value="FEUERWEHR">FEUERWEHR</option>
                    <option value="EIGEN">EIGEN</option>
                    <option value="PRIVATPERSON">PRIVATPERSON</option>
                </select>
            </div>
        </div>
        <div class="form-group row">
            <label for="Alamierungszeit" class="col-sm-2 col-form-label">Alarmierungszeit</label>
            <div class="col-sm-10">
                <input type="datetime-local" class="form-control" id="Alarmierungszeit" name="Alarmierungszeit"
                    placeholder="" value="echo date('' d.m.Y', time());">
            </div>
        </div>
        <div class="form-group row">
            <label for="Einsatzende" class="col-sm-2 col-form-label">Einsatzende</label>
            <div class="col-sm-10">
                <input type="datetime-local" class="form-control" id="Einsatzende" name="Einsatzende" placeholder=""
                    value="echo date('' d.m.Y', time());">
            </div>
        </div>

        <div class="form-group">
            <label for="Bericht">Bericht</label>
            <textarea class="form-control" id="Bericht" name="Bericht" rows="10"></textarea>
        </div>


        <input type="submit" name="Einsatzanlegen" value="Einsatzanlegen">

    </form>
    <script>
        const
            url = 'hole-einsatzdaten-json.php';
        let idx = 0;
        let einsatzDaten;
        fetch(url)
            .then(response => response.json())
            .then(responseDaten => {
                einsatzDaten = Object.values(responseDaten.einsaetze);
                // einsatzDaten.sort((a, b) => {
                //     const
                //         aa = a.einsatz.num1.replace(/$E/, ''),
                //         bb = b.einsatz.num1.replace(/$E/, '');
                //     if (aa > bb) return 1;
                //     if (aa < bb) return -1;
                //     return 0;
                // });
                uebertrageDaten(0);
            });
        function makeTimeForInput(zeit, dateOnly) {
            let zeitStr = (new Date(zeit)).toISOString().replace(/:\d\d\.\d\d\dZ$/, '');
            if (dateOnly) {
                zeitStr = zeitStr.replace(/T\d\d:\d\d/, '');
            }
            return zeitStr;
        }
        function uebertrageDaten(offset) {
            const len = einsatzDaten.length;
            idx = (idx + offset + len) % len;
            console.log(idx);
            const
                einsatz = einsatzDaten[idx].einsatz,
                datum = makeTimeForInput(Date.now(), true),
                alarmzeit = makeTimeForInput(einsatz.startzeit),
                adresse = einsatz.adresse.default;
            document.getElementById('Einsatzort').value = einsatz.einsatzort;
            document.getElementById('Alarmierungszeit').value = alarmzeit;
            document.getElementById('Adresse').value = adresse;
            document.getElementById('einsatz-id').value = einsatz.num1;
            document.getElementById('Datum').value = datum;
        }
        window.addEventListener('click', event => {
            const div = event.target.closest('div');
            if (div.classList.contains('prev-btn')) {
                uebertrageDaten(-1);
            }
            if (div.classList.contains('next-btn')) {
                uebertrageDaten(+1);
            }

        });
    </script>
</body>

</html>
Teste es, ob es so ausreicht.
 
Weil das JSON wegen der SOP nicht direkt geladen werden konnte, musste ich ein Proxy in Form dieser PHP-Datei zu Hilfe nehmen:

hole-einsatzdaten-json.php
Code:
<?php

error_reporting(E_ALL);

$url = 'https://cf-einsaetze.ooelfv.at/webext2/rss/json_laufend.txt?t=' . time();

$curl = curl_init();
$headers = array();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
$json = curl_exec($curl);
curl_close($curl);
echo $json;
 
  • Angry
Reaktionen: msi
Weil das JSON wegen der SOP nicht direkt geladen werden konnte, musste ich ein Proxy in Form dieser PHP-Datei zu Hilfe nehmen:

hole-einsatzdaten-json.php
Code:
<?php

error_reporting(E_ALL);

$url = 'https://cf-einsaetze.ooelfv.at/webext2/rss/json_laufend.txt?t=' . time();

$curl = curl_init();
$headers = array();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
$json = curl_exec($curl);
curl_close($curl);
echo $json;
Hallo, danke

aber bei mir werden jetzt keine Einsätze mehr geladen !
 
  • Sad
Reaktionen: msi
Werbung:

Neueste Beiträge

Zurück
Oben