Mac OSx export Adressbook/Adressbuch für AVM Fritzbox

ACHTUNG! Neue Version: http://www.web-dreamer.de/blog/2010/08/mac-adressbuch-fur-avm-fritzbox-version-2-os-x-ipyfritz.html

Für uns iPhone- und Mac-Jünger ist die Mac OS X Adressverwaltung wunderbar integriert. Leider fehlte mir bisher eine Möglichkeit zum abgleich des Adressbuchs mit der Fritzbox. Das folgende Programm schrieb ich, um dem abhilfe zu verschaffen.

Das Python-Script zum ausführen und
Download: iPyFritz

Der Aufruf erfolgt nach dem entpacken per Doppelklick oder im Terminal mithilfe folgenden Befehls:

Python iPyFritz.py
Dies erzeugt die Datei: myfritz.adressbuch.xml  – welche in der Fritzbox unter „Telefonbuch – Wiederherstellen“ eingespielt werden kann. VORSICHT – ALLE ALTEN EINTRÄGE WERDEN GELÖSCHT!!!

Für alle die ein paar Euro ausgeben möchten und können, könnte das hier interessanter sein: fritz.mac Suite. Wobei es in meinen Tests nicht die gleichen Ziele wie mein Adressbuch-exporter hat und die Fax-Anbindung an der 7370 zu abbrüchen führte…

Und hier das Coding / Thx a lot to programmish ); for releasing his snippet under public domain.

Update 11.04.2010
Nur Nickname-Fehler korrigiert

Mazo-Kategorie Update 17.04.2010
Das Script setzt das „Wichtig“-Flag für Personen die einen Nickname gepflegt haben im Adressbuch.

Update 23.04.2010
weitere Alternativen: Fakes Blog

Update 12.05.2010
Suche immer noch nach einer Möglichkeit per launchd (cron alternative) das Adressbuch automatisch zu syncen… Über einen Tipp würde ich mich sehr freuen.

Update 11.01.2017
Das Programm tut auch noch nach 7 Jahren seinen Dienst. *unglaublich – aber wahr*. Eine neuere Version mit Swift wäre für mich jetzt mal die nächste herrausforderung. Ich persönlich nutze mittlerweile die Google-Integration in der Fritzbox – auch wenn ich mir wünschen würde das die Einbindung eines beliebigen CalDav-Server – oder noch besser die Integration eines CalDav-Server in die Fritzbox super wäre.
 
 
Und wenn Ihnen Freie Software auch etwas Wert ist – Freue ich mich über eine Spende:

Beitrag veröffentlicht

in

, ,

von

Kommentare

38 Antworten zu „Mac OSx export Adressbook/Adressbuch für AVM Fritzbox“

  1. Avatar von Rudy
    Rudy

    Hat super geklappt, das Bier ist unterwegs !!!!

    1. Avatar von Johannes Rumpf
      Johannes Rumpf

      danke- ist angekommen.

  2. Avatar von Applestrudl
    Applestrudl

    Moin! Habe Kontakte mit mehreren 1000 VCards und Gruppen. Einge vCards sind mehreren Gruppen gleichzeitig zugeordnet. Kann man das Adressbuch Kontakte samt Gruppen exportieren auf anderen Mac so daß die Gruppen erhalten bleiben und es auch keine Dopplungen von vCards gibt, die mehr als einer Gruppe zugeordnet sind? Oder gibt es eine andere passende Software zur Verwaltung großer Adressenmengen für MAC

  3. Avatar von Joe

    Hallo Brian,
    eigentlich sollte das Adressbook per Standard auf jedem Mac installiert sein. Vielleicht hilft es die Entwicklungstools von der OSX CD zu installieren?

  4. Avatar von brian
    brian

    vielen dank für deine mühe,

    beim „Run“ in Python sagt er allerdings folgendes:

    >>>
    Traceback (most recent call last):
    File „/Users/brian/Downloads/iPyfritz 2.py“, line 33, in
    from AddressBook import *
    ImportError: No module named AddressBook
    >>> ================================ RESTART ================================
    >>>
    Traceback (most recent call last):
    File „/Users/brian/Downloads/iPyfritz 2.py“, line 33, in
    from AddressBook import *
    ImportError: No module named AddressBook
    >>>

    Was kann ich tun?

    Glg,
    Brian

  5. Avatar von Matthias
    Matthias

    Um den zusätzlichen Aufruf mittel Python einzusparen, füge man als erste Zeile ein:
    #!/usr/bin/python
    Danach muss das Skript nur noch ausführbar gemacht werden, sodass es sich auch per Mausklick starten lässt. Alternativ lässt es sich auch per Launch-Daemon einbinden, sodass bei jeder Änderung im Telefonbuch eine neue XML-Datei für die Fritzbox erzeugt wird.

    Zusätzlich habe ich die Zeile:
    self.create_phonebook(„Telefonbuch“)
    gegen :
    self.create_phonebook(os.getlogin().capitalize())
    ausgetauscht. Damit wird immer ein Telefonbuch mit dem passenden Namen des Benutzers geladen. Falls das Telefonbuch, in das geladen wird, einen anderen Namen hatte, wird dieser nun aktualisiert. Meine Frau und ich können nun getrennte Telefonbücher führen.

    1. Avatar von Thales

      Lars sagt:Hi!Habe folgendes Problem.Benutze die akulelte Snow Leopard Version und erhalte folgende Fehlermeldung.Irgendeine Idee was hier falsch laeuft?Vielen Dank im Voraus.Gruss,Lars Python iPyFritz.py Traceback most recent call last : File „iPyFritz.py“, line 125, in p_inhalt = doc.createTextNode name File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 1611, in createTextNode raise TypeError, „node contents must be a string“TypeError: node contents must be a string

  6. Avatar von Dennis

    Hallo, das script ist wirklich super, hätte aber auch gern das Format Vorname Nachname, wenn möglich ohne „,“.
    Irgendwie ist das aber nicht meine Welt, wäre super wenn du mir sagen könntest was dafür zu ändern ist.
    Fröhliche Weihnachten, Gruß Dennis

  7. Avatar von Zerosub

    Sehr cooles script !!

  8. Avatar von BoFax

    Hi Joe,

    vielen Dank für das Skript, leider klappt es bei mir nicht. Vorweg: ich habe ein recht großes Adressbuch mit aktuell 554 „Karten“. Beim Aufruf unter 10.6.5 bekomme ich die Fehlermeldung:
    cd ‚/Users/bofax/Downloads/‘ && ‚/usr/bin/pythonw‘ ‚/Users/bofax/Downloads/iPyfritz.py‘ && echo Exit status: $? && exit 1
    alexamac:~ bofax$ cd ‚/Users/bofax/Downloads/‘ && ‚/usr/bin/pythonw‘ ‚/Users/bofax/Downloads/iPyfritz.py‘ && echo Exit status: $? && exit 1
    Traceback (most recent call last):
    File „/Users/bofax/Downloads/iPyfritz.py“, line 343, in
    logger.debug(ipyfritz.xml_document.toprettyxml(“ „, „\n“, „UTF-8“))
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 57, in toprettyxml
    self.writexml(writer, „“, indent, newl, encoding)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 1749, in writexml
    node.writexml(writer, indent, addindent, newl)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 817, in writexml
    node.writexml(writer,indent+addindent,addindent,newl)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 817, in writexml
    node.writexml(writer,indent+addindent,addindent,newl)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 817, in writexml
    node.writexml(writer,indent+addindent,addindent,newl)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 817, in writexml
    node.writexml(writer,indent+addindent,addindent,newl)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 817, in writexml
    node.writexml(writer,indent+addindent,addindent,newl)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 1036, in writexml
    _write_data(writer, „%s%s%s“%(indent, self.data, newl))
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 303, in _write_data
    writer.write(data)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.py“, line 351, in write
    data, consumed = self.encode(object, self.errors)
    UnicodeDecodeError: ‚ascii‘ codec can’t decode byte 0xfc in position 14: ordinal not in range(128)

    Habe ich irgendein Sonderzeichen in irgendeiner Karte, das er nicht dekodieren kann? Wenn ja, wie bekomme ich raus, in welcher Karte das ist?

    Vielen Dank im voraus,

    BoFax

    1. Avatar von Joe

      Hi BoFax,
      das Problem liegt in der vorletzten Zeile des Scripts:
      logger.debug(ipyfritz.xml_document.toprettyxml(" ", "\n", "UTF-8"))

      Wenn Du diese einfach mit einer # Raute vorne auskommentierst – sollte das Script normal gehen:

      – eigentlich dient diese Zeile nur dazu – zu schauen – was in die Datei geschrieben wird, wenn man das Programm über das Terminal ausführt.

  9. Avatar von Joe

    Hi Stray*t, ist kein großes Problem – wenn Du es nicht selbst kannst. Schick mir einfach deine Mail-Adresse an meine Email im Impressum.

  10. Avatar von stray*t!
    stray*t!

    Hi Joe,

    dein Skript ist super, funktioniert bei mir einwandfrei. Leider habe ich keinerlei Ahnung von Programmierung. Daher meine dumme Laienhafte Frage: würde es für dich einen großen Aufwand bedeuten das Skript so umzuprogramieren, dass die Kontakte in der Form Vorname Nachname ausgegeben werden? Das wäre absolut klasse!

  11. Avatar von Joe

    Die nächste Version ist in Arbeit und kann zum testen hier:
    http://www.web-dreamer.de/blog/2010/08/mac-adressbuch-fur-avm-fritzbox-version-2-os-x-ipyfritz.html
    gefunden werden…

  12. Avatar von Wolf
    Wolf

    Hi Joe,

    der automatische Import ist recht simpel, wenn auf der FRITZ!Box ein SSH-Zugang existiert.
    Dann kann vom Script am Mac aus
    – der Export des Adressbuchs gemacht,
    – das Verschieben auf die FRITZ!Box vorgenommen, und
    – der Import per SSH-Befehl angestossen werden.

  13. Avatar von Joe

    Hi Wolf,
    sehr cool – werd ich mal auftesten.

  14. Avatar von Wolf
    Wolf

    Der automatische Export auf dem Mac kann man mit einem launchd-Script realisieren.
    Den Import auf der FRITZ!Box mit pbd, noch nicht automatisch, da der FRITZ!Box ein cron-like Automatismus fehlt, aber auch das lässt sich auf Umwege lösen.

    Eine kleine (!) Anleitung habe ich hier hinterlegt: http://know-how.posterous.com/aktualisierung-von-fritzbox-adressbuch-mit-os
    Und die Scripte dazu hier: http://know-how.posterous.com/fritzbox-adressbuch-scripts

  15. Avatar von Wolf
    Wolf

    > …würde ich wie mazo die Verwendung des “Friend”-Felds vorschlagen.
    hätte heissen sollen:
    > …würde ich selbst wie mazo es vorschlägt das “Friend”-Feld nutzen wollen.

    Ich meine also: Ich würde das Script für meine Fälle anpassen. Sicherlich ist das Spitzname-Feld für die meisten Anwender die bessere Wahl.

  16. Avatar von Wolf
    Wolf

    Hallo,

    VIELEN DANK!
    Das ist ein fantastisches Script. Tut genau was es soll! Perfekt!!

    Beim Import ist mir aufgefallen, dass auch Einträge ohne Telefonnummern erstellt werden. In meinem Adressbuch gibt es solche Einträge, also funktioniert das Script wie erwartet – auch wenn das in diesem Fall keinen Sinn macht.
    Wäre es aufwändig, eine Prüfung einzubauen die verhindert, dass Einträge ohne Telefonnummer überhaupt erstellt werden?

    Nachdem ich das „Spitzname“-Feld häufiger verwende, auch für Leute die eher ins Archiv gehören, würde ich wie mazo die Verwendung des „Friend“-Felds vorschlagen. Die Änderung am Python-Code ist ja trivial. Allerdings … finde ich das Feld „Friend“ oder „Freund“ nicht im Adressbuch…
    Auch wenns peinlich ist, aber welches Feld entspricht denn im Deutschen „kABFriendLabel“?

    Gedanken zu einem automatischen Sync:
    a) Man kann auf dem Mac per launchd automatisch einen Adressbuch-Export zu bestimmten Zeiten erstellen.
    b) Die resultierende Adressdatei könnte dann
    Weg 1) per SMB auf die Fritz!Box (USB-Stick/-Platte)
    oder
    Weg 2) per FTP/WebDAV auf eine Freigabe im Internet
    hinterlegt werden.
    c) Auf der Fritz!Box wird periodisch per cron-Script die Adressdatei
    Weg 1) ins entsprechende Unterverzeichnis verschoben
    Weg 2) heruntergeladen und ins entsprechende Unterverzeichnis verschoben

    Das würde voraussetzen, dass die Datei, die vom Python-Script erzeugt wird, schon dem Format entspricht, das beim Import auf der Fritz!Box generiert wird.
    Geht das?

    Oder gibt es shell-Befehle um das Adressbuch automatisch auf der Fritz!Box zu importieren?

  17. Avatar von Joe

    Hallo Stefan,
    soooo das hat jetzt zwei Fussballspiele zeit gekostet ;-)…
    Du musst die Zeile
    [cc lang=“python“]people = ab.people()[/cc]

    entweder durch Variante 1:
    [cc lang=“python“]### Variante 1 zum anzeigen der vorhandenen Gruppe – die letzte Gruppe wird exportiert
    groups = ab.groups()
    for group in groups:
    print group.valueForProperty_(kABUIDProperty),“:“, group.valueForProperty_(kABGroupNameProperty)
    ###[/cc]

    oder durch Variante 2:
    [cc lang=“python“]### Variante 2 Nach einer bestimmten Gruppe suchen und sofern nur eine Vorhanden ist – diese exportieren
    suchstring = „MeineGruppe“ # Es wird nach einem Substring gesucht
    grsuche = ABGroup.searchElementForProperty_label_key_value_comparison_(kABGroupNameProperty, None , None , suchstring, kABContainsSubStringCaseInsensitive)
    print grsuche
    groups = ab.recordsMatchingSearchElement_(grsuche)
    for group in groups:
    print group.valueForProperty_(kABUIDProperty),“:“, group.valueForProperty_(kABGroupNameProperty)
    #####[/cc]

    ersetzen und anschliessend folgende Zeile ergänzen:
    [cc lang=“python“]people = group.members()[/cc]

  18. Avatar von Thomas
    Thomas

    Vielen Dank für diese Script. Spart mir ne menge Arbeit und funktioniert perfekt!!

  19. Avatar von Joe

    Hi Stefan,

    Grundsätzlich „Ja“ – Ich gehe davon aus das in irgendeinem Attribut die Gruppe gespeichert ist. Dadurch sollte es möglich sein nur spezifische Gruppen zu exportieren.
    Mein Adressbuch ist nicht so groß – aber sobald ich Zeit finde schaue ich mal was ich rausfinde.
    Joe

  20. Avatar von Stefan Kremer

    Moin,

    gibt es eine Möglichkeit eine Untermenge des Adressbuchs über das Script zu exportieren? Beispielsweise eine bestimmte Adressbuch-Gruppe? Ich habe über 1000 Einträge im OS X Adressbuch und nicht alle brauche ich in der FritzBox, resp. könnte mehrere Submengen in verschiedene Telefonbücher packen (Verwandtschaft, Verein, Firma, …). Über launchd, resp. einem Helferlein namens Lingon habe ich auf apfeltalk.de einen Artikel veröffentlicht: http://www.apfeltalk.de/forum/lingon-gui-f-t98508.html Fragen können wir aber auch gerne bilateral klären.

    Gruß Stefan

  21. Avatar von thomas
    thomas

    ich habe die NSISOLatin2StringEncoding statt der Latin1 gesetzt. Zumindest klappt damit die konvertierung im script. das problem ist später das einspielen in die box die nur iso-8859-1 beherrscht.

  22. Avatar von Joe

    Hi thomas,
    ich sehe gerade im Coding sind noch einige Konvertierungen nach Ansi-ISO.
    zB.
    [cc lang=“python“]val.cStringUsingEncoding_(NSISOLatin1StringEncoding)[/cc]
    das wäre auch rauszunehmen.

    Grundsätzlich ist das Problem leider nicht so einfach – am einfachsten wäre es wenn du im Adressbuch die Konvertierung schon vorgenommen hättest – sozusagen in der Quelle. Oder alternativ können wir gern auch einen Request bei AVM starten mit der bitte um UTF8-Unterstützung.

  23. Avatar von thomas
    thomas

    nope, da kommt der gleiche kram bei raus. die schwierigkeit liegt eher im herauskonvertieren der zeichen aus dem adressbuch. welche kodierung müsste ich verwenden damit python die sonderzeichen „glättet“ dh aus einem ä ein a und aus einem Ä… ein a macht?

  24. Avatar von Joe

    Achso – wenn du mit Polnisch kodierst fliegen dir natürlich die Deutschen umlaute äüö raus – Ist leider nicht besser zu lösen – schöner wäre es, wenn die Fritzbox mit UTF8 umgehen könnte.

  25. Avatar von Joe

    Hi Thomas,
    Deutsch ist mit ISO-8859-1 kodiert – so wie es aussieht ist Polnisch mit ISO-8859-2 kodiert (http://alis.isoc.org/codage/iso8859/jeuxiso.de.htm).

    Versuch mal in der letzten Zeile des Scripts oben statt:
    [cc lang=“python“]doc.writexml(f, “, “, “ , ‚iso-8859-1‘)
    ->
    doc.writexml(f, “, “, “ , ‚iso-8859-2‘)[/cc]

    Das Problem könnte aber noch an 1-2 anderen Stellen aufschlagen – zB. in der Fritzbox die bei mir im Export das ‚iso-8859-1‘ explizit verlangt. MacosX und Python arbeiten beide mit UTF8 insofern könnte es klappen – poste mal das ergebnis…

  26. Avatar von thomas
    thomas

    Hi, ich habe das Problem dass polnische Sonderzeichen nicht richtig codiert werden. Statt einem Ł oder ą oder ś erscheint immer ein Å wenn ich die Datei importiere. Kann man was im script an den codiereinstellungen ändern und wenn ja, was? mir würde schon reichen wenn er aus einem Ł ein L und aus einem ą ein a macht. Danke & Gruß
    thomas

  27. Avatar von johannes
    johannes

    So – Wenn ein Nickname gepflegt ist bekommt der Eintrag das „Wichtig“-Flag. Was ich noch ganz nett fände wäre es Schnellwahl-Einträge zu pflegen – das wir jedoch schwierig.

    Zu der automatisierten übertragung an die Fritz.box – grundsätzlich kein Problem – nur muss man dann trotzdem irgendwo das Passwort hinterlegen.

  28. Avatar von Joe

    Hi Mazo,
    Danke das dir mein Skript gefällt – ich nehms mal als Anregung auf – und vielleicht habe ich demnächst mal Zeit. 🙂
    Joe

  29. Avatar von mazo
    mazo

    Irgendwie sind die Sachen in spitzen Klammern verloren gegangen.

    ich meinte wenn a “Friend” (kABFriendLabel) leer, dann (category)0(/category), wenn 1, dann (category)1(/category).

    Anstelle runder Klammern bitte spitze denken 😉

  30. Avatar von mazo
    mazo

    Hallo und vielen Dank für das tolle Skript.

    Ich kann leider gar kein Python. Aber äre es noch möglich die „wichtig“ Variable zu berücksichtigen? Das ist meine Hauptanwendung für das Fritztelefonbuch, dass Leute die als „wichtig“ markiert sind anders klingeln und eben durch die Klingelsperre kommen.

    Z. B. könnte man aus dem Adressbuch das Feld „Friend“ (kABFriendLabel) verwenden. Wenn dort nichts ist, dann 0, wenn dort 1 steht, dann 1.

    Die Krönung wäre noch, wenn sich das Skript ohne Interaktion auf die Fritzbox laden könnte. 😉

    Danke und Gruß,
    Marco

  31. Avatar von johannes
    johannes

    Ok, das mit Nick hat exakt diesen Fehler produziert – Ich habe das ZIP File aktualisiert – versuch noch mal mit der neuen Version… Viel Spass

  32. Avatar von Joe

    Hi,
    ja, ich denke ich ahne woran es liegt:
    Ich versuche den Nach- und Vornamen zu ermitteln und mit Komma zusammenzusetzen:
    [cc lang=“python“]name = pers.get(kABLastNameProperty.lower(),“) + ‚, ‚ + pers.get(kABFirstNameProperty.lower(),“)
    if name == ‚, ‚:
    name = pers.get(kABOrganizationProperty.lower())[/cc]

    Wenn das nicht klappt versuche ich es mit dem Organisations-Namen also Firmen-Namen.
    Das heisst Du hast da vermutlich einen Eintrag der keinen Vor- oder Nachnamen enthält. Oder vielleicht hast du auch einen Spitznamen verwendet ohne Vor und Nachnamen – jedenfalls ist die Variable „name“ leer und deswegen sagt er das es kein String ist.
    Auf die Entfernung würde ich darum bitten ein paar „print“ Befehle abzusetzen um den verqueren Adressbuch-Eintrag zu identifizieren. Im zweifel hilft ein
    if name != None:

    Joe

  33. Avatar von Lars
    Lars

    Hi!

    Habe folgendes Problem.

    Benutze die aktuelle Snow Leopard Version und erhalte folgende Fehlermeldung.

    Irgendeine Idee was hier falsch laeuft?

    Vielen Dank im Voraus.

    Gruss,

    Lars

    [cc lang=“bash“] Python iPyFritz.py
    Traceback (most recent call last):
    File „iPyFritz.py“, line 125, in
    p_inhalt = doc.createTextNode(name)
    File „/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py“, line 1611, in createTextNode
    raise TypeError, „node contents must be a string“
    TypeError: node contents must be a string[/cc]