[Gelöst] Telefonbuch-Upload-Skript

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
2,186
Punkte für Reaktionen
96
Punkte
48
Export>Change>Import?
 
Warum sollte es nicht mehr funktionieren, das Telefonbuch per Upload-Request an "firmwarecfg" (muß halt "multipart/form-data" sein und daher geht "wget" nicht, aber jedes andere Programm, was das beherrscht (curl) oder mit dem man das emulieren kann (netcat), geht da eigentlich problemlos) in die Box zu bringen?

Ich weiß zwar nicht, wie sich das bei einer nicht vorhandenen Telefonbuch-ID verhält (ob es die anlegt, der Import scheitert oder einfach das Standard-TB überschrieben wird), aber das ist ja nun durch eigenen Test extrem schnell zu ermitteln - aus dem GUI heraus wird (iirc) immer das gerade ausgewählte TB durch den Import ersetzt, da kann es diesen Fall dann nicht geben.
 
Hallo Theo,

das Thema steht zwar auf gelöst - aber ich habe mich gefragt, was eigentlich deine Erwartung an ein Tool war/ist, bzw. was du eigentlich erreichen wolltest. Für den Upload von TB in die Box gibt es genug Lösungen im Netz, welche die API von AVM nutzen.

Da ich nur spekulieren kann schildere ich mal meine Situation (man würde sagen: meinen Kundenwunsch):
Ich/wir hatten ein TB auf der Fritzbox, Nummernlisten auf Handgeräten, Kontakte auf Smartphones, E-Mail-adressen in Mailingprogrammen bzw. E-Mails und ab und an versendete FAXe mit Fritz!FAX.
Mein Ziel war es Redundanzfreiheit, Konsistens und Datenqualität zu verbessern.

Wie habe ich es gelöst?
1. Fritz!Fon-Endgeräte, um keine separaten Nummernlisten wie in den alten Gigaset Geräten zu haben
2. Kontakte mit Adressen, Telefonummern und E-Mail-Adressen werden nur noch an einer Stelle in einem CardDAV-Server (bei uns iCloud) geführt und verwaltet. Alle Änderungen finden dort als führende Instanz statt.
3. Die E-Mail-Adressen (eigentlich alle Kontaktdaten) werden von dort z.B. Thunderbird mit dem AddOn CardBook zur Verfügung gestellt (synchronisiert). Hier kann man übrigens auch das Attribut Kategorieren anlegen, was sonst nirgends in der Apple-Welt möglich ist.
4. Einmal nachts (oder wenn man möchte öfters) werden per Script mit Kategorien ausgewählte Namen und Telefonnummern mit carddav2fb_XR als Telefonbuch in die Box hochgeladen.
5. Bei mir wird parallel noch eine dBase-Datei auf dem Speicher der Box abgelegt, in dem die FAX-Nummern für fax4box zu finden sind.

Damit ist mein Schmerz gelöst

Grüße

Black Senator
 
Zuletzt bearbeitet:
Black Senator

So ungefähr, nur dass ich die Daten in der F!B halte.
Meine Idee war aber, dass man, wenn es funktioniert, die Daten nicht über die Oberfläche der F!B anpasst, sondern über eien andere Weboberfläche.

Meine Datenbank ist (im Moment) eine SQLite-Datenbank.
Das gibt es noch? ;-)
 
Was soll denn die andere Weboberfläche funktional (besser) können?
Was spricht den dagegen, eine schon vorhandene Software für Adresspflege - also einen CardDAV-Server zu verwenden?
Ist der Output der gewünschten Anwendung schon im XML-Format der FB oder anders strukturiert?


Und dBase - ja, warum denn nicht? Läuft doch, und wenn AVM meint, dass deren alte Adressdatei bis heute Verwendung finden soll - warum nicht? Reicht ja aus - da muss man ja nicht mit einer riesigen relationalen DB auffahren nur um ein paar einfache sequenzielle Datensätze vorzuhalten
 
Ein CalDAV-Server für diesen Zweck wäre doch 'etwas' zu groß.


Und beim dBase meine ich nur, dass das doch schon recht alt ist.
Wenn es die Bedingungen erfüllt, ist es doch schön.
Das schreiben mit der mechanischen Schreibmaschine wird ja auch wieder hip :)
 
Hallo Theo,

ich habe mich in den letzten wochen ein wenig mit der SOAP-Schnittstelle der Fritz!Box beschäftigt.
Hast Du dir das einmal angesehen? Ich könnte mir vorstellen, dass Du mit der Nutzung dieser Schnittstelle eine etwas zeitgemäßere Lösung für die Anbindung der SQLite-DB und Fritz!Box realisieren könntest.

Ressourcen:
Die Bibliothek für meine eigenen Zwecke:
Code:
<?php


class SOApi

{

    private $ip;
    private $user;
    private $password;

   
    public function __construct($ip = 'fritz.box', $user = 'dslf_config', $password = false) {

        $this->ip       = $ip;
        $this->user     = $user;
        $this->password = $password;
    }

   
    public function getSOAPclient() {
   
            $client = new \SoapClient(
                null,
                array(
                    'location'   => "http://".$this->ip.":49000/upnp/control/x_contact",
                    'uri'        => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
                    'noroot'     => true,
                    'login'      => $this->user,
                    'password'   => $this->password,
                    'trace'      => true,
                    'exceptions' => true
                )
            );
        return $client;
    }

    /*
    GetPhonebook
    The following URL parameters are supported:
    Parameter name    Type          Remarks
    ---------------------------------------------------------------------------------------
    pbid              number        Phonebook ID
    max               number        maximum number of entries in call list, default 999
    sid               hex-string    Session ID for authentication
    timestamp         number        value from timestamp tag, to get the phonebook content
                                    only if last modification was made after this timestamp
    tr064sid          string        Session ID for authentication (obsolete)
    */
    public function getFBphonebook ($Phonebook = 0) {
   
        $client = $this->getSoapClient();
        $result = $client->GetPhonebook(new \SoapParam($Phonebook,"NewPhonebookID"));
        return simplexml_load_file($result['NewPhonebookURL']);
    }

   
    public function getFBphonebooklst () {       // delivers a string of phonebook ID (e.g. "0" or "0,1" or "0,1,2")
   
        $client = $this->getSoapClient();
        return $client->GetPhonebookList();
    }

   
    public function getFBDECThandsetlst () {       // delivers a string of DECT handset ID (e.g. "2,4,5")
   
        $client = $this->getSoapClient();
        return $client->GetDECTHandsetList();
    }
   
   
    public function getFBDECThandsetInfo ($DECTid) {       // delivers an array of DECT handset infos
   
        $client = $this->getSoapClient();
        return $client->GetDECTHandsetInfo(new \SoapParam($DECTid,"NewDectID"));
    }
   
   
}

?>

Für den Upload gibt es leider keine Funktion, um ein komplettes Telefonbuch hochzuladen. Jedoch gibt es die Funktion SetPhonebookEntry um einzelne Einträge (Kontakte) zu ändern oder neu anzulegen (PhonebookEntryID = BLANK). Wenn Du die ID der Einträge mit in deiner SQLite-DB hast, dann brauchts nur die entsprechenden Routinen, um eine saubere Synchronisation zu realisieren.

Grüße

BlackSenator
 
Zuletzt bearbeitet:
Hallo Theo,

seit Sommer gibt es u.a. ein AVM Update der TR-064 in x_contactSCPD (urn:X_AVM-DE_OnTel-com:serviceId:X_AVM-DE_OnTel1): nun auch mit der Möglichkeit eine TB-Eintrag zu ändern bzw. hinzuzufügen.

2018-06-05 30 New actions: GetPhonebookEntryUID, SetPhonebookEntryUID,
DeletePhonebookEntryUID
Added return codes tables.

Mein PHP-Coding als Beispiel einer Umsetzung findest Du hier.


MfG

Black Senator
 
Zuletzt bearbeitet von einem Moderator:
Wie starte ich das Script richtig ?

Ich nehme mal an php läuft auf dem Server? Deine Frage impliziert, dass du damit nicht so vertraut bist - richtig? Von daher kann ich nur raten wie weit ich ausholen muss (Genesis oder Neues Testament)

Ich helfe gern - aber frag mal genauer!
 
Zuletzt bearbeitet von einem Moderator:
Okay, jetzt wird‘s klarer.

Ich bin gar nicht so ein Linux Crack, dass ich jetzt aus dem Stehgreif die Befehle kenne - klingt aber gut.

Ich dachte schon es geht um: „wie starte ich ein Script mit PHP?“

Für einen Hintergrundjob ist das Script noch sehr draft - also error handling und Logging fehlt , damit man mitbekommt falls es abschmiert.
Mir ging es um die technische Machbarkeit und Austesten der SOAP-Schnittstelle über triviale get* Befehle hinaus.

Wenn Dir etwas auffällt, dann mach doch bitte Issues in GitHub auf.

Bin gespannt auf die Praxiserfahrungen

Black Senator


+++ Update +++

Ich habe ein paar kleinere Anpassungen vorgenommen und die Doku ergänzt.
Ich habe es jetzt im Hintergrund auf einem RasbPi (dauer-)laufen.
 
Zuletzt bearbeitet:
Hat jemand zufällig ne Ahnung, ab welcher FritzBox Firmware-Version die Bearbeitung von Einträgen über UIDs möglich ist? Geht das ab 7.0? Ich will meine Software anpassen, muss dazu aber natürlich wissen, ab welcher Firmware-Version ich die neuen Funktionalität nutzen kann. Für ältere Firmware-Versionen nutzt die Software dann vorerst weiterhin die alte Funktionalität ohne UID.
 
... die Nacht war noch jung?

Ich nehme an, Du meinst Du das Element/den Tag <uniqueid>?
Laut Änderungshistorie von x_contactSCPD.pdf ist das Element 2013 hinzugekommen:
2013-04-15 21 Phonebook XML content: new tag uniqueid
Müsste also so ungefähr im Paläogen der Firmware-Entwicklung zu verorten sein.
Die Frage - also: welche FW für welche Box gab´s vor April 2013 - würde ich aber in einem separaten Thread hier stellen.
Grob gesagt müsste der Wechsel von 5.* auf 6.* die Datenscheide sein.

Grüße und guten Morgen

Black Senator
 
Zuletzt bearbeitet:
Ich meinte die Actions GetPhonebookEntryUID, SetPhonebookEntryUID und DeletePhonebookEntryUID. Diese sind noch relativ neu. Als ich die Entwicklung im Sommer 2016 begann, gab es diese Funktionalitäten noch nicht. Es gab zwar eine uniqueid, aber sie hatte noch überhaupt keinen Nutzen. Laut Entwicklungshistorie sind diese drei Actions am 5.6.2018 hinzugekommen. Daher denke ich mal, zusammen mit der Einführung der Version 7.0 oder 6.98.

Tschö, Volker
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
244,695
Beiträge
2,216,692
Mitglieder
371,315
Neuestes Mitglied
jack-mack
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.