Adressbuchbilder über vCard importieren mittels Applescript?

J

jensmaehn

Aktives Mitglied
Thread Starter
Dabei seit
18.04.2006
Beiträge
216
Reaktionspunkte
6
Hallo Gemeinde,

könnte man Adressbuchbilder aktualisieren, wenn man die nötigen Info´s in einer vCard hat? Liesse sich das über AppleScript realisieren?

In der vCard von Xing ist jedem Kontakt auch ein Vermerk zum Benutzerbild als Http-Link beigefügt.

Leider kenne ich mich mit AppleScript nicht aus. Mag sich einer meinem Wunsch annehmen?

Danke im voraus.

So in etwa sieht die vCard aus, unwichtige Info´s hab ich mal entfernt ;-)
BEGIN:VCARD
VERSION:2.1
N;CHARSET=ISO-8859-1:xxx;Jens;;
FN;CHARSET=ISO-8859-1:Jens xxx
SORT-STRING:xxx
CLASS:pRIVATE
BDAY:1979-12-14
PHOTO;URI=http://www.xing.com/img/users/f/b/f/a94bb4d69.6332400.jpg
END:VCARD

Danke im voraus
 
Die Klasse person hat zwar die Property image, aber das ist ein TIFF, kein URL. Was du machen kannst: Bild herunterladen, in TIFF konvertieren und mit etwas in der Art von set image of person myperson to mytiffpic importieren.
 
Als kleinen Anreiz hab ich dir eine Funktion get_tiff geschrieben, die als Argument einen alias nimmt und dann die TIFF-Daten retourniert:

Code:
tell application "Address Book"
	set person 1's image to my get_tiff(choose file)
end tell

on get_tiff(myalias)
	set myimg to myalias
	set img to open for access myimg
	set tif to read img as TIFF picture
	close access img
	return tif
end get_tiff
 
Jedenfalls kann man das Bild schön per Drag&Drop aus dem Browser ins Adressbuch ziehen. Wenn man eh jeden Kontakt einzeln über VCF ins Adressbuch einfügt, kommt es auf diesen schnellen Vorgag auch nicht mehr an.

Thomas
 
Jedenfalls kann man das Bild schön per Drag&Drop aus dem Browser ins Adressbuch ziehen. Wenn man eh jeden Kontakt einzeln über VCF ins Adressbuch einfügt, kommt es auf diesen schnellen Vorgag auch nicht mehr an.

Thomas

Der oben im Post von mir angegebe Quellcode der vCard ist nur ein Auszug derselbigen. Der Xing-vCard Export beinhaltet alle Kontakte des Xing Adressbuches.
 
Ist das eine vCard mit vielen Kontakten? Oder (und das würds wesentlich leichter machen) ein Kontakt pro vCard?
 
Ups, hab dein letztes Post übersehen... dann änder ich meine Frage: Gibts eine Möglichkeit die Kontakte in separate Files zu tun? Dann erspart man sich nämlich das Parsen.
 
Okay, ich hab mal eine Lösung, aber die ist nicht ganz optimal, denn:

1. Das Script akzeptiert nur einen einzigen Kontakt pro VCF, sonst funktionierts nicht. Dafür kannst du dann aber mehrere VCFs auf einmal auf das Script ziehen.

2. Leider gibts ein Problem mit dem Adressbuch: Der User muss jeden VCF-Import per Dialog bestätigen. Das Script holt dann das Adressbuch in den Vordergrund und wartet, bis du OK geklickt hast.

3. Leider gibts noch ein Problem mit dem Adressbuch: Die Adressbuchanzeige aktualisiert sich erst, wenn man einmal den angezeigten Kontakt gewechselt hat.

So, hoffe du kannst mit den shortcomings leben. :)

Code:
on open (list_of_files)
	repeat with this_file in list_of_files
		my process_me(this_file)
	end repeat
end open

on run
	set myfile to choose file with prompt "VCard mit eingebettetem Bild-URL auswählen:" invisibles no
	my process_me(myfile)
end run

on process_me(myalias)
	set mycontent to my extract_text(myalias)
	set myurl to my extract_url(mycontent)
	set myfile to my download_pic(myurl)
	set mypic to my get_tiff(myfile)
	
	do shell script "rm " & (POSIX path of myfile)
	
	tell application "Address Book"
		set old_letzter to name of person -1
		
		activate
		open myalias
		repeat while name of person -1 is old_letzter
			delay 0.5
		end repeat
		-- müssen leider warten, bis der User auf OK klickt
		
		set image of person -1 to mypic
	end tell
end process_me

on download_pic(this_url)
	-- lädt eine Datei herunter und speichert sie als unsichtbares Temp-File
	-- Resultat: Alias zum Temp-File
	-- Tipp: Temp-File löschen nicht vergessen!
	
	set olddelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to {"."}
	set myfileending to last text item of this_url
	set myfilename to ".pictemp_" & (time of (current date)) & "." & myfileending
	set AppleScript's text item delimiters to olddelim
	
	do shell script "curl " & this_url & " > ~/" & myfilename
	
	alias ((path to home folder as text) & myfilename)
	return result
end download_pic

on extract_text(myalias)
	-- Gibt den Text aus einer Datei zurück
	
	set myvcf to myalias
	set this_file to open for access myvcf
	set this_text to read this_file as text
	close access this_file
	return this_text
end extract_text

on extract_url(mytext)
	-- Sucht nach einem Bild-URL in einem VCF-String
	
	repeat with mycurrentline in paragraphs of mytext
		if mycurrentline begins with "PHOTO;URI=" then
			set myline to text 11 thru -1 of mycurrentline
		end if
	end repeat
	return myline
end extract_url

on get_tiff(myalias)
	-- Gibt die TIFF-Daten aus einer Bilddatei zurück
	
	set myimg to myalias
	set img to open for access myimg
	set tif to read img as TIFF picture
	close access img
	return tif
end get_tiff
 
Ich überleg mir gerade, obs nicht schlauer wäre, mithilfe eines Texteditors alle Zeilen mit PHOTO;URI= in eine NOTE: umzuwandeln und anschließend zu importieren. Dann könnte das Script durch die Adressbuchkontakte iterieren und zu jedem in der Anmerkung gefundenen Bild-URL ein Bild ergänzen.
 
dann änder ich meine Frage: Gibts eine Möglichkeit die Kontakte in separate Files zu tun? Dann erspart man sich nämlich das Parsen.

Na klar kann man die vCards auch einzeln von jedem Kontakt runterladen, aber wäre es an der Stelle nicht einfacher, die große vCard zu benutzen um daraus vCards für jeden Kontakt zu machen?
 
Ich überleg mir gerade, obs nicht schlauer wäre, mithilfe eines Texteditors alle Zeilen mit PHOTO;URI= in eine NOTE: umzuwandeln und anschließend zu importieren. Dann könnte das Script durch die Adressbuchkontakte iterieren und zu jedem in der Anmerkung gefundenen Bild-URL ein Bild ergänzen.

Das hört sich auch gut an... Aber, in der vCard von XING wird auch eine NOTE definiert, diese Info könnte meiner Meinung nach entfallen.
 
Also es steht jedem frei, das Script nach seinen Wünschen anzupassen. Wenn man eine große Datei hat, muss man eben parsen, und das hat so seine Tücken, weil man eine Menge Eventualitäten abfangen muss.

In diesem Fall könnte man Zeile für Zeile durchs File iterieren, globale Variablen für Namen immer neu setzen und bei jedem URI= dann das Bild des aktuell gespeicherten Namens ersetzen. Dafür kann man ja die Subroutinen aus dem Skript wieder verwerten.
 
Okay, ich hab mal eine Lösung, aber die ist nicht ganz optimal, denn:

1. Das Script akzeptiert nur einen einzigen Kontakt pro VCF, sonst funktionierts nicht. Dafür kannst du dann aber mehrere VCFs auf einmal auf das Script ziehen.

2. Leider gibts ein Problem mit dem Adressbuch: Der User muss jeden VCF-Import per Dialog bestätigen. Das Script holt dann das Adressbuch in den Vordergrund und wartet, bis du OK geklickt hast.

3. Leider gibts noch ein Problem mit dem Adressbuch: Die Adressbuchanzeige aktualisiert sich erst, wenn man einmal den angezeigten Kontakt gewechselt hat.

So, hoffe du kannst mit den shortcomings leben. :)

Code:
on open (list_of_files)
	repeat with this_file in list_of_files
		my process_me(this_file)
	end repeat
end open

on run
	set myfile to choose file with prompt "VCard mit eingebettetem Bild-URL auswählen:" invisibles no
	my process_me(myfile)
end run

on process_me(myalias)
	set mycontent to my extract_text(myalias)
	set myurl to my extract_url(mycontent)
	set myfile to my download_pic(myurl)
	set mypic to my get_tiff(myfile)
	
	do shell script "rm " & (POSIX path of myfile)
	
	tell application "Address Book"
		set old_letzter to name of person -1
		
		activate
		open myalias
		repeat while name of person -1 is old_letzter
			delay 0.5
		end repeat
		-- müssen leider warten, bis der User auf OK klickt
		
		set image of person -1 to mypic
	end tell
end process_me

on download_pic(this_url)
	-- lädt eine Datei herunter und speichert sie als unsichtbares Temp-File
	-- Resultat: Alias zum Temp-File
	-- Tipp: Temp-File löschen nicht vergessen!
	
	set olddelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to {"."}
	set myfileending to last text item of this_url
	set myfilename to ".pictemp_" & (time of (current date)) & "." & myfileending
	set AppleScript's text item delimiters to olddelim
	
	do shell script "curl " & this_url & " > ~/" & myfilename
	
	alias ((path to home folder as text) & myfilename)
	return result
end download_pic

on extract_text(myalias)
	-- Gibt den Text aus einer Datei zurück
	
	set myvcf to myalias
	set this_file to open for access myvcf
	set this_text to read this_file as text
	close access this_file
	return this_text
end extract_text

on extract_url(mytext)
	-- Sucht nach einem Bild-URL in einem VCF-String
	
	repeat with mycurrentline in paragraphs of mytext
		if mycurrentline begins with "PHOTO;URI=" then
			set myline to text 11 thru -1 of mycurrentline
		end if
	end repeat
	return myline
end extract_url

on get_tiff(myalias)
	-- Gibt die TIFF-Daten aus einer Bilddatei zurück
	
	set myimg to myalias
	set img to open for access myimg
	set tif to read img as TIFF picture
	close access img
	return tif
end get_tiff

Ich werde dieses Skript mal ausprobieren und meine Erfahrungen berichten. Besten dank schon mal dafür :)
 
Okay, ich hab mal eine Lösung, aber die ist nicht ganz optimal, denn:

1. Das Script akzeptiert nur einen einzigen Kontakt pro VCF, sonst funktionierts nicht. Dafür kannst du dann aber mehrere VCFs auf einmal auf das Script ziehen.

2. Leider gibts ein Problem mit dem Adressbuch: Der User muss jeden VCF-Import per Dialog bestätigen. Das Script holt dann das Adressbuch in den Vordergrund und wartet, bis du OK geklickt hast.

3. Leider gibts noch ein Problem mit dem Adressbuch: Die Adressbuchanzeige aktualisiert sich erst, wenn man einmal den angezeigten Kontakt gewechselt hat.

So, hoffe du kannst mit den shortcomings leben. :)

Code:
on open (list_of_files)
	repeat with this_file in list_of_files
		my process_me(this_file)
	end repeat
end open

on run
	set myfile to choose file with prompt "VCard mit eingebettetem Bild-URL auswählen:" invisibles no
	my process_me(myfile)
end run

on process_me(myalias)
	set mycontent to my extract_text(myalias)
	set myurl to my extract_url(mycontent)
	set myfile to my download_pic(myurl)
	set mypic to my get_tiff(myfile)
	
	do shell script "rm " & (POSIX path of myfile)
	
	tell application "Address Book"
		set old_letzter to name of person -1
		
		activate
		open myalias
		repeat while name of person -1 is old_letzter
			delay 0.5
		end repeat
		-- müssen leider warten, bis der User auf OK klickt
		
		set image of person -1 to mypic
	end tell
end process_me

on download_pic(this_url)
	-- lädt eine Datei herunter und speichert sie als unsichtbares Temp-File
	-- Resultat: Alias zum Temp-File
	-- Tipp: Temp-File löschen nicht vergessen!
	
	set olddelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to {"."}
	set myfileending to last text item of this_url
	set myfilename to ".pictemp_" & (time of (current date)) & "." & myfileending
	set AppleScript's text item delimiters to olddelim
	
	do shell script "curl " & this_url & " > ~/" & myfilename
	
	alias ((path to home folder as text) & myfilename)
	return result
end download_pic

on extract_text(myalias)
	-- Gibt den Text aus einer Datei zurück
	
	set myvcf to myalias
	set this_file to open for access myvcf
	set this_text to read this_file as text
	close access this_file
	return this_text
end extract_text

on extract_url(mytext)
	-- Sucht nach einem Bild-URL in einem VCF-String
	
	repeat with mycurrentline in paragraphs of mytext
		if mycurrentline begins with "PHOTO;URI=" then
			set myline to text 11 thru -1 of mycurrentline
		end if
	end repeat
	return myline
end extract_url

on get_tiff(myalias)
	-- Gibt die TIFF-Daten aus einer Bilddatei zurück
	
	set myimg to myalias
	set img to open for access myimg
	set tif to read img as TIFF picture
	close access img
	return tif
end get_tiff

Hallo mekkablue,

habe dein Script ausprobiert, also im Scripteditor eingefügt, dann als Programm gespeichert.

Einzel-Kontakt-vCard bei Xing runtergeladen, vCard aufs Script-Programm gezogen, dann den Adressbuchimport bestätigt nur leider aktualisiert sich das Benutzerbild im Adressbuch bei mir nicht.:confused:
 
Das Problem hatte ich auch. Wechsel einmal zu einem anderen Kontakt und dann wieder zurück. Dann solltest du es sehen.
 
Das Problem hatte ich auch. Wechsel einmal zu einem anderen Kontakt und dann wieder zurück. Dann solltest du es sehen.

Nein, leider nicht. Habe es auch mit diversen anderen Kontakt-vCards ausprobiert. Hab auch schon das Adressbuch beendet und neu gestartet, aber dennoch kein Bild.
 
oder mag es an der Art liegen, wie der Kontakt im Adressbuch importiert wird?Ich hab "zusammenführen" ausgewählt
 
Ja. Dann gehts auf jeden Fall nicht mehr, denn dann geht der Import ins Leere. Oder besser gesagt: Irgend ein anderer Kontakt hat jetzt das Bild abbekommen. :)

Schau das funktioniert so: Jeder importierte Kontakt ist automatisch der Letzte ("last person" oder "person -1"). Das Script geht davon aus, dass du immer einen importierst und verpasst dann dem letzten Kontakt das Bild.

Die AS-Implementation vom Adressbuch ist leider nicht so toll, sonst würd ich ja vom Programm nach dem Import ein Kontaktobjekt bekommen, das ich dann direkt ansprechen kann. Aber das tut das Programm nicht, also muss das Script sozusagen "raten" und da nach einem gewöhnlichen Import der betroffene Kontakt immer der letzte ist, wählts den aus.

Sicherer wäre, das Textfile zu parsen, also den Namen aus der vCard rauszufiltern, aber da muss man etliche Eventualitäten abfangen (Encoding, Name nicht korrekt eingetragen, 2. Vorname, Titel etc.), je nachdem, was in deinen vCards eben so alles vorkommt.

Aber aus guten Gründen kenn ich deine vCards nicht, also solltest du das selbst probieren. AppleScript ist nicht schwer, es lohnt sich, da einbisschen reinzuschnuppern. Wenn du Troubles hast, kannst du dann spezifische Fragen im Forum stellen.
 
Zurück
Oben Unten