carddav2fb - angepaßte Version

Hallo,

erst mal vielen Dank, dass sich noch jemand um dieses Skript kümmert.

Ich versuche das ganze mit dem Apple Adressbuchserver zum laufen zu bekommen. Ich bekomme aber immer die Meldung:

Code:
php carddav2fb.php 
Get all entries from CardDAV server(s)... PHP Fatal error:  Uncaught exception 'Exception' with message 'Woops, something's gone wrong! The CardDAV server returned the http status code 403.' in /home/service/carddav2fb/lib/CardDAV-PHP/carddav.php:285
Stack trace:
#0 /home/service/carddav2fb/carddav2fb.php(86): carddav_backend->get()
#1 /home/service/carddav2fb/carddav2fb.php(48): CardDAV2FB->get_carddav_entries()
#2 {main}
  thrown in /home/service/carddav2fb/lib/CardDAV-PHP/carddav.php on line 285

hier die config.php

Code:
// CONFIG
$config['fritzbox_url'] = 'IPADRESSE';
$config['fritzbox_port'] = 80;
$config['fritzbox_pw'] = 'PASSWORT';

// multiple carddav adressbooks could be specified

// first
$config['carddav'][0] = array(
        'url' => 'https://server.int.domain.tld:8843/addressbooks/users/service/addressbook',
        'user' => 'USER',
        'pw' => 'PASSWORT'
);

Hat jemand eine Idee?
 
Jetzt brauche ich auch mal hilfe :D

Hallo zusammen,

ich habe mir heute mal einen RaspberryPi mit Owncloud aufgesetzt. Das funktioniert soweit auch super.
Nun wollte ich auch das carddav2fb zu laufen bekommen. Daran scheitere ich aber.

Aufbau sieht wie folgt aus.

FRITZ!Box7390 mit FRITZ!OS 06.03
direkt daran hängt mein PI (hostname owncloud)
Auf dem PI habe ich den Ordner carddav2fb mit der gesamten Ordnerstruktur unter /var/scripte/carddav2fb angelegt.
Danach habe die Datei config.example.php in config.php umbenannt und dort folgende Eintrgäe ersetzt:

Code:
<?php

// CONFIG
$config['fritzbox_ip'] = 'router.daheim';
$config['fritzbox_user'] = 'USER';
$config['fritzbox_pw'] = 'PASSWORT';
$config['phonebook_number'] = '0';
$config['phonebook_name'] = 'Telefonbuch';
//$config['output_file'] = '/media/usbdisk/share/phonebook.xml';
//$config['group_filter'] = array('Arzt','Familie','Freunde','Friseur','Geschäftlich','Hotline','Notruf','Restaurant','Shops');
//$config['group_vip'] = 'VIP';
//$config['usb_disk'] = 'USBDISK2-0-01';

// multiple carddav adressbooks could be specified and will be merged together.

// first
$config['carddav'][0] = array(
        'url' => 'https://owncloud.daheim/remote.php/carddav/addressbooks/admin/Kontakte/',
        'user' => 'USER',
        'pw' => 'PASSWORT'
);

// second
//$config['carddav'][1] = array(
//      'url' => 'https://raspserver/owncloud/remote.php/carddav/addressbooks/fritzbox/fb_contacts_second',
//      'user' => 'oc_username',
//      'pw' => 'oc_password'
//);

Denoch bekomme ich immer einen Fehler wenn ich das Script mit php -f carddav2fb.php ausführe.
:(

Code:
Get all entries from CardDAV server(s)... PHP Fatal error:  Uncaught exception 'Exception' with message 'Woops, something's gone wrong! The CardDAV server returned the http status code 0.' in /var/scripte/carddav2fb/lib/CardDAV-PHP/carddav.php:285
Stack trace:
#0 /var/scripte/carddav2fb/carddav2fb.php(86): carddav_backend->get()
#1 /var/scripte/carddav2fb/carddav2fb.php(48): CardDAV2FB->get_carddav_entries()
#2 {main}
  thrown in /var/scripte/carddav2fb/lib/CardDAV-PHP/carddav.php on line 285

Ich habe zwei Testkontakte angelegt. Beide enthalten kein Bild.

Hier mal einer (20140108T014743.b8dfbd2072%40owncloud.daheim.vcf )

Code:
BEGIN:VCARD
VERSION:3.0
N:User;Test;;;
UID:[email protected]
REV:2014-01-08T01:57:46+00:00
FN:Test User
PRODID:-//ownCloud//NONSGML Contacts 0.3//EN
EMAIL;TYPE=WORK:
TEL;TYPE=HOME:0711/123456789
TEL;TYPE=WORK:0711/112
END:VCARD

Was mache ich falsch?

Owncloud wurde von mir mit Hilfe der Anleitung von Connect installiert. <<LINK>>

Über Hilfe würde ich mich riesig freuen.

Wenn noch irgendwelche Daten gebraucht werden einfach kurz bescheid sagen.

Danke euch shcon mal im Vorraus.
 
Ich habs, ich habs :D

Ich hab jetzt nochmals mein PI frisch auf gesetzt. Diesmal jedoch mit dem Unterschied das ich die locals nicht eingestellt habe. Dann klappt es wunderbar.
als Adresse funktioniert nun die http://
 
@SnoopyDog:
Wirst du das Projekt hier bei GitHub forken und dann weiterführen?
 
Sorry daß ich mich nicht mehr gemeldet habe. Momentan fehlt mir ein wenig die Zeit.
 
Herzlichen Dank für diesen Tip

Ja davon habe ich auch jede Menge (owncloud). Weiß man warum diese entstehen?


Hallo!

Super Arbeit, vielen Dank!

Ich hatte ein kleines Problem beim ersten Versuch, das mich einiges an Zeit gekostet hat - vielleicht hilft dies dem ein oder anderen der ein ähnliches Probelm hat:

Setup: Owncloud auf Raspbian, Skript ebenfalls auf Raspbian, FritzBox 7270

Ich habe folgende Fehlermeldung erhalten:
Code:
Get all entries from CardDAV server(s)... PHP Fatal error:  Uncaught exception 'Exception' with message 'Woops, something's gone wrong! The CardDAV server returned the http status code 404.' in /home/pi/carddav2fb/lib/CardDAV-PHP/carddav.php:309
Stack trace:
#0 /home/pi/carddav2fb/lib/CardDAV-PHP/carddav.php(510): carddav_backend->get_vcard('C5CD17B5-66E0-0...')
#1 /home/pi/carddav2fb/lib/CardDAV-PHP/carddav.php(280): carddav_backend->simplify('<?xml version="...', true)
#2 /home/pi/carddav2fb/carddav2fb.php(86): carddav_backend->get()
#3 /home/pi/carddav2fb/carddav2fb.php(48): CardDAV2FB->get_carddav_entries()
#4 {main}
  thrown in /home/pi/carddav2fb/lib/CardDAV-PHP/carddav.php on line 309

LÖSUNG: Als ich mir dann irgendwann die Dateinamen der .vcf Files auf dem Server angeschaut habe, habe ich gesehen, dass es einige Dateien gibt, die zwei mal .vcf als Dateiendung haben (xxxxxxxx.vcf.vcf).

Nachdem ich diese entfernt habe hats funktioniert :)

Ein paar weitere Hinweise:
  • FritzBox Login muss entsprechend konfiguriert sein: System --> FRITZ!Box-Kennwort --> Anmeldung mit FRITZ!Box-Benutzernamen und Kennwort
  • FritzBox User muss angelegt sein: System --> FRITZ!Box-Kennwort --> Tab "FRITZ!Box-Benutzer"
 
Zuletzt bearbeitet:
Hallo liebe Nutzer,

das Skript funktioniert bei mir bisher sehr gut. Bisher aufgefallen ist mir, nach dem Abgleich der Einträge und hochladen in das Telefonbuch (eigenes erstellt), werden die zugehörigen Kontaktbilder nur auf einem meiner zwei MT-F angezeigt. Bei dem anderen kommt immer nur die Statusmeldung, dass diese noch nicht zur Verfügung stehen (oder so ähnlich).

Habe ich hier einen Gedankenfehler? Oder muss ich noch etwas einstellen?

Desweiteren habe ich das Problem, dass z.B. Faxnummern im Fritz!Box Telefonbuch als "Privat" angezeigt werden, obwohl diese in owncloud (6.02) als Faxnummer gekennzeichnet sind. Muss ich hier auch noch etwas anpassen was mir bisher entgangen ist?

Vielen Dank schon einmal im Voraus fur die Hilfestellungen.

Zu den Bildern kann ich leider nichts beitragen, aber zu den Faxnummern.
Ich habe in der Datei carddav2fb.php ca. ab Zeile 166 den Code wie folgt abgeändert:
PHP:
if (in_array("fax", $typearr_lower) && in_array("work", $typearr_lower)) {
	$type = "fax_work";
}
elseif (in_array("fax", $typearr_lower) && in_array("home", $typearr_lower)) {
	$type = "fax_work";
}
elseif (in_array("work", $typearr_lower)) {
	$type = "work";
}
elseif (in_array("cell", $typearr_lower)) {
	$type = "mobile";
}
elseif (in_array("home", $typearr_lower)) {
	$type = "home";
	$prio = 1;
}
else {
	continue;
}
Wie man sieht habe ich einfach dafür gesorgt, dass Nummern vom Typ "Fax" überhaupt berücksichtigt werden und nicht per default auf "geschäftlich" gesetzt werden. Da ich nicht sicher war, ob die FritzBox automatisch auch Einträge vom Typ "Fax Privat" als Faxnummern erkennt, wird das auch berücksichtigt.
Ich hoffe es hilft.
 
Vielen Dank für das Script.
Wollte schon selbst anfangen es anzupassen und habe es dann auf der Suche nach einer aktuellen fritzbox_api_php hier gefunden.

Ich hatte allerdings noch ein paar Probleme mit SOGo und Apple OS X Addressbook Bildern.
Lösung: Habe einfach alle Bilder aus dem VCARDS stream entfernt.

ca. Zeile 96
PHP:
...
$value = (string)$vcard_element->vcard->__toString();
$value = preg_replace("/(PHOTO\;)[\S\s]*(2Q\=\=|9k\=|\/Z)/", "PHOTO;", $value, -1);
$raw_vcards[$id] = $value;
...

Dadurch wird auch weniger Speicher beansprucht und das ganze läuft auch auf der Fritz!Box selbst.
Dazu noch eine PHP Binary von https://www.fritzmod.net/modification/apache/php/ downloaden und zusammen mit dem Script auf die Fritz!Box übertragen.
Über telnet lässt es sich dann wie gewohnt ausführen.

z.B. für eine 7390/7490: ./php_v5.5.6_mips carddav2fb.php
 
Zuletzt bearbeitet:
Ich hätte da zwei kleine bescheidene Wünsche:

Zum einen wäre es mir angenehmer, wenn das Skript, die Libs und die Konfiguration im Dateisystem so verteilt würden, wie es üblich ist. Also z.B.:

- das Skript selber nach /usr/local/bin/
- die Libs nach /usr/local/lib/carddav2fb/
- pro Benutzer eine spezifische Konfiguration nach $HOME/.carddav2fb.cfg

Da in der Konfig auch Passwörter stehen, sollte der letzte Punkt dann auch inklusive einer Überwachung der Leserechte sein: das Skript darf nicht starten, wenn die benutzerspezifische Konfiguration weltoffen ist, sprich: von mehr als nur dem Besitzer von $HOME/.carddav2fb.cfg lesbar ist.

Damit kann das Skript auch auf einem Mehrbenutzersystem verwendet werden, ohne daß es sich jeder Benutzer selber installieren muss.

Mein zweiter Wunsch wäre, daß man in der Konfig auch auswählen kann, welche Telefon-Nummern in welcher Reihenfolge nachher in der FB enthalten sein sollen. Ich habe z.B. einen Pauschaltarif, der aber nur Gespräche in das Festnetz enthält. Daher habe ich meine FB für Anrufe in die Mobilnetze gesperrt. Wenn ich jemandes Mobilnummer anrufen muss, tue ich das auch mit meinem Taschenandroiden, denn dafür habe ich ebenfalls einen Pauschaltarif, der auch das Mobilnetz enthält.

Synchronisiere ich meinen Taschenandroiden mit der Eigenwolke, und diese dann mit der FritzBox, werden auch die Mobilnummern übertragen, und stehen meistens an erster Stelle im FB-Adressbuch. Suche ich einen Namen und drücke wählen, wird die (an der FB gesperrte) Mobilnummer gewählt.

Mit anderen Worten: die Mobilnummern könnten beim Hochladen der Kontakte auf die FB rausgefiltert werden. Aber nur in dieser Richtung!

Mit Fax-Nummern ist es ähnlich: auch die stehen im Adressbuch der AB manchmal an erster Stelle, so daß sie beim Aufruf eines Adressbucheintrages als Voreinstellung gewählt werden. Die Fax-Nummern brauche ich höchstens, wenn ich vom Rechner ein Fax versenden will, aber nicht in meinem FB-Handgerät zum Anrufen.

Ist das möglich, oder stößt das Skript hier an seine Grenzen?

Eine Alternative zum Rausfiltern wäre das Anlegen verschiedener Adressbücher:

- eines, daß nur Festnetznummern enthält,
- eines, daß nur Mobilnummern enthält,
- eines, daß nur Fax-Nummern enthält

Das stelle ich mir auch nicht unpraktisch vor. Was sagen die Experten dazu?
 
Ich verstehe das Anliegen jedoch erkauft man sich den Komfort die richtige Nummer beim Anrufen auszuwählen damit, dass man nicht sieht, wenn der Kontakt vom Handy mich zu Hause anruft. Das kann es auch nicht sein.
Ich habe die gleiche Situation. Festnetzflat vom Festnetzanschluss und Mobilfunktelefonate werden ausschließlich vom Handy geführt. Aber ich möchte gerne eine vollständige Liste meiner Kontakte in der FritzBox haben, damit die Anrufliste funktioniert. Dass ich beim Anrufen eines Kontaktes einen Tastendruck mehr mache, um die Festnetznummer auszuwählen, finde ich nicht sonderlich störend.

Selbst eine Aufteilung der Nummer in verschiedene Telefonbücher finde ich nicht praktikabel. Im besten Fall habe ich 3x die selbe Person in den Telefonbüchern.
Was wiegt schwerer: Ein Tastendruck beim Anrufen mehr oder ein unübersichtliches Telefonbuch bzw. unübersichtliche Telefonbücher?
 
Ich verstehe das Anliegen jedoch erkauft man sich den Komfort die richtige Nummer beim Anrufen auszuwählen damit, dass man nicht sieht, wenn der Kontakt vom Handy mich zu Hause anruft. Das kann es auch nicht sein.

Oh, ja, da hast Du Recht, daran habe ich nicht gedacht. :(

Kann man denn vielleicht beim Telefonbuch der FB eine Nummer als zu bevorzugen kennzeichnen? Oder würde es helfen, die Reihenfolge der Rufnummern zu ändern, so daß zuerst immer die Festnetznummern gewählt werden? Auf meinem Mobiltelefon habe ich meistens die Mobilnummern als erste Nummer gespeichert. Beim Ex- und Importieren steht die dann natürlich auch oben. Vielleicht reicht es ja schon, die von dem Skript einfach umsortieren zu lassen.
 
Hallo,

ich habe es tatsächlich auch hinbekommen, das meine Kontakte nun auf der Fritz.Box im Telefonbuch liegen. ;)

Leider habe ich aber auch ein kleines Problem.

Mein Carddav Server (Baikal) 'verteilt' die Kontakte an mehrere Smartfones und Mail Clients. Dort ist alles prima.

Im Telefonbuch der FritzBox sind aber leider Vorname und Nachname 'vertauscht'. Kann man das beim Import irgendwie drehen?
Ein Umstellen im Server macht keinen Sinn, da es auf allen anderen Geräten 'richtig' dargestellt wird.


*********** erledigt *********************
man muss lediglich in der vcard.php first und last name tauschen :D
 
Zuletzt bearbeitet:
Hallo,

besten Dank für das tolle Skript Bei mir läuft es jetzt in der Kombination EGroupware -> Fritzbox 7390 mit Filterung nach Kategorien.

@Hoovercraft: die vCard.php ist eine Bibliotheks-Datei. Diese solltest du nicht ändern. Besser du änderst das in der carddav2fb.php. Dort wird der Telefonbuchname mit dieser Zeile zusammengesetzt:

$name = $this->_concat($name_arr['Prefixes'],$this->_concat($this->_concat($name_arr['FirstName'],$name_arr['AdditionalNames']),$name_arr['LastName']));

ich habe diese geändert in:

$name = $this->_concat($name_arr['LastName'],$name_arr['FirstName']);

Die Namenszusätze etc. verwende ich nicht.

Ein Komma bekommt man dann auch schnell rein. Dazu habe ich die Funktion _concat weiter unten um ein Komma erweitert:

return $text1.", ".$text2;


Gruß
Mag1c
 
Hallo,

ich habe die Hinweise von Mag1c berücksichtigt ... passt soweit.

In der Liste im MT-F sehen die Einträge super aus.

Was leider gar nicht passt ist das Wählen.

Die Einträge sind in carddav wie folgt hinterlegt: +49 231 1234567.
Wenn ich nun wähle wird daraus 2312311234567.

Das macht natürlich gar keinen Sinn. Hat da einer eine Idee?

Gruß
Hoovercraft
 
Hi Hoovercraft,

ich speichere meine Nummern auch alle mit "+49" und bei mir funktioniert das. Kommentier mal in der config.php die Zeile

//$config['output_file'] = 'phonebook.xml';

aus (führende // weg machen). Dann wird das Telefonbuch nicht auf die Fritzbox geladen sondern in diese Datei reingeschrieben. Vielleicht hilft dir das schon weiter.

Gruß
Mag1c
 
Hi Mag1c,

die Zeile lautet bei mir:
//$config['output_file'] = '/media/usbdisk/share/phonebook.xml';

Ich nutze aber keinen angehängten Stick. Was mich total wundert ist, das die Boxen anscheinend alle etwas unterschiedlich sind.

Egal, ich habe mich gerade hingesetzt und alle Kontakte umgestellt. Das +49 bräuchte ich eh nur, wenn ich mal aus dem Ausland anrufe. Dann schaff ich es aber auch mir die Nummer aufzuschreiben.

Trotzdem danke für deine Hilfe !

Gruß
Hoovercraft
 
Vielen Dank für das Script!
Nachdem das CardDAV-Phonebook für Freetz bei mir nicht mehr läuft, kam das hier genau richtig.
Zunächst hatte ich auch die Probleme mit den ".vcf.vcf"-Dateien in Owncloud. Diese habe ich dann durch einen direkten Eingriff in die owncloud-Datenbank gelöscht (select uri from oc_contacts_cards where uri like '%.vcf.vcf'; und anschließendes delete) - ist sicher nicht der offizielle Weg, hat aber funktioniert...
Anschließend gab es noch einen Owncloud-Kontakt, der falsche Sonderzeichen enthielt und daher eine Fehlermeldung beim Parser hervorrief. Um diesen Eintrag zu finden, habe ich das carddav2fb.php-Skipt um die Zeilen
$fname = basename($conf['url']) . ".xml";
print PHP_EOL."save to $fname";
file_put_contents($fname, $xmldata);

ab Zeile 88 (nach $xmldata = ...) erweitert. Dann werden die heruntergeladenen Owncloud-Daten auch noch zwischengespeichert und man kann sehen, wo der Fehler liegt.
Jetzt habe ich endlich (wieder) alle Kontakte auf der Frizbox (bis auf die Fotos die noch nicht so recht wollen, aber mein Mobiltelefon zeigt die sowieso nicht an).

Vielen Dank
J_P
 
[Gelöst] Kontaktbilder

Ich habe leider immer noch das Problem, dass die Kontaktbilder nicht auf meinen beiden MT-F angezeigt werden.

Ich habe mich jetzt noch einmal hingesetzt. Mein Lösungsvorschlag nachfolgend:

Ich habe in der carddav2fb.php (Hauptverzeichnis) folgenden Code geändert (suche im Original nach)
Code:
if (($entry['photo']) and (array_key_exists('usb_disk',$this->
anpassen in:
Code:
if (($entry['photo']) and (array_key_exists('usb_disk',$this->config))) {$person->addChild("imageURL","file:///var/".$this->config['usb_disk']."/FRITZ/fonpix/".$entry['photo'].".jpg");

Dann habe ich in der config.php folgenden Code angepasst (suche im Original nach)
Code:
$config['usb_disk']
anpassen in:
Code:
$config['usb_disk'] = 'InternerSpeicher';

Ich hoffe, das hilft einigen hier weiter. Ich bin jedenfalls glücklicher geworden.
 
Moin,

habe das Script heute gefunden und auf meinem Server eingerichtet...allerdings läuft es nicht... :(
Kurz zum Server: Debian Squeeze, Apache, PHP5, Curl ist aktiviert

Fehlermeldung die beim Ausführem vom Script kommt:
Code:
server:pfadzumordner/carddav2fb# php carddav2fb.php
Get all entries from CardDAV server(s)...
Fatal error: Call to undefined function curl_init() in /pfadzumordner/carddav2fb/lib/CardDAV-PHP/carddav.php on line 572

Kann mir jemand weiter helfen?
 
Das klingt sehr nach als ob zumindest php-cli ohne curl kompiliert wurde.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.