Beiträge durchsuchen

Zoiper Kontakte per XML abrufen

Start Foren VoIP-Telefonie FreePBX / Asterisk Zoiper Kontakte per XML abrufen

Ansicht von 2 Beiträgen – 1 bis 2 (von insgesamt 2)
  • Autor
    Beiträge
  • #2634
    Eric ScheenEric Scheen
    Teilnehmer

      Hallo zusammen,

      ich bin hier gelandet aufgrund der Super Videoreihe zum Thema freepbx, welche mir geholfen hat ein paar Problemchen bei der Einrichtung zu lösen.
      Vielleicht kann ich ein bißchen was zurückgeben.

      Ein Problem war die Abfrage der Kontakte von Zoiper Pro über den Kontaktmanager – einen LDAP der aktuell noch im Netz läuft konnte ich recht einfach einbinden, wollte aber auch mal den internen Contact Manager testen.
      Im Netz war ad hoc nichts zu finden, aber immerhin ein Dokument wie das XML für Zoiper aussehen soll.
      Ich habe mich an der Lösung für die Yealink Telefone orientiert und eine passende Datei für den Zoiper gebastelt die passendes XML erzeugt.

      Einrichtung im Zoiper ist denkbar einfach – siehe Screenshot.

      Die .php stelle ich gerne noch zur Verfügung – wenn ich herausgefunden habe wie man eine Datei anhängen kann.

       

      VG

       

      #2635
      Eric ScheenEric Scheen
      Teilnehmer

        Hier der Link zum XML Format von Zoiper

        https://www.zoiper.com/documentation/XML%20Contact%20Service%20in%20Zoiper%205%20PRO.pdf

        und der Code der zoiper_dir.php
        (falls jemand den Code verbessern will / kann, einfach machen, ich bin nur Fernmelder mit Upgrade 😉 )

        <?php
        ini_set(‘display_errors’, 0);
        ini_set(‘log_errors’, 1);
        ini_set(‘error_log’, ‘/tmp/php-Zoiper.log’);
        error_reporting(E_ALL);

        header(“Content-Type: text/xml; charset=utf-8″);
        if (ob_get_level()) { ob_end_clean(); }

        // —- Helpers —-
        function x(?string $s): string {
        return htmlspecialchars($s ?? ”, ENT_XML1, ‘UTF-8’);
        }

        function mapTypes(string $typeRaw): array {
        static $map = [
        ‘internal’ => [‘Work’, ‘IPPhone’],
        ‘work’ => [‘Work’, ‘Phone’],
        ‘cell’ => [‘Work’, ‘Cell’],
        ‘home’ => [‘Home’, ‘Phone’],
        ];
        $key = strtolower(trim($typeRaw));
        return $map[$key] ?? [‘Work’, ‘Phone’];
        }

        // —- DB —-
        // Empfehlung: Zugangsdaten per ENV holen
        $host = getenv(‘DB_HOST’) ?: ‘localhost’;
        $user = getenv(‘DB_USER’) ?: ‘freedirectory’;
        $pass = getenv(‘DB_PASS’) ?: ‘1SehrSicheres!PassW0r7’;
        $db = getenv(‘DB_NAME’) ?: ‘asterisk’;

        $mysqli = new mysqli($host, $user, $pass, $db);
        if ($mysqli->connect_errno) {
        echo ‘<?xml version=”1.0″ encoding=”UTF-8″?><Contacts></Contacts>’;
        exit;
        }
        $mysqli->set_charset(“utf8mb4″);

        // —- Paging + Search —-
        $perPage = 100;
        $page = isset($_GET[‘page’]) ? max(1, (int)$_GET[‘page’]) : 1;
        $offset = ($page – 1) * $perPage;

        $search = isset($_GET[‘q’]) ? trim((string)$_GET[‘q’]) : ”;
        $like = ‘%’ . $search . ‘%’;

        // —- Query: Kontakte + Nummern in einem Rutsch —-
        // (LEFT JOIN, damit Kontakte ohne Nummern nicht verschwinden, wenn du das willst)
        $sql = ”
        SELECT
        e.id, e.displayname, e.fname, e.lname, e.title, e.company,
        n.number, n.extension, n.type
        FROM contactmanager_group_entries e
        LEFT JOIN contactmanager_entry_numbers n ON n.entryid = e.id
        ” . ($search !== ” ? “WHERE e.displayname LIKE ? ” : “”) . ”
        ORDER BY e.displayname, e.id
        LIMIT ?, ?
        “;

        $stmt = $mysqli->prepare($sql);
        if (!$stmt) {
        echo ‘<?xml version=”1.0″ encoding=”UTF-8″?><Contacts></Contacts>’;
        exit;
        }

        if ($search !== ”) {
        $stmt->bind_param(“sii”, $like, $offset, $perPage);
        } else {
        $stmt->bind_param(“ii”, $offset, $perPage);
        }

        $stmt->execute();
        $res = $stmt->get_result();

        // —- XML Output —-
        echo ‘<?xml version=”1.0″ encoding=”UTF-8″?>’;
        echo ‘<Contacts>’;

        $lastId = null;
        $opened = false;

        while ($r = $res->fetch_assoc()) {
        $contactId = (int)$r[‘id’];

        // Neuer Contact-Block?
        if ($lastId !== $contactId) {
        if ($opened) {
        echo ‘</Contact>’;
        }
        $opened = true;
        $lastId = $contactId;

        echo ‘<Contact id=”‘ . $contactId . ‘”>’;
        echo ‘<Name>’;
        echo ‘<First>’ . x($r[‘fname’]) . ‘</First>’;
        echo ‘<Middle>’ . x($r[‘lname’]) . ‘</Middle>’;
        echo ‘<Last>’ . x($r[‘title’]) . ‘</Last>’;
        echo ‘<Display>’ . x($r[‘displayname’]) . ‘</Display>’;
        echo ‘</Name>’;
        echo ‘<Info>’;
        echo ‘<Company>’ . x($r[‘company’]) . ‘</Company>’;
        echo ‘</Info>’;
        }

        // Nummer vorhanden?
        if (!empty($r[‘number’])) {
        $rawNumber = (string)$r[‘number’];
        $ext = (string)($r[‘extension’] ?? ”);
        $combined = ($ext !== ”) ? ($rawNumber . $ext) : $rawNumber;

        [$type1, $type2] = mapTypes((string)($r[‘type’] ?? ”));

        echo ‘<Phone>’;
        echo ‘<Type>’ . x($type1) . ‘</Type>’;
        echo ‘<Type>’ . x($type2) . ‘</Type>’;
        echo ‘<Phone>’ . x($combined) . ‘</Phone>’;
        echo ‘</Phone>’;
        }
        }

        if ($opened) {
        echo ‘</Contact>’;
        }

        echo ‘</Contacts>’;

        $stmt->close();
        $mysqli->close();
        exit;

      Ansicht von 2 Beiträgen – 1 bis 2 (von insgesamt 2)
      • Du musst angemeldet sein, um auf dieses Thema antworten zu können.