[Gelöst] Anruferidentifikation aus CARD-DAV Datenbank

asterks

Neuer User
Mitglied seit
19 Sep 2015
Beiträge
9
Punkte für Reaktionen
0
Punkte
1
Hallo Leute,
es gab hier ja schon viele Ansätze, wie man einen Anrufer anhand der Caller-ID zu einem Anzeigenamen macht. Dabei wird z.B. auf eine MySQL-Datenbank zurückgegriffen, in der Rufnummer und Name (ggf. weitere Spalten) vorhanden sind. Es wird also ein Query mit den Parametern Name, Nummer durchgeführt.

Mein zentrales Telefonbuch enthält jedoch Card's. Es ist meines Wissens die momentan beste Lösung, verschiedenen Clienten (Android-Handy, Windows-Phone, Thunderbird auf PC) dieselbe Datenbank zur Verfügung zu stellen.
In der "cards" Tabelle der Datenbank enthält jeder Datensatz ein kleines Textfile, in dem die Informationen enthalten sind. Dabei ist es auch möglich, dass zu einer Person mehrere Telefonnummern gespeichert sind.

Um die Daten aufzulösen müsste also ein MySQL-Zugriff auf die card-files erfolgen, das File nach der Nummer durchsucht werden, und wenn erfolgreich, den Namen zurückzugeben.

Meine Frage ist nun, hat sich schon mal jemand mit so einem Problem auseinandergesetzt, und kann hier einen Lösungsvorschlag unterbreiten?
 
Da ich die Vorgehensweisen des neuen Forum-Betreibers nicht gut heiße, stehen meine Beiträge hier nicht weiter zur Verfügung.
 
Zuletzt bearbeitet von einem Moderator:
Meine Frage ist, hat jemand so etwas schon gemacht, also das erforderliche Script geschrieben, und wäre bereit es hier zu veröffentlichen?
Ich selbst habe schon mit solchen Scripten gearbeitet, ich weiss also ein wenig damit umzugehen, aber ein solches Project von Null zu beginnen geht über meinen Horizont.
 
Da ich die Vorgehensweisen des neuen Forum-Betreibers nicht gut heiße, stehen meine Beiträge hier nicht weiter zur Verfügung.
 
Zuletzt bearbeitet von einem Moderator:
Der Datentyp der Cards ist "mediumblob", was immer das heisst. Darin sind die Vcard's (je Datensatz eine) gespeichert.
Offensichtlich gestattet dieser Datentyp unterschiedliche Datenlängen, ohne dass diese vorher festgelegt werden muß. Das ist auch notwendig, weil die Cards verschieden groß sein können. Wie schon gesagt, können zu einer Person mehrere Telefonnummern, eMail, Geburtstag, Notizen und selbst ein Profilbild gespeichert sein.
Ich zeige hier mal eine Vcard, die auch ein Bild enthält.

Code:
BEGIN:VCARD
VERSION:3.0
N;CHARSET=utf-8:Schildkröte;Verne;;;
FN;CHARSET=utf-8:Verne Schildkröte
PHOTO;ENCODING=b;TYPE=JPEG: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
 
BDAY;VALUE=DATE:20101004
TEL;TYPE=HOME,VOICE:0123456
WP1.TEL:00998877665544
WP1.X-ABLabel:Filmstudio
EMAIL;TYPE=HOME,PREF,INTERNET:[email protected]
TITLE:Comic
NICKNAME:Verne
END:VCARD

Die Card habe ich auf meinem WindowsPhone erstellt. Durch die Synchronisierung mittels BAIKAL Server steht dieser Kontakt nun auch meiner Frau auf ihrem Android zur Verfügung. Auf den Windows-PC ebenso.

Man kann diese Cards einfach teilen, über Bluetooth, eMail, WhatsApp usw.
Eigentlich müsste jeder schon einmal damit zu tun gehabt haben, deswegen wundert es mich, dass man so wenig darüber im Netz findet.

Hier ist die Datenbankstruktur.
1b99609eaf.jpg



und ein Auszug aus der Tabelle
6adec0b13b.jpg

@rentier-s Danke für Dein Interesse an meinem Problem.
 
Zuletzt bearbeitet:
Da ich die Vorgehensweisen des neuen Forum-Betreibers nicht gut heiße, stehen meine Beiträge hier nicht weiter zur Verfügung.
 
Zuletzt bearbeitet von einem Moderator:
Ok, die SQL Abfrage wird so nicht funktionieren. Innerhalb der Card gibt es Kontexte (ähnlich Asterisk).
Der Kontext mit den Telefonnummern beginnt mit "TEL;" und endet, wenn ein neuer Kontext startet, in meinem Beispiel bei "EMAIL;" oder am Ende der Card.
Dazwischen liegen Informationen für zwei Telefonnummern, in der App werden sie als:
Privat 0123456
Filmstudio 00998877665544

angezeigt.
Direkt vor der Rufnummer steht also nicht immer dasselbe. Man könnte natürlich einfach die ganze Card nach Zahlen durchsuchen, aber die stehen dann möglicherweise in einem andern Kontext.

Was Du über PHP sagst, klingt gut, schliesslich erfolgt die Abfrage von meinen Clienten auch über php. Ich hatte auch schonmal in das Baikal/Sabre Paket reingeschaut, aber da sind so viele *.php drin...
Wenn es schon fertige klassen gibt, wie kommt man denn da ran?
 
Ich stehe momentan vor einem ähnlichen Problem und habe da ein sehr vielversprechendes Script gefunden

https://github.com/thomascube/vcfconvert

Sieht so aus, funktioniert (auch) so: http://labs.brotherli.ch/vcfconvert/

Weboberfläche oder Konsole.

Ich will das in den kommenden Tagen, so ich Zeit finde, so verscripten, dass die Daten periodisch aus OwnCloud gezogen werden und in eine MySQL-Datenbank geschrieben werden. Der Asterisk soll sich die Daten dann per CallerID Lookup holen. Einzig das Datenformat, in welchem die Abfrage als auch der zuckgelieferte Datensatz aussehen muss, damit Asterisk das verarbeiten kann, fehlt mir noch.
 
Da ich die Vorgehensweisen des neuen Forum-Betreibers nicht gut heiße, stehen meine Beiträge hier nicht weiter zur Verfügung.
 
Zuletzt bearbeitet von einem Moderator:
Ja, ich war wohl kurz ohnmächtig, jetzt prasseln die Ideen nur so herein.
Tatsächlich hatte ich auch schon daran gedacht, mit einem cron-script einmal täglich die Vcard-Datenbank zu durchforsten, und nur die relevanten Daten, also Name und Rufnummern in ein einfaches Textfile zu schreiben. Auf dieses Textfile greift dann Asterisk bei einem Anruf zu, das sollte dann schnell genug passieren.
Dann muss ich mich nur noch mal mit php beschäftigen...
 
Vielleicht auch Asterisk sein: DB()
...anschauen.

Working Example
Code:
[macro-test]
exten => s,1(argumentausgabe),Verbose(Makro (test) ${MACRO_EXTEN} ${MACRO_CONTEXT} ${ARG3} ${ARG2} ${ARG1})
same => n(argumentverarbeitung),Set(MAKRORESULT=${SHELL(/bin/sh /etc/asterisk/cmdret ${ARG1})})
same => n,Set(DB(Makro/test_date${DB(Makro/test)})=${MAKRORESULT})
same => n,Set(DB(Makro/test_epoch${DB(Makro/test)})=${ARG1})
same => n,Set(DB(Makro/test_peer${DB(Makro/test)})=${ARG2})
same => n,SayAlpha(${DB(Makro/test_epoch${DB(Makro/test)})})
same => n(db_output1),Verbose(DB(Makro/test) = ${DB(Makro/test)})
same => n(db_output2),Verbose(DB(Makro/test_epoch${DB(Makro/test)}) = ${DB(Makro/test_epoch${DB(Makro/test)})})
same => n(db_output3),Verbose(DB(Makro/test_date${DB(Makro/test)}) = ${DB(Makro/test_date${DB(Makro/test)})})
same => n(db_output4),Verbose(DB(Makro/test_peer${DB(Makro/test)}) = ${DB(Makro/test_peer${DB(Makro/test)})})
same => n(db_flipflop),ExecIf($[${DB(Makro/test)}]?Set(DB(Makro/test)=0):Set(DB(Makro/test)=1))
same => n(beenden),MacroExit()

Diese Extension ruft obiges Makro auf...
Code:
exten => 777,1,Verbose(Context: ${CONTEXT} Exten:${EXTEN})
same => n,Answer(500)
same => n,Macro(test,${EPOCH},${CALLERID(num)},"Makrotest:")
same => n,Verbose(${MAKRORESULT})
same => n,Hangup()
Es nimmt ${EPOCH}, übergibt es dem Makro und dieses wandelt es ( mit Shell(sh Skript) ) in ein lesbares Datum um.
Dann benutzt es exakt 2 Datensätze (Die mit 0 und 1 am Ende), die bei jedem Aufruf getauscht (db_flipflop) werden.

So siehts in der Datenbank aus...
Code:
asterisk -x 'database show Makro'
/Makro/test                                       : 1
/Makro/test_date0                                 : Thu Aug 24 19:03:53 CEST 2017
/Makro/test_date1                                 : Thu Aug 24 18:52:28 CEST 2017
/Makro/test_epoch0                                : 1503594233
/Makro/test_epoch1                                : 1503593548
/Makro/test_peer0                                 : 1008
/Makro/test_peer1                                 : 1008

Das Skript cmdret macht die Umwandlung...
cmdret
Code:
if [ ${#} -ne 0 ]
then
echo -n $(date --date=\@${@})
else
 echo -n 1
fi
#EOF
Es braucht kein SHEBANG und muss nicht ausführbar gemacht werden, da es mit /bin/sh aufgerufen wird.
 
Zuletzt bearbeitet:
@koyaanisqatsi, ich bin etwas verwirrt, was hat Dein Code mit dem Thema zu tun?
 
Anstatt irgendwo ein Textfile zu speichern kannst du deine VCard Infos auch gleich in der Datenbank von Asterisk deponieren/aktualisieren/auslesen u.s.w.u.s.f.
Aber ist ja nur ein Vorschlag/Empfehlung.
Außerdem ists nur ein Beispiel.
Für: Shell() DB() und Macro()

Ich kann es auch wieder löschen.
Will ja deinen Thread hier nicht beschmutzen.
 
so, ich wollte mich nochmal melden, um das Problem als für mich gelöst darzustellen. Ich habe tatsächlich nochmal gesucht, gefunden und mich wieder mit php beschäftigt.
Das hat ein wenig gedauert.
Die Lösung arbeitet auch so schnell, dass keine Pufferung über eine andere Textdatei notwendig ist.
Bei einem Anruf wird nun die Nummer des Anrufers über die "get" Methode an den Pi im lokalen Netzwerk geschickt, auf dem sich die Datenbank mit den Cards befindet.
Code:
exten => s,n,Set(CALLERID(name)=${CURL(http://adresse_pi/phonebook/search.php?telnumber=${CALLERID(num)})})
exten => s,n,ExecIF($["${CALLERID(name)}"=""]?SET(CALLERID(name)="unbekannt"))
Es wird dann der Name oder nichts zurückgegeben, und direkt in CALLERID(name) gespeichert.
Falls euer Asterisk nicht mit Curl verlinkt ist, könnt ihr auch "shell()" verwenden. Das php-Script ist hier:
Code:
<?php
//das script soll ausschlisslich den namen zur gesuchten nummer liefern
//falls doch unerwartete fehle auftreten werden sie hiermit unterdrückt
error_reporting(0);
//'tabelle' enthält die cards, 'user' muss lesenden zugriff auf daten haben
$db=mysqli_connect('localhost', 'user', 'passwort', 'tabelle');
if(!$db)
{
//abbruch bei nichterreichbarkeit
    exit(1);
}

$res=$db->query("SELECT carddata FROM cards");
if(!$res)
{
    $db->close();
    exit(1);
}

while($row=$res->fetch_assoc())
{
//cards nacheinander auslesen, und in ein array aus zeilen speichern
//ersetze inplace
//das zeilenendezeichen vereinheitlichen
    $row["carddata"]=str_replace("\r\n", "\n", $row["carddata"]);    //dos
    $row["carddata"]=str_replace("\r", "\n", $row["carddata"]);    //mac
//zeilen die mit whitespace beginnen, gehören ans ende der vorangegangenen (photo-daten)
    $row["carddata"]=preg_replace("/(\n)([ |\t])/i","", $row["carddata"]);
//mac os: entfernt hex-nullen
    $row["carddata"]=str_replace("\x00","",$row["carddata"]);
//konvertiert text zu array aus zeilen
    $lines=explode("\n",$row["carddata"]);
//es wird der "fullname" gesucht, die variable wird zu beginn jeder card gelöscht
    $fname='';        //falls später nicht gefunden
//jede card wird vollständig durchsucht, weil die reihenfolge der zeilen mit
//name und telefonnummern nicht festgelegt ist
//bei einer erfolgreichen suche wird ein flag gesetzt
    $bfind=false;    //kein fund
//loop durch die zeilen
    foreach($lines as $line)
    {
    //teile die zeile am doppelpunkt
    //links sind typ und parameter, rechts sind daten
        $data=explode(":",$line,2);        //teile am ersten ':' in data[0,1]
        if(count($data)==1) continue;    //kein ':' dann nächste zeile
    //teile links (data[0]) in typedef und parameter
        $tmp=preg_split("/(?<!\\\\)(\;)/i",$data[0]);        //tmp ist zweiteiliges array
    //teste tmp auf klassendefinition z.b WP1.TEL
        $tmp=explode(".",$tmp[0],2);
        if(count($tmp)>1) $typedef=strtoupper($tmp[1]);
        else $typedef=strtoupper($tmp[0]);
    //typedef enthält jetzt das schlüsselwort
    //filtere nur FN und TEL
        if($typedef=='FN') $fname=$data[1];        //sollte nur einmal je card erscheinen
        if($typedef=='TEL')
        {
        //die übergebene nummer ist im nationalen format (vorwahl,nummer)
            $tel=str_replace("+49","0",$data[1]);        //wandele +49 aus card in 0 um
            $tel=str_replace(" ","",$tel);                //entferne ggf lücken zwischen vorwahl und nummer
            if($tel==$_GET["telnumber"]) $bfind=true;    //mit get übergebene nummer
        }
    }
    unset($line);

    if($bfind)
    {
//die gesuchte nummer kann in verschiedenen cards eingetragen sein
//je nach wunsch kann die suche bei der ersten fundstelle abgebrochen werden
        echo $fname;    //gebe name aus
        break;            //verlasse while
//oder die ergebnisse werden mit komma verkettet
        $fnameall.=$fname.", ";
    }

}
//und am ende alle namen ausgegeben
echo $fnameall;

$db->close();
exit(0);
?>
Danke nochmal für die Hilfe.
 
Hallo zusammen,

Ich suche schon eine ganze Weile danach, wie ich meine angelegten Kontakte in Nextcloud (Mysql VCard) in freepbx als als Anrufename anzeigen lassen kann.

Die Lösung von @asterks scheint ja genau das zu tun was ich suche.
Da Asterisk (freepbx) noch recht neu für mich ist, wollt ich fragen ob ihr mir vielleicht ein bisschen unter die Ärme greifen könnt?

Die 2 Dinge die ich nicht verstehe:
1. Die 2 Zeilen Code aus dem Beispiel oben, wo muss man diese eintragen. Kann man das übers freepbx webinterface machen, oder muss es in eine bestimmte Datei eingetragen werden?

2. Wohin muss ich das php-Script kopieren?

Gruß
 
Ich glaube, man sollte vCards eher nach LDAP importieren und auf das LDAP-Verzeichnis zugreifen.
Und nebenbei haben viele Clients auch einen eigenen LDAP-Client integriert :)
 
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.

IPPF im Überblick

Neueste Beiträge