Programmierung > Delphi/Lazarus > FRITZ!Box

Telefonbuch als XML auslesen

Man kann das Telefonbuch im Web Interface als XML-Datei unter dem Namen "FRITZ.Box_Telefonbuch_dd.mm.yy_hhmm.xml" sichern. Dabei ist tt.mm.jj das Datum und hhmm die Uhrzeit zum Zeitpunkt der Abfrage. Oder man verwendet ein Programm.

Telefonbuch

Eigenschaften

Es steht folgende Eigenschaft zur Verfügung:

property Phonebook: IXMLDocument;

OUT Phonebook: Die Komponente gibt nur das Telefonbuch mit der ID 0 als XML Dokument zurück. Das XML Dokument sieht so ähnlich wie das nachfolgende aus, welche hier gekürzt ist. In der Delphi-Demo ist der Text jedoch nicht so schön übersichtlich wie bei der Lazarus-Demo dargestellt, sondern der Text von <phonebook> bis </phonebook> ist eine einzige Zeile.

<?xml version="1.0" encoding="iso-8859-1"?>
<phonebooks>
  <phonebook>
    <contact>
      <category>0</category>
      <person>
        <realName>1&1</realName>
        <imageURL/>
      </person>
      <telephony>
        <number type="work" vanity="" prio="1">07219600</number>
      </telephony>
      <services/>
      <setup/>
      <mod_time>1299834773</mod_time>
    </contact>
    <contact>
      <category/>
      <person>
        <realName>Auskunft 11833</realName>
      </person>
      <telephony>
        <number prio="1" type="work">11833</number>
      </telephony>
      <services/>
      <setup/>
    </contact>
    ...
  </phonebook>
</phonebooks>

Der Wert für Category gibt an, ob der Kontakt als wichtige Person gekennzeichnet ist. Der Type der Nummer gibt an, ob es sich um eine geschäftliche (work), private (home) oder mobile (mobile) Nummer handelt.

Anwendung

Nach der Anmeldung an der FRITZ!Box kann das Telefonbuch ausgelesen werden. Beispiel für die Anwendung der Eigenschaft

procedure TfrmMain.sbnPhonebookClick(Sender: TObject);
var
  aPhonebook : IXMLDocument;
  aContacts  : IXMLNodeList;
  aContact   : IXMLNode;
  aNumbers   : IXMLNodeList;
  aNumber    : IXMLNode;
  aHome      : String;
  aWork      : String;
  aMobile    : String;
  i, j       : Integer;
begin
  lvwPhonebook.Clear;
  {
  *  Das Telefonbuch holen.
  }
  aPhonebook := fFritzbox.Phonebook;
  if aPhonebook <> nil
  then begin
    {
    *  Das Telefonbuch einlesen.
    }
    aContacts := aPhonebook.ChildNodes['phonebooks'].ChildNodes['phonebook'].ChildNodes;
    {
    *  Kontakte durchgehen und eintragen.
    }
    if aContacts.Count > 0 then
    for i := 0 to aContacts.Count - 1
    do begin
      {
      *  Kontakt holen, neuen Eintrag in der Liste anlegen und Eigenschaften
      *  eintragen.
      }
      aContact := aContacts.Get(i);
      with lvwPhonebook.Items.Add
      do begin
        {
        *  Name der Person
        }
        Caption := aContact.ChildNodes['person'].ChildNodes['realName'].Text;
        {
        *  Strings initialisieren.
        }
        aHome   := '';
        aWork   := '';
        aMobile := '';
        {
         *  Nummernliste, max 3.
        }
        aNumbers := aContact.ChildNodes['telephony'].ChildNodes;
        for j := 0 to aNumbers.Count - 1
        do begin
          aNumber := aNumbers.Get(j);
          {
          *  Private Nummer - home.
          }
          if aNumber.Attributes['type'] = 'home'
          then aHome := aNumber.Text;
          {
          *  Geschäftliche Nummer - work.
          }
          if aNumber.Attributes['type'] = 'work'
          then aWork := aNumber.Text;
          {
          *  Mobile Nummer - mobile.
          }
          if aNumber.Attributes['type'] = 'mobile'
          then aMobile := aNumber.Text;
        end;
        {
        *  Nummern eintragen.
        }
        SubItems.Add(aHome);
        SubItems.Add(aWork);
        SubItems.Add(aMobile);
      end;
    end;
  end
  else begin
    if not(FFritzbox.IsLoggedIn)
    then begin
      ShowMessage('Sie sind zur Zeit nicht an der Fritzbox angemeldet.');
      PageControl1.ActivePage := tabLogIn;
    end;
  end;
end;

Die Komponente übergibt ein komplettes XML Dokument. Dieses kann dann wie in der Demo zerlegt werden. In der Demo werden die Daten in ein TListView eingetragen.

Anmerkung: Man könnte die Zerlegung des XML-Dokumentes auch in der Komponente vornehmen. Die Demo ist hier leider auch nicht korrekt, da jeder Type nicht nur einmal vorhanden darf.

Informationen

Nach einer Anmeldung an der Fritzbox kann das Telefonbuch als HTTP-Request mit Parametern abgerufen werden:

POST /cgi-bin/firmwarecfg HTTP/1.1
Host: fritz.box:80
Accept: text/xml
Keep-Alive: 115
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 310
 
---
Content-Disposition: form-data; name="sid"
 
aa93719773153822
---
Content-Disposition: form-data; name="PhonebookId"
 
0
---
Content-Disposition: form-data; name="PhonebookExportName"
 
Telefonbuch
---
Content-Disposition: form-data; name="PhonebookExport"
 

In diese Abfrage muss nur die aktuelle SessionID und die PhonebookID eingetragen werden. Für PhonebookExportName und PhonebookExport müssen anscheinend keine Werte eingetragen werden. Die Zeilen "---" dienen zur Abgrenzung der Inhalte.

Die Antwort sieht zum Beispiel vor xx.05.50 so aus:

HTTP/1.0 200 OK
Content-type: application/octet-stream;
Content-Disposition: attachment; filename="FRITZ.Box_Telefonbuch_dd.mm.yy_hhmm.xml"
 
<?xml version="1.0" encoding="iso-8859-1"?>
<phonebooks>
  <phonebook>...</phonebook>
</phonebooks>

Seit xx.05.50 sieht die Antwort ein wenig anders aus:

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_dd.mm.yy_hhmm.xml"
 
1000
<?xml version="1.0" encoding="utf-8"?>
<phonebooks>
...
<person><r
1000
ealName>
...
</cont
1000
act>
...
<uniqueid>14</un
d14
iqueid>
...
</phonebooks>
 
0

Allerdings nur wenn das Transfer-Encoding: chunked nicht berücksichtigt wird. Sonst würde die XML-Datei wie darüber aussehen.

Im HTTP-Header ist der Name des XML-Dokumentes angegeben. Er lautet genauso wie beim Download über das Web Interface.

Links

Fritzbox Monitor Komponente Delphi 2010 inkl. Source Code von oCent
Phonebook bei WeHaveMoreFun
BASH - Fritz!Box Telefonbuch auslesen
Firefox Add-On: Live HTTP Headers