[Gelöst] Fritz!Box - Telefonbuch-Unterschiede

Pikachu

Aktives Mitglied
Mitglied seit
18 Nov 2006
Beiträge
2,397
Punkte für Reaktionen
28
Punkte
48
Ansonsten kenne ich ehrlich gesagt auch kein wget mit "multipart/form-data"-Support (das muß nichts heißen) und - woran es bei mir beim Senden von solchen Formularen per wget (Option post-file bzw. body-file)
Wie ich Lesen konnte wird "multipart/form-data" nicht direkt unterstützt wie bei anderen HTTP-Clienten auch.

Aber nur über einen kleinen Trick klappte es jetzt auch bei mir mit WGET unter Windows,
aber nur wenn man zuvor eine Datei Post-File.txt erstellt die so oder ähnlich hier:
Code:
---16263092.984375
Content-Disposition: form-data; name="sid"

31759cce28d35980
---16263092.984375
Content-Disposition: form-data; name="PhonebookId"

0
---16263092.984375
Content-Disposition: form-data; name="PhonebookExportName"

Telefonbuch
---16263092.984375
Content-Disposition: form-data; name="PhonebookExport"


---16263092.984375--
aussieht.

Dann sollte das hier:
Code:
wget --post-file="Post-File.txt" --header="HOST: fritz.box" --header="Content-Type: multipart/form-data; boundary=---16263092.984375" "http://fritz.box/cgi-bin/firmwarecfg" -O "Telefonbuch.xml"
gehen.

Die Datei Post-File.txt muss vor jedem WGET aufruf neu erstellt werden
da man immer eine Aktuelle SID benötigt da es sonst nicht klappt.

Auszug Java
Code:
    String postdata = "";
    String sRow = "---" + (12345 + Math.round( Math.random() * (16777216 - 12345) ));

    String sPhonebookId = "0"; // 255 = Intern // 256 = Clip Info // 0 = Haupttelefonbuch
    String sPhonebookExportName = "Telefonbuch"; // muss mindestens ein Zeichen enthalten ab ID 1

    postdata = sRow + "\r\n" + "Content-Disposition: form-data; name=" + "\"sid\"" + "\r\n" + "\r\n" + sRetSID + "\r\n";
    postdata += sRow + "\r\n" + "Content-Disposition: form-data; name=" + "\"PhonebookId\"" + "\r\n" + "\r\n" + sPhonebookId + "\r\n";
    postdata += sRow + "\r\n" + "Content-Disposition: form-data; name=" + "\"PhonebookExportName\"" + "\r\n" + "\r\n" + sPhonebookExportName + "\r\n";
    postdata += sRow + "\r\n" + "Content-Disposition: form-data; name=" + "\"PhonebookExport\"" + "\r\n" + "\r\n" + "\r\n" + sRow + "--" + "\r\n";
Post-File.txt = postdata

Code:
wget --post-file="Post-File.txt" --header="HOST: fritz.box" --header="Content-Type: multipart/form-data; boundary="+sRow "http://fritz.box/cgi-bin/firmwarecfg" -O "Telefonbuch.xml"
Mit Curl wäre es einfacher siehe Beispiel hier: Konfiguration der AVM FRITZ!Box 7390 per wget/curl Script sichern

fritzbox_phonebook_export.php
 
Zuletzt bearbeitet:

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,556
Punkte für Reaktionen
35
Punkte
48
Danke euch beiden.

Ich habe auch mal ein bisschen rumprobiert und komme auf die gleichen Ergebnisse von Pikachu ;-)

"Lustig" ist, dass man, wenn man
Code:
wget http://$IP/fon_num/fonbook_list.lua?sid=$SID -O telefonbuch.txt
($SID über die wehavemorefun-methode) aufruft die komplette HTML-Seite bekommt.

Mein Wireshark-Versuch lieferte mir, nach langem suchen in dem Log, dann auch:
Code:
Host: fritz.box
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://fritz.box/fon_num/fonbook_list.lua?sid=xxxxxx
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------319372419129353
Content-Length: 488

-----------------------------319372419129353
Content-Disposition: form-data; name="sid"

xxxxxxx
-----------------------------319372419129353
Content-Disposition: form-data; name="PhonebookId"

0
-----------------------------319372419129353
Content-Disposition: form-data; name="PhonebookExportName"

Telefonbuch
-----------------------------319372419129353
Content-Disposition: form-data; name="PhonebookExport"


-----------------------------319372419129353--
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-type: application/octet-stream;
Keep-Alive: timeout=60, max=300
Content-Disposition: attachment; filename="FRITZ.Box_Telefonbuch_09.01.15_1713.xml"

2000
<?xml version="1.0" encoding="utf-8"?>
.....
wenn ich das Telefonbuch über die Oberfläche gezogen habe.

Was ja zu den obigen Angaben passt.

Nochmals Danke.

(Jetzt bleibt nur noch die Frage offen, ob es mit den Zahlen, bei mir "319372419129353", bei Pikachu "16263092.984375", eine spezielle Bewandnis hat. Außer dem, als jeweilige 'Datengrenze' zu dienen)

__________________________________________

Edit:
Nach dem Ausführen bekomme ich:
Code:
...
<h2>FRITZ!Box Update</h2>
</div>
<div id="page_content" class="page_content">
<div class="formular">
<p>Das Update ist fehlgeschlagen:</p>
<p class="ErrorMsg">Invalid variable name.</p>
<p>Wiederholen Sie das Update oder starten Sie die FRITZ!Box neu.</p>
<h4>
<input type="radio" name="action" id="uiChooseUpdate" checked>
<label for="uiChooseUpdate">Update wiederholen</label>...
das ist dann wohl doch nicht ganz der richtige Befehlssatz.

Ach ja, das Script liefert folgende Ausgabe:
Code:
--2015-01-09 18:22:32--  http://fritz.box/cgi-bin/firmwarecfg
Auflösen des Hostnamen »fritz.box (fritz.box)«... 192.168.179.1
Verbindungsaufbau zu fritz.box (fritz.box)|192.168.179.1|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: nicht spezifiziert [text/html]
In »»Telefonbuch.txt«« speichern.

    [ <=>                                                                           ] 3.005       --.-K/s   in 0s

2015-01-09 18:22:32 (60,6 MB/s) - »»Telefonbuch.txt«« gespeichert [3005]
Ich habe "--post-file" durch "--post-data" ersetzt und schreibe den Teil nicht in eine Datei sondern eine Variable.
 
Zuletzt bearbeitet:

Pikachu

Aktives Mitglied
Mitglied seit
18 Nov 2006
Beiträge
2,397
Punkte für Reaktionen
28
Punkte
48
Ich habe "--post-file" durch "--post-data" ersetzt und schreibe den Teil nicht in eine Datei sondern eine Variable.
Dann bekomme ich das hier:
Code:
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.
Der Befehl "Content-Disposition:" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "47e53890680dba22" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "---16263092.984375" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "Content-Disposition:" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "0" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "---16263092.984375" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "Content-Disposition:" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "Telefonbuch" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "---16263092.984375" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "Content-Disposition:" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "---16263092.984375--" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "" --header="HOST:" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Vielleicht geht ja das hier:
PHP:
#!/bin/bash

# FritzBox credentials
_FBOX="http://192.168.178.1"
_USERNAME="Nutzername für Anmeldung an Web-Oberfläche"
_PASSWORD="Passwort des Nutzers"
_PhonebookId="0"
_PhonebookExportName="Telefonbuch"

# get challenge key from FB
_CHALLENGE=$(curl -s \
                  -k \
                  "${_FBOX}/login.lua" | \
              grep "^g_challenge" | \
              awk -F'"' '{ print $2 }')


# build md5 from challenge key and password
_MD5=$(echo -n \
            ${_CHALLENGE}"-"${_PASSWORD} | \
        iconv -f ISO8859-1 \
              -t UTF-16LE | \
        md5sum -b | \
        awk '{print substr($0,1,32)}')

# assemble challenge key and md5
_RESPONSE=${_CHALLENGE}"-"${_MD5}

# get sid for later use
_SID=$(curl -i \
            -s \
            -k \
            -d 'response='${_RESPONSE} \
            -d 'page=' \
            -d 'username='${_USERNAME} \
            ${_FBOX}/login.lua | \
        grep "Location:" | \
        awk -F'=' {' print $NF '})

# get configuration from FB and write to STDOUT
curl -s \
     -k \
     --form 'sid='${_SID} \
     --form 'PhonebookId='${_PhonebookId} \
     --form 'PhonebookExportName='${_PhonebookExportName} \
     --form 'PhonebookExport=' \
     ${_FBOX}/cgi-bin/firmwarecfg
 
Zuletzt bearbeitet:

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,556
Punkte für Reaktionen
35
Punkte
48
Danke

Jetzt bekomme ich genau das gleiche Ergebnis, wie es der Telefonbuchexport der F!B über die Oberfläche liefert.

nochmals:
Danke
 
Zuletzt bearbeitet:

olafdietsche

Neuer User
Mitglied seit
2 Dez 2018
Beiträge
1
Punkte für Reaktionen
1
Punkte
3
Vielleicht geht ja das hier:
PHP:
#!/bin/bash

# FritzBox credentials
_FBOX="http://192.168.178.1"
_USERNAME="Nutzername für Anmeldung an Web-Oberfläche"
_PASSWORD="Passwort des Nutzers"
_PhonebookId="0"
_PhonebookExportName="Telefonbuch"

# get challenge key from FB
_CHALLENGE=$(curl -s \
                  -k \
                  "${_FBOX}/login.lua" | \
              grep "^g_challenge" | \
              awk -F'"' '{ print $2 }')


# build md5 from challenge key and password
_MD5=$(echo -n \
            ${_CHALLENGE}"-"${_PASSWORD} | \
        iconv -f ISO8859-1 \
              -t UTF-16LE | \
        md5sum -b | \
        awk '{print substr($0,1,32)}')

# assemble challenge key and md5
_RESPONSE=${_CHALLENGE}"-"${_MD5}

# get sid for later use
_SID=$(curl -i \
            -s \
            -k \
            -d 'response='${_RESPONSE} \
            -d 'page=' \
            -d 'username='${_USERNAME} \
            ${_FBOX}/login.lua | \
        grep "Location:" | \
        awk -F'=' {' print $NF '})

# get configuration from FB and write to STDOUT
curl -s \
     -k \
     --form 'sid='${_SID} \
     --form 'PhonebookId='${_PhonebookId} \
     --form 'PhonebookExportName='${_PhonebookExportName} \
     --form 'PhonebookExport=' \
     ${_FBOX}/cgi-bin/firmwarecfg
Erst einmal danke für die ganze Vorarbeit!

Bei mir (7412) funktioniert dieses Skript leider nicht mehr.
Zum einen lautet die URL nicht "login.lua" sondern "index.lua", zum anderen sieht die Ermittlung der _CHALLENGE und _SID etwas anders aus:

PHP:
_CHALLENGE=$(curl -s -k "${_FBOX}/index.lua" | \
          awk -F'"' '/challenge/ { print $6; }')
_SID=$(curl -s -k \
          -d "response=${_RESPONSE}" -d 'lp=' -d "username=${_USERNAME}" \
          ${_FBOX}/index.lua | \
        grep -P -o "sid=[0-9a-f]+" | head -1 | cut -d= -f2)
Die Änderung habe ich nur unter Ubuntu 18.04 getestet. Aber ich denke, daß es auf jedem aktuellen Linux funktioniert.
 
  • Like
Reaktionen: koyaanisqatsi

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
11,589
Punkte für Reaktionen
218
Punkte
63
Moins


Nice ;)
Geht auch mit sh auf einem Raspberry Pi ( Raspbian ) und FRITZ!Box 7590 mit 7.01.


Tipp XML Formatierung/Lesbarkeit

Nimm xmllint, zum Beispiel so...
Code:
sh getfbpb.sh > pb.xml && xmllint --format pb.xml > fbfpb.xml
cat fbfpb.xml
 
Zuletzt bearbeitet:

Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
210
Punkte für Reaktionen
18
Punkte
18
Hallo,

Thread-Titel passt - Frage geht aber in eine andere Richtung: Unterschiede zwischen SOAP und LUA!

Wenn ich via LUA das das Telefonbuch herunterlade, dann bekomme ich:
Code:
<?xml version="1.0" encoding="utf-8"?>
<phonebooks>
    <phonebook name="Telefonbuch">
        <contact>
            <carddav_uid>23E9E9CA-06BF-43B5-A76C-68034848D8EF</carddav_uid>
            <telephony nid="1">
                <number id="0" type="work" prio="1">050xx97xxxx</number>
                <number id="1" type="fax_work">050xx97xxxx</number>
            </telephony>
            <services nid="1">
                <email id="0" classifier="work">[email protected]</email>
            </services>
            <person>
                <realName>Mietservice</realName>
            </person>
            <uniqueid>2093236</uniqueid>
        </contact>
        ...
Wenn ich mit SOAP das Telefonbuch herunterlade, dann bekomme ich:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<phonebooks>
    <!-- 1, id:0 , name:Telefonbuch -->
    <phonebook owner="0" name="Telefonbuch">
        <timestamp>1553310268</timestamp>
        <!-- number of contacts 458 -->
       ...
        <contact>
            <category>0</category>
            <person>
                <realName>Mietservice</realName>
            </person>
            <uniqueid>2093236</uniqueid>
            <telephony>
                <services>
                    <!-- emails:1-->
                    <email classifier="work">[email protected]</email>
                </services>
                <!-- numbers:2-->
                <number type="work" vanity="" prio="1">050xx97xxxx</number>
                <number type="fax_work" vanity="" prio="">050xx97xxxx</number>
                <!-- idx:0 -->
                <!-- ringtoneidx:nil -->
            </telephony>
        </contact>
        ...
Nun brauche ich aber sowohl den Wert aus <carddav_uid> (eigener Knoten vorab per Upload ins TB gebracht) als auch den Wert aus <timestamp>.

Weiß jemand, wie ich herauskitzeln kann, dass
a) bei der Abfrage via LUA der Wert <timestamp> mit im Download geliefert wird,
oder unwahrscheinlicher
b) bei Abfrage per SOAP eigene Knoten mit im Download geliefert werden?

Grüße

Black Senator
 

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,556
Punkte für Reaktionen
35
Punkte
48
Der Wert "<mod_time>1388945354</mod_time>" der nach "</telephony>" kommt, hilft dir nicht?
Code:
......
      </telephony>
      <services />
      <setup />
      <mod_time>1388945354</mod_time>
      <uniqueid>54</uniqueid>
    </contact>
 

Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
210
Punkte für Reaktionen
18
Punkte
18
Ne, das ist die jeweils letzte Änderung zu einem Kontakt - dann müsste ich das gesamte Telefonbuch parsen und den größten Wert aller Kontakte ermitteln - das ist nicht sexy
 

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,556
Punkte für Reaktionen
35
Punkte
48
Ist der Timestamp vom Generieren der SOAP-Antwort? Dann ist das doch die Systemzeit, und es gibt kein Problem, diese Zeit anders zu erzeugen.
 

Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
210
Punkte für Reaktionen
18
Punkte
18
Nein, es ist die letzte Änderung im Telefonbuch.
Im Gegensatz zur LUA-Abfrage kann bei der Abfrage via SOAP ja auch zusätzlich folgender Parameter mit angegeben werden:
timestamp.PNG
Ebenso ist er im SOAP-Output enthalten - aber ich bräuchte ihn auch in der Abfrage via LUA!
 

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,556
Punkte für Reaktionen
35
Punkte
48

Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
210
Punkte für Reaktionen
18
Punkte
18
Hallo,

hatte ich ja oben schon bewertet: "...dann müsste ich das gesamte Telefonbuch parsen und den größten Wert aller Kontakte ermitteln - das ist nicht sexy"
 

PeterPawn

IPPF-Urgestein
Mitglied seit
10 Mai 2006
Beiträge
12,154
Punkte für Reaktionen
749
Punkte
113
Im Gegensatz zur "Lua-Abfrage" wäre das Ergebnis über TR-064 sogar änderbar, weil dieses über eine Lua-Datei in /etc generiert wird (die heißt dann passenderweise auch noch "phonebook.lua").

Das, was Du hier als "Lua-Abfrage" ansiehst, ist aber in Wirklichkeit das Ergebnis eines CGI-Aufrufs, nämlich für "firmwarecfg" mit dem (entscheidenden) Parameter "PhonebookExport". "firmwarecfg" ruft dann intern wieder "pbd --exportbook <n>" auf, wobei "<n>" die Nummer des Telefonbuchs (255 für das interne) ist.

Ansonsten greift auch nur genau der Export des gesamten Telefonbuchs auf diesen "pbd"-Daemon zurück (ggf. noch der "telefon"-Daemon), der Rest arbeitet (afaik) mit "libphonebook.so" und "libphonebooklua.so".

Da wird aber die Datei aus "/var/flash/phonebook" wohl tatsächlich geparsed und anschließend erst zur Verfügung gestellt (damit auch nur mit den Attributen für einen Kontakt, die dem Code bekannt sind - da fallen eigene Zugaben dann raus) - das dürfte angesichts der Tatsache, daß bei der Speicherung in "/var/flash/phonebook" schon die XML-Deklaration am Beginn nicht stimmt:
Code:
<?xml
version="1.0" encoding="utf-8"><uniqueid>119</uniqueid><featureflags>9</featureflags><phonebook
name="Telefonbuch">
[...]
(der "<?xml"-Eintrag sollte auch mit "?>" enden) auch eine ziemlich gute Idee sein.

Schaut man sich nämlich die Ausgabe dieses "pbd --exportbook" an (das ist ja das interne Äquivalent zum Aufruf über "firmwarecfg", der hier als "Lua-Abfrage" gehandelt wird, obwohl beim Export auf diesem Weg gar kein Lua zum Einsatz kommt), ist das für das ausgewählte Telefonbuch praktisch 1:1 der Inhalt dieser "/var/flash/phonebook" - sogar mit derselben "Formatierung" (also den Zeilenumbrüchen an denselben Stellen). Daher dürfte auch die oben zu sehende "carddav_uid" ausschließlich aus einem solchen Import stammen ... bei einer "Verarbeitung" der Datei durch die Box (über "libphonebook*") kann man auf solche "Zusatzdaten" jedenfalls nicht mehr zugreifen.

Wenigstens lehnt der Import das Speichern eines "malformed"-Telefonbuchs ab ... aber auch dabei werden die Daten tatsächlich 1:1 in die "/var/flash/phonebook" geschrieben, wie man leicht testen kann, indem man die Zeilenumbrüche mal an anderer Stelle in die zu importierende Datei einbaut (nur zusätzliche Leerzeilen werden ignoriert).

Zwischenfazit:

Punkt (b) aus #27 kann man vergessen, da das Lua-Interface in der "libphonebooklua.so" diese Daten nicht aus dem Telefonbuch parsed - läßt sich leicht überprüfen, indem man sich die KV-Paare ansieht, die über das "libphonebooklua"-Interface für einen Eintrag abrufbar sind, auch wenn die Telefonbuch-Datei zusätzliche XML-Tags wie "carddav_uid" enthält.

Punkt (a) läßt sich meines Wissens aber (zumindest bis zur Labor 07.08) noch realisieren, weil das FRITZ!OS tatsächlich den Wert im Tag "mod_time" mit dem aktuellen Epoch-Wert aktualisiert, solange dieses Feld nur im importierten Telefonbuch (ebenso wie die "carddav_uid") enthalten war und eine passenden Wert (der kann auch 0 sein, wenn man ihn nicht genauer kennt) enthielt. Dann wird beim Ändern auch dieser Wert geschrieben und der sollte dann beim nächsten Export (über "firmwarecfg") auch wieder ausgegeben werden. Der Auszug aus der exportierten Datei in #27 enthält für den gezeigten "contact" dieses Feld wohl genau deshalb nicht, weil im Import auch kein "mod_time" enthalten war.

Da das exportierte Telefonbuch (egal ob über "pbd --exportbook" oder über "phonebook.lua", also über TR-064) ja wieder "well-formed XML" ist, kann man dann solche Fragen wie "Was ist der größte Wert für "mod_time" in dieser Datei?" mit einer XPath-Abfrage auch sehr einfach (und durchaus "elegant") erschlagen kann, sofern man die passende Engine dafür hat - vielleicht ist das ja eine Überlegung wert, wenn man auf der Suche nach der letzten Änderung in einem Telefonbuch ist. Ist vielleicht "nicht sexy", aber sollte ebenso funktionieren ...

Wobei über die "libphonebooklua.so" die einzelnen Kontakte gar kein eigenes "mod_time"-Attribut mehr haben ... offenbar wird von dieser Library (die ja auf der obersten Ebene auch erst mal eine Aufzählung der Telefonbücher bereitstellt) beim Parsen der Daten genau der Maximal-Wert dieser "mod_time" für alle im Buch enthaltenen Kontakte genommen und dem Telefonbuch als Attribut "modified" zugeordnet:
Code:
local tr064 = require ('tr064');
local function get_pbname_modified (pbid_)
local pb = require ('libphonebooklua');
local pbooks = pb.get_book_list ();
local modified = 0;
local pbname = "";
local pbid = tonumber (pbid_);
local i;
for i = 1, #pbooks, 1 do
box.out ("<!-- ", i, ", id:", pbooks[i].id, " , name:", tostring (pbooks[i].name), " -->\n");
if (pbid == tonumber (pbooks[i].id)) then
pbname = pbooks[i].name;
modified = tonumber (pbooks[i].modified);
break;
end
end
return pbname, modified;
end
 
Zuletzt bearbeitet:

Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
210
Punkte für Reaktionen
18
Punkte
18
mit einer XPath-Abfrage auch sehr einfach (und durchaus "elegant")
Okay - das klingt nach einem Plan! Auf die Idee bin ich noch gar nicht gekommen, obwohl ich das an anderer Stelle schon einsetze!

Danke

Balck Senator
 

Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
210
Punkte für Reaktionen
18
Punkte
18
alle Timestamp-Einträge zu durchrubbeln und den jüngsten verwenden
Moin,

ich komme erst jetzt dazu, das noch einmal wieder aufzugreifen, weil die aktuelle Basis erst jetzt die notwendigen Voraussetzung bereitstellt.

Leider ...
funktioniert das nicht, weil Telefonbücher >0 eine timestamp pro Kontakt haben (<mod_time>) aber gerade das erste Telefonbuch (0) nix dergleichen :/
Dabei wäre ein $lastupdate = $phonebook->xpath('max(//mod_time)') so eine feine Einzeilerlösung gewesen... GRRRRRRR

Irgendwo im ersten Telefonbuch muss man doch auch ohne SOAP-Download da dran kommen ...

fragt sich

Black Senator
 

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,556
Punkte für Reaktionen
35
Punkte
48
Interessant, ich habe hier eine Telefonbuch-XML, noch im 'Format', wie es die F!B liefert, bei dem es, wenn es nur ein Telefonbuch gibt, so aussah (die Datei ist aus dem Jahr 2017 ;-)
Code:
<phonebooks>
  <phonebook name="Telefonbuch">
    <contact>
      <category />
      <person>
        <realName>erster Name</realName>
      </person>
      <telephony nid="2">
        <number type="home" id="0" vanity="" prio="1">030123456789</number>
        <number type="mobile" id="1" vanity="" prio="1">0171123456789</number>
      </telephony>
      <services />
      <setup>
        <ringTone />
      </setup>
      <mod_time>1496811822</mod_time>
      <uniqueid>118</uniqueid>
    </contact>
.....
Das Telefonbuch ist per Hand über die Oberfläche der F!B 7430 ausgelesen.
 

Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
210
Punkte für Reaktionen
18
Punkte
18
Ist der jüngste Eintrag nicht die höchste <uniqeid> ?
Habe ich noch nicht überprüft. Die UID ist zumindest kein UNIX-Timestamp - allenfalls eine laufende Nummer (was nebenbei gesagt der Definition eine UID widerspricht: nicht unique!)
Wenn lfd. Nummer, dann findet man heraus welcher Kontakt der zuletzt angelegte ist, aber ich will wissen, wann die letzte Änderung im Telefonbuch erfolgte.
Beim Auslesen des TB mit SOAP bekommt man dies für das gesamte Telefonbuch im Tag <timestamp> geliefert. Wenn man das TB über "normalen" http-Request ausliest, dann ist der Tag im TB 0 (Telefonbuch) nicht enthalten. Ebensowenig wie <mod_time> pro Kontakt (siehe oben). Bei TB > 0 ist beim http-Request <mod_time> pro Kontakt vorhanden.
Ich verstehe nicht, warum das OS unterschiedliche XML-Strukturen (Knoten) pro Abfrageart und TB liefert.

Black Senator
 

3CX PBX - GRATIS
Linux / Win / Cloud

Statistik des Forums

Themen
232,863
Beiträge
2,027,488
Mitglieder
350,971
Neuestes Mitglied
Bieka2003