Automatisch Liste aus JSON erstellen (Sipgate-Modul, Anruf-History)

Hallo Zusammen,

ich habe - dank IPS5.1 das SIPGATE-Modul.
Nun möchte ich gerne die Anrufliste, ausgegeben im JSON-Format irgendwie lesbar machen.
Die Liste wird als JSON ausgegeben, dabei sind die meisten Informationen unnütz, es geht mir nur um die Ein- bzw. Ausgehenden Nummern.

Diese hätte ich aber gerne in einer Liste, also ggf. ein String mit Zeilenumbruch oder wie auch immer.
So ungefähr:

+49 23456/12345
+49 25689/13456
+49...etc

Ich kann zwar Daten aus JSON rausnehmen und verwenden, aber die Daten „automatisch“ abzuarbeiten (also nicht für Pos. 1 eine Funktion schreiben, für Pos. 2 etc.) dafür bin ich nicht gut genug.
Kann jemand helfen?

Hier die JSON

 string(5268) "{"items":[{"id":"5005857723","source":"+4956FremdeNr789","target":"+49123meineNR4568","sourceAlias":"","targetAlias":"","type":"CALL","created":"2019-05-01T08:31:07Z","lastModified":"2019-05-01T08:32:17Z","direction":"INCOMING","incoming":true,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"p0","type":"PHONELINE"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005856697","source":"anonymous","target":"+4956FremdeNr789","sourceAlias":"VoIP-Telefon von Matthias Ginster","targetAlias":"","type":"CALL","created":"2019-04-30T16:50:20Z","lastModified":"2019-04-30T16:50:32Z","direction":"OUTGOING","incoming":false,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"e0","type":"REGISTER"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005856663","source":"anonymous","target":"+4956FremdeNr789","sourceAlias":"VoIP-Telefon von Matthias Ginster","targetAlias":"","type":"CALL","created":"2019-04-30T16:39:31Z","lastModified":"2019-04-30T16:40:46Z","direction":"OUTGOING","incoming":false,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"e0","type":"REGISTER"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005856657","source":"+4956FremdeNr789","target":"+49123meineNR4568","sourceAlias":"","targetAlias":"","type":"CALL","created":"2019-04-30T16:33:11Z","lastModified":"2019-04-30T16:38:16Z","direction":"INCOMING","incoming":true,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"p0","type":"PHONELINE"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005850991","source":"+4956FremdeNr789","target":"+49123meineNR4568","sourceAlias":"","targetAlias":"","type":"CALL","created":"2019-04-29T17:24:46Z","lastModified":"2019-04-29T17:25:42Z","direction":"INCOMING","incoming":true,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"p0","type":"PHONELINE"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005848089","source":"+4956FremdeNr789","target":"+49123meineNR4568","sourceAlias":"","targetAlias":"","type":"CALL","created":"2019-04-29T10:46:25Z","lastModified":"2019-04-29T10:53:17Z","direction":"INCOMING","incoming":true,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"p0","type":"PHONELINE"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005848022","source":"anonymous","target":"+4956FremdeNr789","sourceAlias":"VoIP-Telefon von Matthias Ginster","targetAlias":"","type":"CALL","created":"2019-04-29T10:46:02Z","lastModified":"2019-04-29T10:47:47Z","direction":"OUTGOING","incoming":false,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"e0","type":"REGISTER"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005847334","source":"+4956FremdeNr789","target":"+49123meineNR4568","sourceAlias":"","targetAlias":"","type":"CALL","created":"2019-04-29T09:41:02Z","lastModified":"2019-04-29T09:43:13Z","direction":"MISSED_INCOMING","incoming":true,"status":"NOPICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"p0","type":"PHONELINE"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005844615","source":"+4956FremdeNr789","target":"+49123meineNR4568","sourceAlias":"","targetAlias":"","type":"CALL","created":"2019-04-27T17:55:26Z","lastModified":"2019-04-27T17:55:42Z","direction":"INCOMING","incoming":true,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"p0","type":"PHONELINE"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""},{"id":"5005844585","source":"+4956FremdeNr789","target":"+49123meineNR4568","sourceAlias":"","targetAlias":"","type":"CALL","created":"2019-04-27T17:33:49Z","lastModified":"2019-04-27T17:34:36Z","direction":"INCOMING","incoming":true,"status":"PICKUP","connectionIds":["p0"],"read":false,"archived":false,"note":null,"endpoints":[{"type":"ROUTED","endpoint":{"extension":"p0","type":"PHONELINE"}}],"starred":false,"labels":[],"callId":"","recordingUrl":"","recordings":[],"duration":0,"responder":"","responderAlias":""}],"totalCount":43}"

Ich habe die eigene Rufnummer mit „+49123meineNR4568“ und alle anderen Nummern mit „+4956FremdeNr789“ geändert.
Dazu wäre es toll die „direction“ (INCOMING / INCOMING_MISSED / OUTGOING) dahinter zu schreiben.
Ziel ist es übrigens, dass das Ganze in IPS_View in einer Seite „Telefon“ auftaucht und ich irgendwie die MISSED raussuche oder markiere.

Gruß,
Matthias

Hallo,

welches Modul genau? Das IPSymconSipgate aus dem Modul-Store?

Wenn ja:

Es gibt dort ja eine Test-Funktion um sich die Anruf-Historie anzusehen.

Wenn Du den Link zur Dokumentation aufrufst, Landes Du dort GitHub - demel42/IPSymconSipgate: Interface zu sipgate Basic

Und da gibt es hier mit der Funktion ShowHistory()

Da ich aber aus deinem Post lesen, das Deine PHP-Kenntnisse eingeschränkt sind, habe ich das mal in ein Script umgeschrieben. gepackt. Du benötigst auf jeden Fall noch eine String-Variable vom Typ ~HTMLBox.


<?

$html = '';
$html .= '<style>' . PHP_EOL;
$html .= 'body { margin: 1; padding: 0; font-family: "Open Sans", sans-serif; font-size: 20px; }' . PHP_EOL;
$html .= 'table { border-collapse: collapse; border: 0px solid; margin: 0.5em;}' . PHP_EOL;
$html .= 'th, td { padding: 1; }' . PHP_EOL;
$html .= 'thead, tdata { text-align: left; }' . PHP_EOL;
$html .= '#spalte_zeitpunkt { width: 125px; }' . PHP_EOL;
$html .= '#spalte_quelle { width: 400px; }' . PHP_EOL;
$html .= '#spalte_ziel { width: 400px; }' . PHP_EOL;
$html .= '#spalte_dauer { width: 20px; }' . PHP_EOL;
$html .= '</style>' . PHP_EOL;

$cdata = Sipgate_GetHistory(15900 /*Sipgate-Instanz-ID*/);
$jdata = json_decode($cdata, true);
$b = false;
if ($jdata != '' && sizeof($jdata)) {

    $items = $jdata['items'];
    foreach ($items as $item) {
        $created = strtotime($item['created']);
        $direction = $item['direction'];
        $source = $item['source'];
        $target = $item['target'];

        $timestamp = $cdr['timestamp'];
        $duration = $cdr['duration'];
        $source = $cdr['source'];
        $target = $cdr['target'];

        $duration = isset($item['duration']) ? $item['duration'] : '';
        if ($duration == '') {
            $duration = '-';
        }

        $dt = date('d.m. H:i', $created);

        if (!$b) {
            $html .= '<table>' . PHP_EOL;
            $html .= '<colgroup><col id="spalte_zeitpunkt"></colgroup>' . PHP_EOL;
            $html .= '<colgroup><col id="spalte_quelle"></colgroup>' . PHP_EOL;
            $html .= '<colgroup><col id="spalte_ziel"></colgroup>' . PHP_EOL;
            $html .= '<colgroup><col id="spalte_dauer"></colgroup>' . PHP_EOL;
            $html .= '<colgroup></colgroup>' . PHP_EOL;
            $html .= '<thead>' . PHP_EOL;
            $html .= '<tr>' . PHP_EOL;
            $html .= '<th>Zeitpunkt</th>' . PHP_EOL;
            $html .= '<th>Anrufer</th>' . PHP_EOL;
            $html .= '<th>Ziel</th>' . PHP_EOL;
			            $html .= '<th>Dauer</th>' . PHP_EOL;
            $html .= '<th>&nbsp</th>' . PHP_EOL;
            $html .= '</tr>' . PHP_EOL;
            $html .= '</thead>' . PHP_EOL;
            $html .= '<tdata>' . PHP_EOL;
            $b = true;
        }

        $html .= '<tr>' . PHP_EOL;
        $html .= '<td>' . $dt . '</td>' . PHP_EOL;
        $html .= '<td>' . $source . '</td>' . PHP_EOL;
        $html .= '<td>' . $target . '</td>' . PHP_EOL;
        $html .= '<td>' . $duration . '</td>' . PHP_EOL;
        $html .= '</tr>' . PHP_EOL;
    }
    if ($b) {
        $html .= '</tdata>' . PHP_EOL;
        $html .= '</table>' . PHP_EOL;
    } else {
        $html .= '<center>keine Anrufe</center><br>' . PHP_EOL;
    }
}

SetValueString(13859 /* ID der HTML-Box/Variable */, $html);

Das ist aber ziemlich ungerüstet und muss von Dir angepasst und getestet werden.

Gruß
demel

Vielen Dank!

Ja die Funktion kenne ich, habe das auch mal ausgeführt und mit var_dump ausgegeben. Daher kam der JSON-String.
Ich kann prinzipiell PHP - auch nicht total kacke, aber halt nicht gut genug :wink:
Mit deinem Beispile komme ich aber zurande und kann dann auch was damit anstellen…
Ich versuche das noch was zu flicken, (z.t. sind die Ziel-Nummern die angerufenen) - aber das wird schon!
Vielen, Vielen Dank!

Wenn ich dann mal irgendwann fertig bin, dann werfe ich das fertige Skript hier rein…
Gruß,
Matthias