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. Ich suche noch immer nach einer Möglichkeit, das Programm per automatischen job einzuplanen – Hilfe wäre mir hier sehr willkommen!?

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.

Und wenn Ihnen Freie Software auch etwas Wert ist – Freue ich mich über eine Spende:

Mac OSx export Adressbook/Adressbuch für AVM Fritzbox

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

  1. Applestrudl schreibt:

    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

  2. Joe schreibt:

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

  3. brian schreibt:

    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

  4. Matthias schreibt:

    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. 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

  5. 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

  6. 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. Joe schreibt:

      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.

  7. Joe schreibt:

    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.

  8. stray*t! schreibt:

    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!

  9. Wolf schreibt:

    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.

  10. Wolf schreibt:

    > …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.

  11. Wolf schreibt:

    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?

  12. Joe schreibt:

    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]

  13. Joe schreibt:

    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

  14. 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

  15. thomas schreibt:

    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.

  16. Joe schreibt:

    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.

  17. thomas schreibt:

    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?

  18. Joe schreibt:

    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.

  19. Joe schreibt:

    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…

  20. thomas schreibt:

    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

  21. johannes schreibt:

    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.

  22. Joe schreibt:

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

  23. mazo schreibt:

    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 😉

  24. mazo schreibt:

    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

  25. johannes schreibt:

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

  26. Joe schreibt:

    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

  27. Lars schreibt:

    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]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.