Programmierung > Delphi/Lazarus > FRITZ!Box

Anrufliste als XML auslesen (bis Klasse v0.16)

Aus dem Web Interface kann die aktuelle Anrufliste als CSV-Datei unter dem Namen "FRITZ!Box_Anrufliste.csv" gesichert werden. Man kann die Liste als CSV- oder XML-Dokument herunterladen. Damit die Liste aktuell ist, muss sie vorher aktualisert werden. Mit den Änderungen in Firmware xx.05.50 funktioniert die Vorgehensweise unten nicht mehr.

Anrufliste

Eigenschaften

Es steht folgende Eigenschaft zur Verfügung:

property FonCallsXML: IXMLDocument;

OUT FonCallsXML: Die Anrufliste wird als XML-Dokument zurückgegeben. Dieses sieht dann so aus:

<Foncalls>
  <Calls id="0">
    <Type>1</Type>
    <Date>25.10.11 19:48</Date>
    <Number>0152xxxxxxxx</Number>
    <Port>0</Port>
    <Duration>0:29</Duration>
    <Route>0</Route>
    <RouteType>1</RouteType>
    <Name><![CDATA[Name aus dem Telefonbuch]]></Name>
    <FonbookType>mobile</FonbookType>
    <PortName><![CDATA[Telefon ]]></PortName>
  </Calls>
  <Calls id="1">
    <Type>3</Type>
    <Date>25.10.11 19:41</Date>
    <Number>0152xxxxxxxx</Number>
    <Port>0</Port>
    <Duration>0:01</Duration>
    <Route>0</Route>
    <RouteType>1</RouteType>
    <Name><![CDATA[Name aus Telefonbuch]]></Name>
    <FonbookType>mobile</FonbookType>
    <PortName><![CDATA[Telefon ]]></PortName>
  </Calls>
</Foncalls>

Die Anrufe sind beginnend beim letzten Anruf durchnummeriert. Der Type der Verbindung gibt an, ob es sich um einen eingehenden (1), unbeantworteten (2) oder ausgehenden (3) Anruf handelt. Es wird das Datum und die Uhrzeit des Beginns des Anrufes angegeben. Die Länge (Duration) des Anrufes wird in Stunden und Minuten angegeben.

Anwendung

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

procedure TfrmMain.sbnCallListClick(Sender: TObject);
var
  aCalls : IXMLNodeList;
  aCall  : IXMLNode;
  i      : Integer;
begin
  lvwFonCalls.Clear;
  fFonCalls := nil;
  {
  *  Das Telefonbuch holen.
  }
  fFonCalls := fFritzbox.FonCallsXML;
  if fFonCalls <> nil
  then begin
    lvwFonCalls.Items.BeginUpdate;
    {
    *  Die Anrufliste holen
    }
    aCalls := fFonCalls.ChildNodes['Foncalls'].ChildNodes;
    {
    *  Die Anrufe durchgehen und eintragen.
    }
    if aCalls.Count > 0 then
    for i := 0 to aCalls.Count - 1
    do begin
      {
      *  Kontakt holen, neuen Eintrag in der Liste anlegen und Eigenschaften
      *  eintragen.
      }
      aCall := aCalls.Get(i);
      with lvwFonCalls.Items.Add
      do begin
        {
        *  Name der Person
        }
        Caption := aCall.ChildNodes['Type'].Text;
        SubItems.Add(aCall.ChildNodes['Date'].Text);
        if Length(aCall.ChildNodes['Number'].Text) > 0
        then SubItems.Add(aCall.ChildNodes['Number'].Text)
        else SubItems.Add('Unbekannt');
        SubItems.Add(aCall.ChildNodes['Name'].Text);
        SubItems.Add(aCall.ChildNodes['Duration'].Text);
        ImageIndex := StrToInt(aCall.ChildNodes['Type'].Text) - 1;
      end;
    end;
    lvwFonCalls.Items.EndUpdate;
  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 werden. In der Demo werden die Daten in ein TListView eingetragen.

Informationen

Nach einer Anmeldung an der Fritzbox kann die Anrufliste als HTTP-Request abgerufen werden:

POST /cgi-bin/webcm 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: 66
 
getpage=../html/de/home/foncallsdaten.xml&sid=68de8862cc0c3b93

Diese Abfrage enthält die aktuelle SessionID.

Die Antwort sieht zum Beispiel so aus:

HTTP/1.0 200 OK
Cache-Control: no-cache
Content-type: text/xml
Expires: -1
Pragma: no-cache
 

<Foncalls>
  ...
</Foncalls>

Am Anfang des XML-Dokumentes ist ein BOM angegeben. Weitere Angaben zur Codierung gibt es nicht.

Damit die Anrufliste aktuell ist, muss die Liste vor dem Auslesen aktualisiert werden. Dies kann man mit diesem Aufruf erreichen. Allerdings kann man anschließend die Anrufliste nicht zuverlässig auslesen, sodass die Komponente als Workaround die Sessiondaten ausliest.

POST /cgi-bin/webcm 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: 103
 
getpage=../html/de/menus/menu2.html
           &sid=68de8862cc0c3b93&var:menu=fon&var:pagename=foncalls

Die letzten beiden Zeilen sind nur eine Zeile und nur wegen ihrer Länge getrennt.

Links

iP-Symcon: Anruferliste aus FritzBox auslesen
IP-Phone-Forum: Anrufliste der FBF auslesen
Firefox Add-On: Live HTTP Headers