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.
Kommentare
38 Antworten zu „Mac OSx export Adressbook/Adressbuch für AVM Fritzbox“
Hat super geklappt, das Bier ist unterwegs !!!!
danke- ist angekommen.
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
ACHTUNG! Neue Version: http://www.web-dreamer.de/blog/2010/08/mac-adressbuch-fur-avm-fritzbox-version-2-os-x-ipyfritz.html
Hallo Brian,
eigentlich sollte das Adressbook per Standard auf jedem Mac installiert sein. Vielleicht hilft es die Entwicklungstools von der OSX CD zu installieren?
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
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.
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
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
Sehr cooles script !!
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
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.
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.
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!
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…
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.
Hi Wolf,
sehr cool – werd ich mal auftesten.
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
> …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.
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?
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]
hilft das beim identifizieren der Gruppen-Zuordnung:
http://developer.apple.com/mac/library/documentation/userexperience/conceptual/AddressBook/AddressBook.html ?
Vielen Dank für diese Script. Spart mir ne menge Arbeit und funktioniert perfekt!!
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
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
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.
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.
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?
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.
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…
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
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.
Hi Mazo,
Danke das dir mein Skript gefällt – ich nehms mal als Anregung auf – und vielleicht habe ich demnächst mal Zeit. 🙂
Joe
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 😉
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
Ok, das mit Nick hat exakt diesen Fehler produziert – Ich habe das ZIP File aktualisiert – versuch noch mal mit der neuen Version… Viel Spass
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
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]