Programmierung > Delphi/Lazarus > FRITZ!Box

Anrufliste als CSV auslesen

Die aktuelle Anrufliste kann als CSV-Datei heruntergeladen werden. Sie hat den Namen "FRITZ!Box_Anrufliste.csv".

Anrufliste

Eigenschaften

Es steht folgende Eigenschaft zur Verfügung:

property FonCallsCSV: String;

OUT FonCallsCSV: Die Anrufliste wird als CSV-Dokument zurückgegeben. Diese kann so aussehen:

sep=;
Typ;Datum;Name;Rufnummer;Nebenstelle;Eigene Rufnummer;Dauer
 
1;25.10.11 19:48;Name aus Telefonbuch;0152xxxxxxxx;Telefon ;Internet: xxxxx;0:29
3;25.10.11 19:41;Name aus Telefonbuch;0152xxxxxxxx;Telefon ;Internet: xxxxx;0:01
...
sep=;
Typ;Datum;Name;Rufnummer;Nebenstelle;Eigene Rufnummer;Dauer
1;25.10.11 19:48;Name aus Telefonbuch;0152xxxxxxxx;Telefon ;Internet: xxxxx;0:29
4;25.10.11 19:41;Name aus Telefonbuch;0152xxxxxxxx;Telefon ;Internet: xxxxx;0:01
...

Vor Firmware 5.50 besaß die Datei einen Byte Order Mark (BOM).  bedeutet UTF8. Mit Firmware 5.50 entfiel der BOM weil die Codierung im HTTP-Header angegeben wird. In der ersten Zeile ist das verwendete Trennzeichen angegeben. Die zweite beschreibt die Felder in den dann folgenden Datensätzen. Die Datensätze sind im CSV im Gegensatz zum XML nicht indexiert. Der Type der Verbindung gibt an, ob es sich um einen eingehenden, unbeantworteten oder ausgehenden Anruf handelt. Mit Firmware 5.50 änderten sich die Werte von 1, 2 und 3 auf 1 (b001), 2 (b010) und 4 (b100). Datum und Uhrzeit geben den Beginn des Anrufes an. 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 für Firmware vor 5.50:

procedure TfrmMain.sbnCallListCSVClick(Sender: TObject);
var
  nDate     : Integer;
  nDuration : Integer;
  nName     : Integer;
  nNumber   : Integer;
  nType     : Integer;
  sData     : Array of String;
  sTmpA     : String;
  sTmpB     : String;
  nMax      : Integer;
  i         : Byte;
begin
  lvwFonCallsCSV.Clear;
  nDate     := -1;
  nDuration := -1;
  nName     := -1;
  nNumber   := -1;
  nType     := -1;
  nMax      := 0;
  {
  *  Das Telefonbuch holen.
  }
  fFonCallsCSV.Text := fFritzbox.FonCallsCSV;
  if fFonCallsCSV.Count > 0
  then begin
    lvwFonCallsCSV.Items.BeginUpdate;
    {
    *  Die Beschreibungen zuordnen.
    }
    i := 0;
    sTmpA := fFonCallsCSV.Strings[1];
    while Length(sTmpA) > 0
    do begin
      {
      *  Beschreibung lesen
      }
      if pos(';', sTmpA) > 0
      then begin
        sTmpB := LowerCase(Copy(sTmpA, 1, pos(';', sTmpA) - 1));
        Delete(sTmpA, 1, pos(';', sTmpA));
      end
      else begin
        sTmpB := LowerCase(sTmpA);
        sTmpA := '';
      end;
      {
      *  Variable zuordnem. Sollte eigentlich immer gleich sein.
      }
      if sTmpB = 'datum'     then nDate := i;
      if sTmpB = 'dauer'     then nDuration := i;
      if sTmpB = 'name'      then nName := i;
      if sTmpB = 'rufnummer' then nNumber := i;
      if sTmpB = 'typ'       then nType := i;
      {
      *  Maximale Anzahl Argumente
      }
      nMax := i;
      inc(i);
    end;
    {
    *  Die Anrufe durchgehen und eintragen.
    }
    if fFonCallsCSV.Count > 0 then
    for i := 2 to fFonCallsCSV.Count - 1
    do begin
      sTmpA := fFonCallsCSV.Strings[i];
      SetLength(sData, 0);
      {
      *  Datensatz zerlegen.
      }
      while Length(sTmpA) > 0
      do begin
        if pos(';', sTmpA) > 0
        then begin
          sTmpB := LowerCase(Copy(sTmpA, 1, pos(';', sTmpA) - 1));
          Delete(sTmpA, 1, pos(';', sTmpA));
        end
        else begin
          sTmpB := LowerCase(sTmpA);
          sTmpA := '';
        end;
        SetLength(sData, Length(sData) + 1);
        sData[Length(sData) - 1] := sTmpB;
      end;
      {
      *  Kontakt eintragen.
      }
      if Length(sData) = nMax + 1 then
      with lvwFonCallsCSV.Items.Add
      do begin
        if (nType >= 0) and (nType <= nMax)
        then Caption := sData[nType]
        else Caption := '';
        if (nDate >= 0) and (nDate <= nMax)
        then SubItems.Add(sData[nDate])
        else SubItems.Add('');
        if (nNumber >= 0) and (nNumber <= nMax) and (Length(sData[nNumber]) < 0)
        then SubItems.Add(sData[nNumber])
        else SubItems.Add('Unbekannt');
        if (nName >= 0) and (nName <= nMax)
        then SubItems.Add(sData[nName])
        else SubItems.Add('');
        if (nDuration >= 0) and (nDuration <= nMax)
        then SubItems.Add(sData[nDuration])
        else SubItems.Add('');
        if (nType >= 0) and (nType <= nMax)
        then ImageIndex := StrToInt(sData[nType]) - 1;
      end;
    end;
    lvwFonCallsCSV.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;

Informationen

Vor Firmware 5.50 verwendet die Komponente nach einer Anmeldung einen HTTP-Request:

POST /cgi-bin/webcm HTTP/1.1
Host: fritz.box:80
Accept: application/octet-stream
Keep-Alive: 115
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
 
getpage=../html/de/FRITZ!Box_Anrufliste.csv&sid=68de8862cc0c3b93

Diese Abfrage enthält die aktuelle SessionID.

Die Antwort sieht zum Beispiel so aus:

HTTP/1.0 200 OK
Content-type: application/octet-stream;
Content-Disposition: attachment; filename=FRITZ!Box_Anrufliste.csv
 
sep=;
Typ;Datum;Name;Rufnummer;Nebenstelle;Eigene Rufnummer;Dauer
 
1;25.10.11 19:48;Name aus Telefonbuch;0152xxxxxxxx;Telefon ;Internet: xxxxx;0:29
3;25.10.11 19:41;Name aus Telefonbuch;0152xxxxxxxx;Telefon ;Internet: xxxxx;0:01
...

Ab Firmware 5.50 verwendet die Komponente nach einer Anmeldung ein LUA-Script.

GET /fon_num/foncalls_list.lua?sid=334d6f405d8389e8&csv= HTTP/1.1
Host: fritz.box:80
Accept: text/html
Keep-Alive: 300
Connection: Keep-Alive
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/csv; charset=utf-8
Keep-Alive: timeout=60, max=300
Content-Disposition: attachment; filename=FRITZ!Box_Anrufliste.csv
 
f7c
sep=;
Typ;Datum;Name;Rufnummer;Nebenstelle;Eigene Rufnummer;Dauer
1;25.10.11 19:48;Name aus Telefonbuch;0152xxxxxxxx;Telefon ;Internet: xxxxx;0:29
4;25.10.11 19:41;Name aus Telefonbuch;0152xxxxxxxx;Telefon ;Internet: xxxxx;0:01
...
 
0
 

Die Datei wird je nach Größe in mehreren Blöcken übertragen. Die Größe der Blöcke kann variieren und vor oder hinter der Angabe der Größe des Blockes können Leerzeilen enthalten sein.

Links

AVM Wiki: Anrufliste von der Box holen
Firefox Add-On: Live HTTP Headers