Black Senator

Mitglied
Mitglied seit
13 Jul 2007
Beiträge
418
Punkte für Reaktionen
69
Punkte
28
Hallo,

seit ein paar Wochen gibt es unter https://github.com/andig/carddav2fb eine komplett neu codierte Version des PHP Scripts.

+++update 03.10.2021
Übersicht der Features
+++


+++update 17.4.2020
Usefulvid hat ein
Video zum Script erstellt
+++


Was ist neu bzw. anders?
  • Programmierung:
    • Verwendung von z.T. neuerenstandardisierten Klassenbibliotheken (vCard-Parsing)
    • Coding durchstrukturiet und in Klassenbibliotheken untergliedert
  • Voraussetzungen:
    • PHP 7.01 (mit php7.1-cli, php7.1-curl, php7.1-mbstring und php7.1-xml)
    • Composer
  • Funktionalität:
    • Kontakte können anhand von Kategorieren ein- und/oder ausgeschlossen werden (include exclude)
    • Gruppen (Apple iCloud) werden wie Kategorieren behandelt (in- und exclude, sowie VIP)
    • Namenskonvertierung inkl. aller Bestandteile (z.B. Pre- und Suffix) als Muster definierbar und die Konvertierungsmuster sind kaskadierbar
  • Script-Handling
    • Aufruf über Commands download, convert, upload oder run für den kompletten Prozess
    • Output von Zwischenergebnissen in RAWVCF-File (jsonText)
Die Testgruppe war bisher noch nicht so groß, und der Image-Upload ist wohl noch in der Queue.

Bei mir rennt das Script auf einem RasbPi mit ca. 1.600 iCloud-Kontakten fehlerlos.


Viel Spaß beim Ausprobieren

Black Senator


Quick install guide:

1 carddav2fb installieren

Code:
cd /
git clone https://github.com/andig/carddav2fb.git
cd /carddav2fb
1.1 Composer installieren (ggf. mit der Quellseite aktualisieren)
Code:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
1.2 Composer ausführen
Code:
composer install
1.3 carddav2fb konfigurieren
Code:
cp /carddav2fb/config.example.php /carddav2fb/config.php
nano /carddav2fb/config.php
1.4 carddav2fb ausführen
Code:
php ./carddav2fb run
 
Zuletzt bearbeitet:
  • Like
Reaktionen: GreySoldier
Hallo Senator,

vielen Dank für Deine Arbeit. ich have mal deine Skripte installiert und getested. Die Installation lief ohne Probleme. Nur als ich das skript dann gestarted habe kam die folgende Meldung:

Client error: `PROPFIND https://mein.dns.de/` resulted in a `405 Method Not Allowed` response

ich habe das ganze noch mit der IP Adresse und auch mit http://... versucht. Alles mit dem gleichen Ergebnis. Vielleicht hast Du ja eine Ahnung an was das ganze scheitert. Bei mir läuft das fante mit einem Raspi 2 und Nextcloud 13. Meine FritzBox ist eine 7390.

Danke schon mal

Markus
 
Hallo Markus,

kopiere doch bitte mal aus PuTTy die komplette Ausgabe nach dem "run" Befehl, die dir das Script auf den Screen schmeißt.
Sensible Daten kannst Du ja x-en


Black Senator
 
Hallo Black Senator,

es ist nicht viel was zu sehen ist. Anbei die Putty ausgabe. Wie gesagt, der Fehler kommt 1:1 mitt http/https und IP oder DNS eintrag.

pi@raspi:~ $ cd carddav2fb/
pi@raspi:~/carddav2fb $ php carddav2fb.php run
Downloading vCard(s) from account myaccount
0 [>---------------------------]
In RequestException.php line 113:

Client error: `PROPFIND http://192.168.178.10/` resulted in a `405 Method Not Allowed` response


run [-i|--image] [-c|--config CONFIG]

pi@raspi:~/carddav2fb $


Danke

Markus
 
Hallo Markus,

ehrlicherweise kann das alles oder nix bedeuten. Um den Fehler einzugrenzen, und da ich nicht weiß wie erfahren Du bist frage ich lieber etwas detaillierter und von vorne an:

Deine URL für den NextCloud-CardDAV-zugriff müsste also ähnlich wie unter https://docs.nextcloud.com/server/13/user_manual/pim/sync_thunderbird.html beschrieben lauten.
Demnach müsste der Teil für den/die Server in der config.php in etwa so aussehen:
Code:
// or server
    'server' => [
        [
            'url' => 'https://cloud.nextcloud.com/remote.php/dav/addressbooks/users/daniel/Thunderbird/',
            'user' => 'markus',
            'password' => 'geheim',
            ],

Kannst Du mit den Credentials mit anderen Programmen z.B. CardBook auf deine Kontakte zugreifen?

Black Senator

### Zusammenführung Doppelpost by stoney ###

Ich habe von NextCloud übrigens keinen Schimmer - muss mich also selbst erst ein wenig einlesen. Habe gerade das Thema 2FA entdeckt.
Hast Du das aktiviert - und wenn ja, hast Du dann auch für den Remote-Zugriff - also den carddav2fb-User ein App-spezifisches Passwort angelegt? carddav2fb kann naheliegenderweise keine 2FA erfüllen!
 
Zuletzt bearbeitet von einem Moderator:
Hallo Black Senator,

vielen Dank für den Tipp. Ich weiss zwar nicht warum, aber irgendwie habe ich geglaubt, dass

'url' => 'https://cloud.nextcloud.com/',
'user' => 'markus',
'password' => 'geheim',

reichen würde. Ich hatte nicht den vollen Pfad zum Adressbuch angegeben. Zu blöde. Na ja das auslesen des Adressbuches von Nextcloud funktioniert jetzt auf jeden Fall. Ich habe jetzt noch ein weiteres Problem mit dem upload zur FB, aber das ist der Login zu dem account den ich extra für den address upload angelegt habe. Ich will ja nicht meinen "richtigen" login im Klartext ablegen. Da muss ich noch ein wenig herum spielen.

Also download in Nextcloud funktioniert auf jeden Fall, 2FA habe ich keine aktiviert.

Danke schon mal für die schnelle Hilfe ich melde mich wenn ich weiter bin.

Gruß

Markus
 
Hallo Markus,

klasse, dass der download funktioniert. Also - für den Upload ist es eigentlich egal, ob Du den Standard-User für die box oder einen eigens angelegten Upload-User verwendest. Usernamen und Passwort sind so oder so in in der config.php sichtbar einzutragen. Das macht aber auch nix, wenn Du für dein RasbPi ein vernübftiges User-, Passwort- und Zugriffskonzept umgesetzt hast.
Ich nehme an du nutzt nur den User pi und hast für den und root jeweils eigenen Passwörter geändert/angelegt (sudo passwd pi)?
Wenn dein RasbPi nicht aus dem Internet angesteuert wird - was soll dann passieren?

Tipp:
Code:
    // or fritzbox
    'fritzbox' => [
        'url' => 'fritz.box',
        'user' => 'dslf-config',
        'password' => 'DEINLOGINPASWORTFÜRDIEFB',
    ],
Das müsste funktionieren
 
Hallo Black Senator,

auch ich versuche mich an dieser neuen Version (danke dafür).

Zunächst einmal: Wenn man nicht alles auf einmal mit dem Kommando "run" machen möchte, wie ist das Vorgehen?

Mit
php carddav2fb.php download
kann man ja zunächst mal alle vcards downloaden.

Wo landet der Download? Und wie kann man den dann als Input für
php carddav2fb.php convert
verwenden?

Danke & Gruß,
Churchy
 
Hallo Churchy,

Du kennst sicher die Vorgänger-Version. Die Option der Zwischenspeicherung und Prüfsummencheck vor dem Upload gibt es in dieser Version nicht. Der Grund ist, dass der Upload nicht der zeitliche bottleneck ist.
Das Programm läuft ja idealerweise automatisch im Hintergrund als cron job.
Daher lässt sich ableiten, dass die Optionen download, convert und upload zu nur zu Test bzw. Debugging einen Sinn ergeben.

Probiere bitte:
Code:
php /carddav2fb/carddav2fb.php list
für die Befehlsübersicht
Code:
php /carddav2fb/carddav2fb.php download -h
für Hilfe für diesen Befehl (andere analog)

Hier mal eine beispilehafte Befehlszeile für den Download
Code:
php carddav2fb.php download -r test.json
bzw.
Code:
php carddav2fb.php download -r test.json >test.txt
wenn du die Screen-Ausgabe auch umlenken möchtest und ggf. vergleichen willst, was im JSON im Vergleich zu ASCII ankommt

Convert-Befehl entsprechend.

Ehrlich gesagt, habe ich bisher den Upload aus (Converted)-File auch noch nicht hinbekommen. Wenn Dich das drängt, dann stelle doch die Frage an den Enwickler andi auf GitHub.

Hilft das weiter?

Black Senator
 
Hallo Black Senator,

danke für die schnelle Reaktion, leider hilft das aber nicht wirklich...

Ich kenne auch die Vorgänger-Version nicht, ich wollte gleich auf diese aktuelle gehen.

Um mir nicht mein aktuelles (auf anderen Wegen bisher erzeugtes) Telefonbuch auf der FB zu zerschießen wollte ich erst einmal Schritt für Schritt schauen, was dieses Tool so macht und an Daten für die FB erzeugt. Daher wollte ich mal die XML-Ausgabe sehen bevor sie in FB hochgeladen wird.

Was rätst Du mir? Einfach mal alles in ein 2.Telefonbuch zu laden?

Churchy
 
Hallo Churchy,

ich rate Dir:
  1. Das vorhandene TB sichern
  2. einfach ein zweites TB vom Tool anlegen lassen - und so lange überschreiben bis Du mit dem Customizing in der config.php (oder wie immer Du sie nennst -> dann aber mit -c [Label].php!) zufrieden bist
  3. Mach Dir auch klar was Du erreichen willst (das hat nix mit dem Tool zu tun!)
    Das ist das Thema Datenmanagement und Datenqualitätsmanagement!

    Ich versuche das mal zu beschreiben, was ich darunter praktisch verstehe:
    M.E. ist das nur sinnvoll, wenn man an einer Stelle (NextCloud, OwnCloud, Baikal, iCloud - oder Goggle) die Kontakte zentral als "führende" Daten pflegt (und nur dort!). Das ist der große Gewinn einer Cloud!
    Nur dann ist es sinnvoll, mit carddav2fb einen Teil der Daten (nämlich ja nur Name, Nummer, Typ, ggf. VIP) auf die FB zu synchronisieren (unidirektional!).
    Wir haben z.B. drei Kontakt-Cluster in der Cloud - meine Kontakte, die meiner Frau und eine gemeinsame Schnittmenge (auf die wir mit Smrtphone auch gemeinsam zugreifen. Nur in der Cloud(!) werden per App oder Programm neu e Kontakte angelegt, Daten geändert oder gelöscht.
    Zusammen ca. 1650 Kontakte. Daraus wiederum wird mit exclude/include nur ein Teil auf die FB geladen (überwiegend aus der Schnittmenge und angereichert mit jeweils ein paar Kontakten von mir und meiner Frau).
Black Senator
 
Hallo Black Senator,

  1. Das vorhandene TB sichern
  2. einfach ein zweites TB vom Tool anlegen lassen - und so lange überschreiben bis Du mit dem Customizing in der config.php (oder wie immer Du sie nennst -> dann aber mit -c [Label].php!) zufrieden bist

Genau so habe ich es erfolgreich gemacht, danke.

Jetzt habe ich nur noch ein Problem mit den Bildern.
Aus meiner owncloud Instanz kommen die Bilder eingebettet in der vCard raus (Auszug):
Code:
PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEB
 AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2w
...
Leider werden diese aber auch mit der Option -i nicht übertragen.
Wird das überhaupt unterstützt? Wie kommt man hier weiter?

Und ein weiteres Problem habe ich mit der Verwendung der https-URL der FB. Dort wird bei mir (wie in vermutlich vielen anderen FBen) ein "eingebautes" (und damit selbst signiertes) Zertifikat verwendet.
Das mag das Skript aber nicht:
Code:
In CurlFactory.php line 187:
                                                                                                                          
  [GuzzleHttp\Exception\RequestException]                                                                                 
  cURL error 60: SSL certificate problem: self signed certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
Kann man da dem GuzzleHttp noch etwas auf die Sprünge helfen, z.B. über ein
PHP:
$client->request('GET', '/', ['verify' => false]);
(siehe http://docs.guzzlephp.org/en/stable/request-options.html#verify-option)

VG,
Churchy
 
Hallo Churchy,

der Bilder-Upload ist noch nicht nicht realisiert!
Steht als Issue auf GitHub noch als Open.
Andi und ich hatten diskutiert, dass es wenig Sinn ergibt, die Bilder stumpf herunterzuladen und einzubetten, weil öfters ja nur Auschnitte der Bilder in den Apps als Profilbilder hinterlegt sind (zumindest ist das bei mir so) - die vorherige Lösung hat aber die Auschnittsdaten nicht berücksichtigt - dann hat man plötzlich ein nicht erkennbares Gruppenfoto auf dem Mobilteil :)
Long story short - Andi ist noch nicht dazu gekommen das Image-Feature zu realisieren, um auch nur die definierten Ausschnitte zu übertragen ...
Am besten schließ Dich doch dem Issue auf GitHub an. Dann merkt Andi, dass nicht nur ich sein Arbeit nutze und macht sich evtl. an die Arbeit...

Gleiches gilt für das SSL-Thema. Ich habe die gleiche Konstellation - greife jedoch nicht mit einer https-URL auf die FB zu, sondern einfach mit fritz.box bzw. IP. Ich bin/bzw. bleibe ja in meinem Netzwerk - da ist die Verschlüsselung m.E. kein Thema... Aber Andi ist immer wieder gerne bereit sich auch solchen Fragen zu stellen - man muss nur bei ihm korreckt per Issue oder Pull-Request über GitHub vorstellig werden... :)

Grüße

Black Senator
 
Hallo Black Senator,

nur noch eine kurze Rückmeldung von mir. Der Upload zur FB klappt jetzt auch. Tolle Arbeit. Vielen Dank.

Gruß

Markus
 
Ich habe erstmalig dcarddav2fb auf einen Raspberry Pi 3+ installiert, bekomme es aber nicht zum Laufen:

Die Adressen werden korrekt geladen, jedoch scheitert die FB-Verbindung mit folgender Fehlermeldung:

2018_06_24_11_38_56_pi_Raspberrypi_carddav2fb.png

Offenbar wird der Zugriff auf die FB verweigert:

2018_06_24_11_40_08_FRITZ_Box_7490_Opera.png

PS:
Anpassung der config mit: $config['fritzbox_force_local_login'] = true; habe ich schon durchgeführt !
Änderung der Fritzbox IP -> fritz.box ebenfalls erfolglos versucht
Benutzer hat alle Zugriffsrechte der FB/ FTP-Zugriff über Fireziila bereits möglich (Kennwort wurde mehrfach geprüft/ geändert etc.- ohne Erfolg)

Wer hat Rat ?

Anmerkung:
FritzBox 7490, FRITZ!OS: 06.93
CardDAV2FB läuft auf Raspberry PI3+
 
Zuletzt bearbeitet:
Hallo Black Senator,
ich bin gerade dabei das neue carddav2fb zu testen. Leider bekomme ich beim Download folgende exception:

Code:
Downloading vCard(s) from account dezxxx
    0 [>---------------------------]PHP Fatal error:  Uncaught Error: Call to undefined function Andig\CardDav\utf8_encode() in /home/dezxxx/Entwicklung/NodeRed_Container/carddav2fb/src/CardDav/Backend.php:192
Stack trace:
#0 /home/dezxxx/Entwicklung/NodeRed_Container/carddav2fb/src/CardDav/Backend.php(166): Andig\CardDav\Backend->cleanResponse('<?xml version='...')
#1 /home/dezxxx/Entwicklung/NodeRed_Container/carddav2fb/src/CardDav/Backend.php(109): Andig\CardDav\Backend->simplify('<?xml version='...', true)
#2 /home/dezxxx/Entwicklung/NodeRed_Container/carddav2fb/src/functions.php(38): Andig\CardDav\Backend->getVcards()
#3 /home/dezxxx/Entwicklung/NodeRed_Container/carddav2fb/src/DownloadCommand.php(55): Andig\download(Object(Andig\CardDav\Backend), Object(Closure))
#4 /home/dezxxx/Entwicklung/NodeRed_Container/carddav2fb/vendor/symfony/console/Command/Command.php(251): Andig\DownloadCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#5 /home/dezxxxEntwicklung/NodeRed_Container/carddav2 in /home/dezxxx/Entwicklung/NodeRed_Container/carddav2fb/src/CardDav/Backend.php on line 192

Kannst du erkennen, was genau das Problem ist?
Viele Grüße
Bastian

//edit by stoney: [CODE]TAG[/CODE] gesetzt
 
@ak68

Hallo, da Du schreibst:
$config['fritzbox_force_local_login'] = true
benutzt du offenbar die "alte" Version.

Da musst Du Dich an den/die Entwickler wenden. Am besten auf GitHub ein entsprechendes Issue aufmachen.

MfG

Black Senator

### Zusammenführung Doppelpost by stoney ###

@bastihey

bitte mach dazu ein Issue in GitHub auf. Andy kümert sich nur über diese Plattform um die Wartung. Abgesehen davon ist die Codestrecke tatsächlich aus einem library, welches diese function schon in der Vorgängerversion verwendet hat.
Aber wenn Du ein Issue eröffnest und das Problem prägnant und nachvollziehbar beschreibst, dann kümmert er sich darum.
Man kann aber jetzt schon sagen, dass es an den Daten auf dem CardDAV-Server bzw. deren Zeichencodierung liegt. Also solltest Du unbedingt, die Informationen zum Server (Google, iCloud, owncloud, netxtcloud, baikal etc.) angeben.

good luck

Black Senator
 
Zuletzt bearbeitet von einem Moderator:
@ak68

Hallo, da Du schreibst:
benutzt du offenbar die "alte" Version.

Da musst Du Dich an den/die Entwickler wenden. Am besten auf GitHub ein entsprechendes Issue aufmachen.

MfG

Black Senator

Black Senator

Hallo Black Senator,

habe jetzt die neue Version installiert- pedantisch nach Deinen Anweisungen.

Jetzt hänge ich aber an folgendem Fehler:


2018_06_29_19_57_52_pi_Raspberrypi_carddav2fb.png


Es scheitert also schon an der Abfrage, Benutzername/ Kennwort sind definitiv in Ordnung.

Eine Abfrage des Adressbuchs z.B. über Browser oder Thunderbird ist möglich !

Abwechselnd habe ich auch noch folgenden Fehler:

2018_06_29_20_09_54_pi_Raspberrypi_carddav2fb.png

Wer hat eine Idee ?

Danke
Andreas
 
Zuletzt bearbeitet:
  • Like
Reaktionen: altheeagle
Ich bin bis 18.07. im Urlaub - bis dahin kann ich nur mitlesen.
Im Zweifel ein issue auf github aufmachen
 
Hallo zusammen

Der 18.7. ist ja nun schon bald ;-)
Ich versuche gerade (ohne grosse php Kenntnisse) das Skript für meinen Fall zu adaptieren.
Ich habe es hinbekommen, dass das Login auf der FB und auf meiner Nextcloud funktioniert.
Mit dem command
Code:
php carddav2fb.php run
wird der Download gestartet, konvertiert, und hochgeladen. Leider werden aber keinerlei Kontakte gefunden.
Irgendetwas mache ich wohl falsch, aber was nur?
Um nicht meine "echten" Passwörter im plain text zu speichern habe ich wie hier empfohlen einen weiteren Account in der Nextcloud erstellt und diesem meine Kontakte geteilt (ohne Schreibrechte). Diese werden in Nextcloud als "Kontakte (onestyle)" angezeigt. Diesen Namen habe ich für 'phonebook => 'name'=> übernommen (muss ich das?).

Hier mein config.php inhalt:

Code:
<?php

$config = [
    // phonebook
    'phonebook' => [
        'id' => 0,
        'name' => 'Kontakte (onestyle)'
    ],

    // or server
    'server' => [
        [
            'url' => 'http://192.168.178.47/nextcloud/remote.php/dav/',
            'user' => 'fritzboxusr',
            'password' => '**********',
            ],                                /* add as many as you need
        [
            'url' => 'https://...',
            'user' => '',
            'password' => '',
            ],                                */
    ],

    // or fritzbox
    'fritzbox' => [
        'url' => 'http://fritz.box',
        'user' => '',
        'password' => '*********',
    ],

    'filters' => [
        'include' => [
            // if empty include all by default
        ],

        'exclude' => [
            'category' => [
                ],
            'group' => [
            ],
        ],
    ],

    'conversions' => [
        'vip' => [
            'category' => [
            ],
            'group' => [
            ],
        ],
    'realName' => [
            '{lastname}, {prefix} {nickname}',
            '{lastname}, {prefix} {firstname}',
            '{lastname}, {nickname}',
            '{lastname}, {firstname}',
            '{organization}',
            '{fullname}'
        ],
        'phoneTypes' => [
            'WORK' => 'work',
            'HOME' => 'home',
            'CELL' => 'mobile'
        ],
        'emailTypes' => [
            'WORK' => 'work',
            'HOME' => 'home'
        ],
        'phoneReplaceCharacters' => [
            '+41' => '0',  //Router steht default in DE; '0049' könnte auch Teil einer Rufnummer sein
            '('   => '',
            ')'   => '',
            '/'   => '',
            '-'   => ' '
        ]
    ]
];
 

Statistik des Forums

Themen
244,640
Beiträge
2,215,724
Mitglieder
371,219
Neuestes Mitglied
csgaming
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.