Kontakteverwaltung: Perfektionistisch bis zwanghaft

Ich gebe zu, bei meiner Kontaktverwaltung bin ich durchaus perfektionistisch bis zwanghaft. Jahre lang habe ich Outlook dafür herangezogen und war auch mit der Synchronisation mit meinen ersten mobilen Endgeräten sehr zufrieden. Mit dem Umstieg auf Android bin ich dann schweren Herzens auch mit meinen Kontakten zu Google Contacts umgezogen. Mit welchem Programm ich das gemacht habe weiß ich leider nicht mehr, die Suche hat damals etwas gedauert, weil es mir wichtig war, alle Kontaktbilder (und das waren viele!) beim Umzug nicht zu verlieren. Hat dann auch alles soweit geklappt, einzig die Darstellung der Namen war etwas unschön. Dazu muss man wissen, dass es in Kontaktverwaltungen verschiedenste Namensfelder gibt, einfach Vor- und Nachname wäre da zu simpel. Bei meinem Umzug wurden die Felder für Vor- und Nachnamen korrekt belegt, zusätzlich wurde aber der angezeigte Name auf „Nachname, Vorname“ gesetzt. Das ist eigentlich erst mal egal, kann aber unschön werden, wenn man dann andere Tools mit seinen Google-Kontakten synchronisiert. Ich nutze bspw. den automatischen Datenabgleich mit meiner Fritzbox, der dafür sorgt, dass bei allen Nummern, die ich in meinen Kontakten habe, auf dem Festnetztelefon der Name des Anrufers angezeigt wird, auch wenn dieser gar nicht im Festnetztelefon gespeichert ist. Und ich nutze das Thunderbird-Add-On „Google Contacts“, um im Mailclient meines Vertrauens immer die Kontakte aktuell zu haben. Und dort ergibt sich dann z.B. das „Problem“, dass eine Mail dann nicht an ‚Vorname Nachname <mail@dres.se>‘ gesendet wird, sondern an ‚“Nachname, Vorname“ <mail@dres.se>‘. Ist jetzt nicht weiter schlimm, erzeugt aber beim Kontaktperfektionisten ein gewisses Unbehagen.

In Outlook hatte ich mir mal ein kleines VBA-Schnipsel erstellt, um alle Kontakte durchzugehen und Felder nach meinen Änderungswünschen zu modifizieren. Sowas wollte ich jetzt auch für meine Google-Kontakte haben und habe mich mal hingesetzt, und eine kleine PHP-Lösung zusammengestrickt. Der Großteil des Codes ist von irgendwo zusammengeklaut und eben für meine Bedürfnisse angepasst, benutzt wird außerdem das Zend Framework. Ich habe damit jetzt einfach mal alle „Nachname, Vorname“ in „Vorname Nachname“ ändern lassen, es lässt sich aber auch leicht an andere „Problemfälle“ anpassen. Viel Spaß.

<?
// Pfad zur ZendFramework-Library setzen:
set_include_path(get_include_path() . PATH_SEPARATOR . '/DEIN_PFAD/ZendFramework-1.10.8-minimal/library');

// Zend Gdata-Libraries laden:
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Http_Client');
Zend_Loader::loadClass('Zend_Gdata_Query');
Zend_Loader::loadClass('Zend_Gdata_Feed');

// Zugangsdaten für Google-Account.
// Bei "Bestätigung in zwei Schritten" muss ein extra "anwendungsspezifisches Passwort" angelegt werden:
$user = "DEIN_LOGIN@gmail.com";
$pass = "DEIN_PASSWORT";

// Einloggen und richtige Protokollversion setzen:
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, 'cp');
$gdata = new Zend_Gdata($client);
$gdata->setMajorProtocolVersion(3);

// Abfrage starten, die einfach mal alle (max. 2000) Kontakte holt:
$query = new Zend_Gdata_Query('http://www.google.com/m8/feeds/contacts/default/full');
$query->maxResults = 2000;
$query->setParam('orderby', 'lastmodified');
$query->setParam('sortorder', 'descending');
$feed = $gdata->getFeed($query);
//echo "<pre>"; print_r($feed); echo "</pre>";

echo "<pre>";
echo "<h1>".$feed->totalResults." Kontakte gefunden in '".$feed->title."'</h1>";

// Alle Einträge durchgehen:
foreach($feed as $entry)
	{
	// Der Einfachheit halber die Daten auch in XML konvertieren:
	$xml = simplexml_load_string($entry->getXML());
	//echo "\n<hr>\n"; print_r($xml);

	// Jetzt nur DIE Kontakte durchgehen, die eine bestimmte Bedingung erfüllen:
	//if (preg_match("/Vorname/i", (string) $xml->name->fullName))				// "Vorname"	kommt im angezeigten Namen vor
	//if (preg_match("/Daniel/i", (string) $xml->name->fullName))				// "Daniel"	kommt im angezeigten Namen vor
	if (preg_match("/,/", (string) $xml->name->fullName))						// ","		kommt im angezeigten Namen vor
		{
		echo "\n<hr>\n"; print_r($xml);

		// Es gibt verschiedene Namensfelder: Vorname, Nachname, angezeigter Name etc.
		// Sinnvollerweise soll der angezeigte Name gleich "Vorname Nachname" sein.
		// Oft ist er aber "Nachname, Vorname", was dann Probleme macht, wenn man die Google Contacts auch in andere Programme importiert (Thunderbird, Fritz!Box, ...)
		// Daher einfach denn angezeigten Namen immer aufh "Vorname Nachname" setzen:
		echo "<h2>Setze angezeigten Namen von \"".$xml->name->fullName."\" auf \"".$xml->name->givenName." ".$xml->name->familyName."\"...</h2>";
		$xml->name->fullName = $xml->name->givenName.' '.$xml->name->familyName;
  
		// Geänderten Eintrag speichern.
		// Dazu noch irgendwelche Header setzen, sonst geht es nicht (siehe http://stackoverflow.com/questions/2989257/if-match-or-if-none-match-header-or-entry-etag-attribute-required-error-when-t)
		$extra_header = array('If-Match'=>'*');
		$entryResult = $gdata->updateEntry($xml->saveXML(), $entry->getEditLink()->href, null, $extra_header);
		}
	}

echo "<h1>Fertig!</h1>";
echo "</pre>";	
?>

Schreibe einen Kommentar

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