CallerID mit AGI an VDR per Telnet übermitteln

Hallo Ihr Alle,

ich wollte nur recht nett DANKE schreiben - für eine einfache aber durchdachte Lösung.

Zweierlei ist mir - als schmalhans skripter - aufgefallen :

- Nummern aus dem SIP Netz kommen hier ohne + rein.
- Umlaute sind ein Problem (zB "Bäckerei Meier" erscheint als "Brei Meier")
- Die Details kommen hier nur als "Nächste Seite" o.ä. an - also auskommentiert


Wie kann ich es zB schaffen in dem reverse.agi nach mehr als nur einem match für die (+)49 zu suchen (?) :

Code:
NUMMER=`echo $1 | sed -e "s/\ //g" -e "s/49/0/"`

Ich konnte nicht so ganz nachvollziehen was dort genau passiert...

Aber nochmals ein grosses Danke an Thorsten und all die anderen hier, ein sehr gutes und gelungenes AddIn ;)

Grüsse, Stefan
 
Hi
ich "normalisiere" meine Ankommenden rufe - so dass sie mit "00496027", "+496027", "496027", "06027" etc hereinkommen können.
Es wird bei mir alles auf "06027" gemappt.

Incomming Context:
Code:
exten => s,1,Macro(CALLERID,1,1)
exten => s,2,AGI,reverse.agi|${CALLERID(NUM)}
Normalisierungs-Context:
Code:
[macro-CALLERID]
exten => s,1,Set(CHANNEL(language)=de)

;mach aus +.. eine 00...+CALLERID:1
exten => s,2,gotoif,$["${CALLERID(NUM):0:1}" = "+"]?3:4
exten => s,3,Set(CALLERID(num)=0${CALLERID(NUM):3})

;mach aus 0049.. eine 0...+CALLERID:4
exten => s,4,gotoif,$["${CALLERID(NUM):0:4}" = "0049"]?5:6
exten => s,5,Set(CALLERID(num)=0${CALLERID(NUM):4})

;mach aus 49... ein 0...
exten => s,6,gotoif,$["${CALLERID(NUM):0:2}" = "49"]?7:8
exten => s,7,Set(CALLERID(num)=0${CALLERID(NUM):2})

exten => s,8,Noop

Durch dieses Script ist es egal durch welchen Provider bei mir die Anrufe reinkommen...
Ich hoffe dir hilft das weiter?
Gruß
Thorsten
 
Hallo Thorsten,

das tut es in der Tat, Dank´ Dir !

Grüsse, Stefan
 
Hallo, ich das Script auch eingebaut aber mit tel.search.ch (also für die Schweiz) - nun haben die "Knaben" eine Erschwernis eingebaut, nämlich wird nun vor dem Namen der zurückkomt immer eine Zufallsnummer eingesetzt.
Hat jemand das Wissen um das Pattern um den Namen dennoch herauszuholen (die Random Nummer überspringen).

- das ist von meiner eigenen Nummer
href="/detail/aaa0116b00a9e9d1">PC-Software, E.Rieder</a></h4></div>
- das ist zB vom Anruf meines Schwagers
href="/detail/dd2e6f5c708f9c53">Leemann, Kurt (-Rieder)</a></h4></div>

Oder gibt mir jemnd einen Tip damit ich mir selbst weiterhelfen kann ?

Danke und Gruss aus Zürich
Erich
 
Such doch nach
Code:
">
als delimiter und wert erst ab da aus
 
Danke, ja ich bin dran mich mit den regex Ausdrücken tiefer zu befassen (Perl Bücher Studium) ;-)
In Delphi hätt ich keine Probleme aber hier ist noch Studium angesagt, dafür ist es viel leistungsfähiger.
Aber ich muss das sowieso mal durchziehen es gibt immer so vieles was man mit Perl machen könnt wenn man die Pattern Untersuchung im Griff hätte.
Gruss Erich
 
tel.ch

...wäre schön, wenn Du das fertige script posten könntest, dann haben andere auch was davon...

Danke :)
 
Inverssuche von Schweizer Telefonnummern

Es gibt ja schon mehrere Threads, die das behandeln. Ich habe mir für meinen Zweck mal diesen ausgesucht :D

Ich habe mich gestern mal drangesetzt, ein neues AGI für Asterisk zu programmieren, welches Schweizer Nummern nachschlägt. Leider hat tel.search.ch eine _sehr_ alte Datenbank mit unglaublich vielen falschen Einträgen drin. Daher habe ich mich für den sehr aktuellen Datapool von directories.ch entschieden. Bei denen ist die Abfrage allerdings einiges komplizierter.

Um euch daran teilhaben zu lassen, habe ich das Script hier angehängt.

Beide Dateien kommen nach /var/lib/asterisk/agi-bin/ . reverse.php muss mit chmod ausführbar gemacht werden, Snoopy.class.php nicht.

Eingebunden wird es einfach so
Code:
exten = s,1,AGI(reverse.php,${CALLERID(num)})

Ich habe nicht wirklich viel Error-Checking eingebaut. Wenn das jemand machen will -> es ist Open Source ;)

Jedenfalls würde ich mich über Feedback freuen, ob es bei euch funktioniert.

[EDIT vom 10.04.2007]
Anhang aktualisiert

- Bessere Fehlerüberprüfung
- Bei schon bekannten Anrufern (CALLERID(name) gesetzt) wird nicht mehr gesucht
- Bei Handynummern (07x) wir nicht mehr unscharf gesucht
- Log/Config-Verzeichnis werden von Asterisk abgefragt.
- Dem Skript muss die CALLERID(num) nicht mehr als Variable übergeben werden. Wenn doch, wird diese zur Suche verwendet, sonst fragt es die CallerID vom Asterisk ab.

Neu reicht also:
Code:
exten = s,1,AGI(reverse.php)

Gruss,
Sachmet.
 

Anhänge

  • reverse.tar
    50 KB · Aufrufe: 54
Zuletzt bearbeitet:
Ich habe jetzt dein php-Script eingebaut und das funktioniert auf Anhieb (fast) wie gewünscht. Mich würde nun interessieren, wie ich es anstelle, dass neben dem Namen auch die Adresse angezeigt werden könnte. Ich verstehe nichts von php, darum wäre eine erklärende Anleitung ziemlich hilfreich.
 
Freut mich, dass es funktioniert. Ich habe schon gedacht, das setzt keiner ausser mir ein.

Auch wenn dein Wunsch einfach scheint, er ist es nicht. Directories.ch liefert leider je nach gefundenem Adresstyp (Privat, Firma, Firma mit Abteilungen, ?) unterschiedliche Antworten. Das macht die Auswertung der Serverantwort sehr aufwändig.
Wenn ich etwas Zeit finde, werde ich mir das genauer anschauen. Im Moment haben aber andere Asterisk-Programmierungen vorrang. Schliesslich will ich meine Telefonanlage auch mal in den Produktivbetrieb schicken :)

Hier findest du eine Doku zu php.

Gruss,
Sachmet.
 
Übrigens habe ich, glaube ich wenigstens, einen Fehler gefunden.
hier gibst du wohl 10 Zeichen vor
Code:
if ( ("$CIDnum" != "") && (strlen($CIDnum) == 10) ) {
#  $logfile = fopen ($LOG, "a+");
  # first lets have a look at the cache
  $cachefile = fopen ($CACHE, "r");
  while (!feof($cachefile)) {
    $line = explode(chr(9),fgets($cachefile, 4096));
    if ($line[0] == $CIDnum) {
      $CIDname = rtrim($line[1]);
    }
Leider werden die Wortabstände aber auch mitgezählt und ich erhielt falsche Antworten, da die letzten beiden Ziffern nicht berücksichtigt wurden. Habe das jetzt mit «13» ersetzt und es scheint zu klappen.
Was mir auch noch aufgefallen ist: Nummer aus dem Fürstentum Liechtenstein haben 15 Stellen (00423 XXX XX XX). Ist es möglich einfach den Wert noch zu erhöhen, oder kann man einstellen «13 oder 15 Stellen»?
Auch bekomme ich keine Einträge in die Log-Datei.

Übrigens vielen Dank für den Link zum php-Handbuch. Ich dachte eigentlich, man müsste nur hier
Code:
 $submit_url = "http://www.directories.ch/weisseseiten/base.aspx?do=extendedSearch&searchtype=adr_extended";
  $submit_vars["language"] = "de";
  $submit_vars["searchtype"] = "adr_extended";
  $submit_vars["firstname"] = "";
  $submit_vars["firstnameopt"] = "1";
  $submit_vars["name"] = "";
  $submit_vars["nameopt"] = "1";
  $submit_vars["unmarriedname"] = "checked";
  $submit_vars["activity"] = "";
  $submit_vars["street"] = "";
  $submit_vars["zip"] = "";
  $submit_vars["location"] = "";
  $submit_vars["region"] = "checked";
  $submit_vars["state_code"] = "CH";
  $submit_vars["phone"] = $number;
  $snoopy->submit($submit_url,$submit_vars);
was ändern, damit andere Variablen ausgelesen werden. Ich habe auch hier
Code:
$name = explode("\n", substr($data[1],0,20));
die «20» durch «40» ersetzt, damit nicht längere Namen abgeschnitten werden.
 
Zuletzt bearbeitet:
robinsonR schrieb:
Übrigens habe ich, glaube ich wenigstens, einen Fehler gefunden.
hier gibst du wohl 10 Zeichen vor
Code:
if ( ("$CIDnum" != "") && (strlen($CIDnum) == 10) ) {
#  $logfile = fopen ($LOG, "a+");
Das ist ein Feature, kein Fehler :cool: Mein Asterisk liefert mir Schweizer Telefonnummern immer als 10 Ziffern Zahl (0551234567) ohne irgendwelche Leerschläge. Die erste Zeile überprüft nur ob dies Zutrifft (ok, eine RegEx, die da auf Ziffern prüft, wäre perfekter), da das Skript in der weiteren Ausführung davon ausgeht.

Wenn du ein Logbuch willst, musst du die Raute (#) am Anfang der entsprechenden Zeilen entfernen. Das war nur für das Debugging gedacht und ist daher auskommentiert.

Andere als Schweizer Nummern habe ich nicht getestet. Wenn directories.ch Liechtensteiner Nummern verarbeiten kann, ist eine Erweiterung des Skriptes relativ einfach.
robinsonR schrieb:
Ich dachte eigentlich, man müsste nur hier
Code:
 $submit_url = "http://www.directories.ch/weisseseiten/base.aspx?do=extendedSearch&searchtype=adr_extended";
  $submit_vars["language"] = "de";
  ..
was ändern, damit andere Variablen ausgelesen werden.
Die obigen Zeilen simulieren nur das Ausgefüllte Formular für die erweiterte Suche bei directories.ch. Wenn du die Adresse haben willst, musst du die Antwort des Servers entsprechend filtern.

robinsonR schrieb:
Ich habe auch hier die «20» durch «40» ersetzt, damit nicht längere Namen abgeschnitten werden.
Meine Recherchen haben ergeben, dass Namen mit mehr als 15 Zeichen Probleme verursachen können, deshalb schneide ich hier auf 20 Zeichen ab. In der Regel reicht das auch für eine Identifikation aus. Wenn man die Info aber anderweitig nutzen will und nicht nur auf dem Display des Telefons anzeigen möchte, sind natürlich mehr Zeichen sinnvoll.

Auf meiner Todo-Liste steht noch ein Filter für Handy-Nummern, damit er bei diesen nicht 'unscharf' sucht.
Noch weiter oben auf der Liste habe ich die Fehlerverarbeitung stehen. Ich will nicht, dass das Skript ewig auf den Server wartet und dadurch ein Anruf nicht durchgestellt werden kann.

Viel Spass beim coden!

Gruss,
Sachmet.
 
Das ist ein Feature, kein Fehler Mein Asterisk liefert mir Schweizer Telefonnummern immer als 10 Ziffern Zahl (0551234567) ohne irgendwelche Leerschläge. Die erste Zeile überprüft nur ob dies Zutrifft (ok, eine RegEx, die da auf Ziffern prüft, wäre perfekter), da das Skript in der weiteren Ausführung davon ausgeht.

Dann verstehe ich nicht, warum bei «10» das Resultat falsch war, will heissen, es wurden nur nach ersten 8 Ziffern gesucht und als ich auf «13» erweiterte, war die Antwort richtig. Darum meine Schlussfolgerung, dass bei der Abfrage Leerzeichen eingefügt würden. Es war in der Tat so, dass es bei Mobilnummern, die unter directories gefunden wurden, die falschen Namen angezeigt wurden.
Spielt es vielleicht auch eine Rolle, wo im Dial-Plan dieser Skript eingefügt wird?

PS: Gib mir doch bitte mal einen Tipp, wo ich im php-Manual suchen muss, um deinen Skript um die Adressen-Darstellung zu erweitern.
 
Ich habe mich da wohl vertan. Ich hatte das Cache-File nicht aktualisiert, darum erhielt ich falsche Angaben.
Habe jetzt einfach die «Unschärfe» bei der Nummernauflösung herausgenommen (das sollte wohl helfen, interne Nummern von Firmen zu erkennen) und habe die invsuche_cache.conf manuell mit Mobiltelefon-Nummern aus meiner DB gefüttert.
So sollte es einigermassen funktionieren.
 
Bevor ich diesen Skript eingebaut hatte, hat mein Asterisk im LDAP-Server nach Namen und passenden Nummern gesucht; das hat auch gut funktioniert. Jetzt nun findet Asterisk die jeweiligen Namen immer noch, der Skript aber ersetzt sie und gibt kein Ergebnis zurück, solange die Nummer nicht auch in der Cache- vorhanden ist.
Wie kann ich nun das php-Skript dahingehend abändern, dass ein vorgängig vorhandene Variable $CIDname nicht ersetzt wird?
 
@robinsonR

Ich kann dir keinen direkten Link angeben, wo du suchen sollst. Schau dir mal den html-code der Ausgabe von directories.ch an und dann mein Skript. Du solltest herausfinden, wonach ich suche.

Du kannst am Anfang im Skript natürlich überprüfen, ob CALLERID(name) von Asterisk schon gesetzt wurde. Entsprechen Code findest du hier. Die Variable heisst agi_calleridname.

Natürlich könntest du auch in der extenstions.conf vor dem Aufruf des Skripts überprüfen, ob der Anrufname schon gesetzt ist.

Ich habe das Skript mittlerweile ein wenig abgeändert, damit es die entsprechenden Pfade ( AST_CONFIG_DIR, AST_LOG_DIR) vom Asterisk (php: genenv) holt. Du kannst so natülich auch CALLERID(num) vom Asterisk holen, so dass im Dialplan die Nummer nicht mehr explizit an das Skript übergeben werden muss.


Gruss,
Sachmet.
 
@Sachmet
Leider habe ich eigentlich gar keine Ahnung vom Skripten. Dieser Ausschnitt
Code:
exten => s,100,LDAPget(CIDNAME=cidname/${CALLERIDNUM},${CALLERIDNUM},${CALLERIDNUM},${CALLERIDNUM})   ; check for mobile and fax as well
exten => s,101,SetCIDName(${CIDNAME})

exten => s,102,AGI(reverse.php,${CALLERIDNUM})
sollte genügen, um zu sehen wie der LDAP-Server abgefragt wird und wie es dann zu dem php-Skript weitergeht.
Wo kann ich denn deinen modifizierten Skript herunterladen? Oder könntest du mir bei der Lösung meines Problems konkret weiterhelfen, will heissen: was muss ich genau einfügen, damit ich das gewünschte Resultat bekomme?
 
@Sachmet
Vielen Dank für das neue Skript. Aber wenn ich jetzt von einem Mobiltelefon anrufe, wird der Anruf gar nicht mehr durchgestellt.
Wie schon gesagt, ich verstehe viel zu wenig von php oder so, dass ich selbständig die nötigen Modifikationen vornehmen könnte. Bitte gib mir die nötigen Angaben, damit ich das gewünschte Ergebnis erhalte.

Auch wird invsuche_cache.conf nicht mehr abgefragt.
 
Damit wäre wohl bewiesen, dass man nicht mehr programmieren sollte, wenn man müde ist. Ich schreibe selten in php und habe dank dir wieder einiges dazugelernt :) Deine Wünsche sollten damit alle erfüllt sein, und der Code ist nun auch einiges besser dokumentiert.

Mein ursprüngliches Posting habe ich wieder aktualisiert. Dieses mal habe ich es auch wieder besser getestet.

Gruss,
Sachmet.
 
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.