0180.info lookup ?

Fux

Mitglied
Mitglied seit
3 Jun 2004
Beiträge
440
Punkte für Reaktionen
1
Punkte
18
Hallo zusammen,

Wie wäre es denn mit einem Script, welches statt der teuren 0180-Nummern alternative FN-Nummern ausspuckt ?

Wenn jemand eine 0180-Rufnummer wählt, sollte der *-Server in der DB der 0180.info nachgucken, ob diese Rufnummer dort verzeichnet ist und falls ja, mit der alternativen (und günstigeren) FN-Nummer verbinden.
0180.info bietet ja ein CSV-File mit den Daten an.

Die Herangehensweise im groben müßte also sein:

- cronjob, der regelmäßig das aktuelle CSV-File zieht
- Script, welches im CSV-File nachguckt, ob Alternativ-Rufnummer(n) vorhanden sind und diese Rufnummer(n) an * übergibt
- * probiert die alternative Rufnummer(n) eine einstellbare Zeit und wählt notfalls die 0180-Nummer, falls erfolglos

Leider reichen meine Fähigkeiten zum Programmieren eines solchen Scriptes nicht aus.

Aber vielleicht hat ja jemand anders schon etwas in dieser Richtung in Arbeit oder Lust dazu.?
 
ok, keine schlechte idee - werde mich am WE mal hin setzen und es versuchen umzusetzten
 
Wie versprochen habe ich mich mit dem Thema beschäftigt und ein kleine script geschrieben.
Ich habe leider nicht die Erfahrung mit perl - also nicht über den schlechten code schimpfen *g* Würde mich freuen wenn ihr noch ein paar verbesserungsvorschäge macht bzw. meinen code verbesset.

THX
Code:
#!/usr/bin/perl -w

#0180 dblookup AGI extension. 
#(C) 2005 by Marcello Ceschia
#(C) 2005 by Marcello (dot) Ceschia (at) smiledesigns (dot) de
#Released under the GNU General Public License 
# 
#This script will dial an alternative nummber according to it's 0180 dbentry
#Use it in your extensions.conf like this: 
#
#  exten => _*0.,1,Agi(0180lookup.agi|${EXTEN:2}) 
#  exten => _*0.,2,SendText(${dblookupfirm}) 
#  exten => _*0.,3,Dial(SIP/${dblookupnumber}@sip.provider.com) 
# 
#/var/lib/asterisk/database is the base dir for the db
#and db0180 is the default table name 
#specified in the constant $datebasedir and $table below. 

use Asterisk::AGI;
use DBI;
use strict;

#############
# Settings: #
#############
my $table = "db0180";
my $datebasedir = "/var/lib/asterisk/database";
my $debug = 1;



sub addtonumber
{
   my $i;
   my $temp = $_[$i];
   my $t0180 = substr($temp,0,5)."-".substr($temp,5,length($temp));
   return $t0180;
}

sub clearfromnumber
{
   my $i;
   my @teile = split(/\-/,$_[$i]);
   my $tnormal = $teile[0]."".$teile[1];
   return $tnormal;
}

my $agi = new Asterisk::AGI;
my %agi_env = $agi->ReadParse;
$agi->answer;
my $dbh = DBI->connect("DBI:CSV:f_dir=$datebasedir;csv_eol=\n;csv_sep_char=\\;;csv_quote_char=\";csv_escape_char=");
my $query = "SELECT firma, t0180, tnormal FROM $table WHERE t0180 = '".addtonumber($ARGV[0])."'";
my $sth = $dbh->prepare($query);
$sth->execute() or die $sth->errstr;
# print $query."\n";
if($sth->rows() > 0){
	my @data = $sth->fetchrow_array;
#  	print "Firma: $data[0] \nt0180: $data[1]\nnormal: $data[2]\n";
# 	print clearfromnumber($data[2])."\n";
	$agi->set_variable("dblookupnumber", clearfromnumber($data[2]));
	$agi->set_variable("dblookupfirm", $data[0]);
}
else
{
	$agi->set_variable("dblookupnumber". $ARGV[0]);
}
$sth->finish();
$dbh->disconnect();

Die datenbank von http://www.tk-anbieter.de/0180/csv.php downloaden und unter /var/lib/asterisk/database/db0180 speichern

P.S.: Ich hatte leider noch nicht die Zeit die 100%-ige funktionalität zu testen -> early alpha version *g*

EDIT: als crontab vielleicht
Code:
wget --output-document=/var/lib/asterisk/database/db0180 http://www.tk-anbieter.de/0180/csv.php
eintragen
 
Wow, das ging schnell !

Habe mir das Skript mal gezogen und in /var/lib/asterisk/agi-bin gepackt.
DB liegt auch, wo sie hin soll.

Leider gibt es Probs. Asterisk sagt:
Code:
 Executing AGI("Zap/1-1", "0180lookup.agi|1805121213") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/0180lookup.agi
    -- AGI Script 0180lookup.agi completed, returning 0
    -- Executing Dial("Zap/1-1", "SIP/@gmxpcn") in new stack
    -- Called @gmxpcn

Das sieht für mich so aus, daß das Skript nicht richitg durchläuft und keine Rufnummer zurückgegeben wird.
Die getestete Rufnummer (01805-121213) ist von Samsung und in der 0180-info-db vorhanden. Müßte also eigentlich gefunden werden.

Versuche ich, das Skript auf der Konsole auszuführen, erhalte ich folgende Fehlermeldungen:
Code:
./0180lookup.agi: line 20: use: command not found
./0180lookup.agi: line 21: use: command not found
./0180lookup.agi: line 22: use: command not found
./0180lookup.agi: line 27: my: command not found
./0180lookup.agi: line 28: my: command not found
./0180lookup.agi: line 29: my: command not found
./0180lookup.agi: line 33: sub: command not found
./0180lookup.agi: line 37: syntax error near unexpected token `('
./0180lookup.agi: line 37: `   my $t0180 = substr($temp,0,5)."-".substr($temp,5,length($temp));'

Irgendein Tip für mich, woran es liegen könnte ?
Kann man das Skript irgendwie dazu bringen, ein Log zu schreiben. Wäre für die Fehlersuche bestimmt hilfreich. Ich habe zwar im Skript die Zeile
my $debug = 1;
gefunden. Ich weiß aber nicht wo und wie ich debug-Infos bekomme...
 
Hallo Fux,

nach
Code:
 Executing AGI("Zap/1-1", "0180lookup.agi|1805121213") in new stack
zu folge wird die nummer nicht korrekt übergeben, es fehlt die führende 0;
des weiteren fehlt dir warscheinlich das CSV modul in perl
Code:
$ perl -MCPAN -eshell
cpan> install DBD::CSV

das $debug = 1;
habe ich vergessen wieder aus dem code zu nehmen, ich habe für eine besser übersicht die debug infos herrausgenommen - sorry

EDIT:
habe noch 2 kleine Fehler entdeckt hier noch mal neu:
Code:
#!/usr/bin/perl -w

#0180 dblookup AGI extension. 
#(C) 2005 by Marcello Ceschia
#(C) 2005 by Marcello (dot) Ceschia (at) smiledesigns (dot) de
#Released under the GNU General Public License 
# 
#This script will dial an alternative nummber according to it's 0180 dbentry
#Use it in your extensions.conf like this: 
#
#  exten => _*0.,1,Agi(0180lookup.agi|${EXTEN:2}) 
#  exten => _*0.,2,SendText(${dblookupfirm}) 
#  exten => _*0.,3,Dial(SIP/${dblookupnumber}@sip.provider.com) 
# 
#/var/lib/asterisk/database is the base dir for the db
#and db0180 is the default table name 
#specified in the constant $datebasedir and $table below. 

use Asterisk::AGI;
use DBI;
use strict;

#############
# Settings: #
#############
my $table = "db0180";
my $datebasedir = "/var/lib/asterisk/database";


sub addtonumber
{
   my $i;
   my $temp = $_[$i];
   my $t0180 = substr($temp,0,5)."-".substr($temp,5,length($temp));
   return $t0180;
}

sub clearfromnumber
{
   my $i;
   my @teile = split(/\-/,$_[$i]);
   my $tnormal = $teile[0]."".$teile[1];
   return $tnormal;
}

my $agi = new Asterisk::AGI;
# my %agi_env = $agi->ReadParse;
$agi->answer;
my $dbh = DBI->connect("DBI:CSV:f_dir=$datebasedir;csv_eol=\n;csv_sep_char=\\;;csv_quote_char=\";csv_escape_char=");
my $query = "SELECT firma, t0180, tnormal FROM $table WHERE t0180 = '".addtonumber($ARGV[0])."'";
my $sth = $dbh->prepare($query);
$sth->execute() or die $sth->errstr;
# print $query."\n";
# print $sth->rows();
if($sth->rows() > 0){
	my @data = $sth->fetchrow_array;
#  	print "Firma: $data[0] \nt0180: $data[1]\nnormal: $data[2]\n";
#  	print clearfromnumber($data[2])."\n";
	$agi->set_variable("dblookupnumber", clearfromnumber($data[2]));
	$agi->set_variable("dblookupfirm", $data[0]);
}
else
{
	$agi->set_variable("dblookupnumber", $ARGV[0]);
}
$sth->finish();
$dbh->disconnect();
habe es auch noch mit ein paar nummern probiert - keine probs

EDIT2:
@Fux ich muss dir recht geben, deine testnummer funtioniert nicht - weswegen ist mir noch schleierhaft; Anscheind gibt es eine Stelle an der datei, ab der keine richtige Interpretation mehr möglich ist

Werde ich morgen noch mal anschauen müssen - GUTE NACHT
 
Also,
das mit der fehlenden Null war nur ein Versuch. Ich hab´s mit und ohne getesetet.

Das CSV-Modul habe ich installiert.

Die Fehlermeldungen rührten daher, daß ich eine Leerzeile als erste Zeile im Skript hatte.

Die ist nun weg. Funzen tut es leider dennoch nicht.
Rufe ich das Skript jetzt von der Konsole aus auf (nachdem ich die 4 Zeilen mit "print" einkommentiert habe), bekomme ich folgende Fehlermeldung:
Code:
./0180lookup.agi 01803250335
Can't locate Asterisk/AGI.pm in @INC (@INC contains: /usr/lib/perl5/5.8.3/i586-linux-thread-multi /usr/lib/perl5/5.8.3 /usr/lib/perl5/site_perl/5.8.3/i586-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.3/i586-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl .) at ./0180lookup.agi line 19.
BEGIN failed--compilation aborted at ./0180lookup.agi line 19.

Asterisk-CLI sagt:
Code:
 -- Executing AGI("Zap/1-1", "0180lookup.agi|01803250335") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/0180lookup.agi
    -- Accepting voice call from '2000' to '01803250335' on channel 0/1, span 1
    -- AGI Script 0180lookup.agi completed, returning 0
    -- Executing SendText("Zap/1-1", "") in new stack
Apr 11 21:03:39 WARNING[23852]: app_sendtext.c:49 sendtext_exec: SendText requires an argument (text)
Also das Skript gibt nachwievor keine Werte zurück.

Habe jetzt zum Testen die erste NUmmer in 0180.info genommen, um den Fehler mit der Samsung-Nummer zu umgehen.
Wenn ich das richtig verstehe, müßte das Skript bei Nichtfinden der Nummer in der DB doch die 0180-Nummer zurückgeben oder ?

EDIT 21:26

Den Fehler mit dem fehlenden Asterisk-Modul habe ich gefunden und das Modul von http://asterisk.gnuinter.net/ installiert.

Jetzt kommen keine Fehlermeldungen mehr auf der Konsole.
Dort bleibt aber das Skript aufgerufen mit ./0180lookup.agi 01803250335 nach der Ausgabe von "ANSWER" stehen.

Der CLI entnehme ich nach wie vor, daß keine Werte zurückgeliefert werden.

Jetzt brauche ich doch nochmal Hilfe. Wo muß ich jetzt suchen ?
 
hallo Fux,

nach Answer einfach mal weiter [ENTER] drücken, dann hast du eine Anzeige wie diese
Code:
asterisk01:/var/lib/asterisk/agi-bin # ./0180lookup.agi 01803250335
ANSWER

Use of uninitialized value in numeric eq (==) at /usr/lib/perl5/site_perl/5.8.5/Asterisk/AGI.pm line 319, <STDIN> line 1.
Use of uninitialized value in array element at ./0180lookup.agi line 35, <STDIN> line 1.
SELECT firma, t0180, tnormal FROM db0180 WHERE t0180 = '01803-250335'
1Use of uninitialized value in array element at ./0180lookup.agi line 43.
SET VARIABLE dblookupnumber 04419265

SET VARIABLE dblookupfirm A&O Autoversicherung Oldenburg AG

asterisk01:/var/lib/asterisk/agi-bin #

Ich denke ich finde morgen noch ein wenig zeit um mir die Probleme noch einmal anzuschauen - bis dahin
 
OK es funzt soweit.
Was wir noch beachten sollten ist die Tatsache, daß zu einer 0180-Nummer auch mehrere normale FN-Nummern eingetragen sein können.

Ich mache mich jetzt mal daran, dem Nutzer einen Kontext zu bauen, der es ihm ermöglicht, auszuwählen ob die Verbindung zur Original-0180-Nummer oder zur Alternativ-FN-Nummer aufgebaut werden soll (Falls die Alternativ-Nr. nicht funzt, was ja manchmal der Fall ist).
 
Und so habe ich es gelöst:
extensions.conf
Code:
[nulleinsachtnull]
exten => _0180.,1,Setvar(originalnum=${EXTEN})
exten => _0180.,2,Agi(0180lookup.agi|${EXTEN})					; in 0180.info-db nachschauen, ob andere Rufnummer vorhanden
exten => _0180.,3,GotoIf($[${dblookupnumber} = ${originalnum}]?5)		; Alternativ-Nummer gefunden ?
exten => _0180.,4,Goto(nulleinsachtnullauswahl,s,1)				; Wenn ja -> in Auswahl-Context
exten => _0180.,5,Goto(capiout,0${originalnum},1)				; Wenn nein -> 0180-Nr. über Capi wählen


[nulleinsachtnullauswahl]
exten => s,1,SendText('1:'${dblookupnumber}' 2:'${originalnum})		; Auswahlmöglichkeiten auf Display des Tel anzeigen
exten => s,2,ResponseTimeout(4)							
exten => s,3,DigitTimeout(1)							
exten => s,4,Background(alternativ)						; Ansagen und auf Auswahl warten
exten => s,5,SendText('1:'${dblookupnumber}' 2:'${originalnum})		; Auswahlmöglichkeiten auf Display des Tel anzeigen

exten => 1,1,Goto(sipout,${dblookupnumber},1)					; Auswahl 1 für alternative FN
exten => 2,1,Goto(capiout,0${originalnum},1)					; Auswahl 2 für 0180 über Capi

exten => t,1,Goto(1,1)

exten => i,1,Goto(_0180.,6)

Jetzt muß nur noch die CSV-Datei gefixt werden, damit man auch wirklich auf alle Einträge darin zugreifen kann. Ich werde sie mir mal ansehen...

EDIT 1:12

Hm, also die CSV-Datei scheint OK zu sein - Excel kann sie zumindest ohne Fehler importieren.

Kommt der Fehler mit der Samsung-Testnummer (01805-121213) vielleicht daher, daß zu dieser Nummer zwei Alternativ-Einträge vorhanden sind ?
 
ich habe mal versucht die csv datei in ms-access zu importieren, da gabe es einige fehler - muss ich mir noch mal anschauen
 
Habe noch einen Bug gefunden:
Das Script funzt bei mir nur, wenn ich von einem ZapHFC-Device aus einen Anruf tätige. Von einem SIP-Device aus geht es nicht. Der Aufruf ist identisch (es wird derselbe Kontext benutzt), auch in der CLI sieht es gleich aus. Nur mit dem Unterschied, daß das Script bei SIP keine Alternativ-Nummer zurückzuliefern scheint. (Testnummer war in beiden Fällen gleich)

Anruf mit ISDN Tel (ZapHFC)
Code:
    -- Executing SetVar("Zap/1-1", "originalnum=01803250335") in new stack
    -- Executing AGI("Zap/1-1", "0180lookup.agi|01803250335") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/0180lookup.agi
    -- Accepting voice call from '2000' to '01803250335' on channel 0/1, span 1
    -- AGI Script 0180lookup.agi completed, returning 0
    -- Executing GotoIf("Zap/1-1", "0?5") in new stack
    -- Executing Goto("Zap/1-1", "nulleinsachtnullauswahl|s|1") in new stack
    -- Goto (nulleinsachtnullauswahl,s,1)
    -- Executing GotoIf("Zap/1-1", "0?3") in new stack
    -- Executing SendText("Zap/1-1", "1:04419265 2:01803250335") in new stack
    -- Executing ResponseTimeout("Zap/1-1", "4") in new stack
    -- Set Response Timeout to 4
    -- Executing DigitTimeout("Zap/1-1", "1") in new stack
    -- Set Digit Timeout to 1
    -- Executing BackGround("Zap/1-1", "alternativ") in new stack
    -- Playing 'alternativ' (language 'de')
    -- Executing SendText("Zap/1-1", "1:04419265 2:01803250335") in new stack

Anruf mit Sip-Telefon (X-Lite & ATA 286 probiert)
Code:
    -- Executing SetVar("SIP/fux2-020c", "originalnum=018053250335") in new stack
    -- Executing AGI("SIP/fux2-020c", "0180lookup.agi|018053250335") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/0180lookup.agi
    -- AGI Script 0180lookup.agi completed, returning 0
    -- Executing GotoIf("SIP/fux2-020c", "1?5") in new stack
    -- Goto (fux,018053250335,5)
    -- Executing Goto("SIP/fux2-020c", "capiout|0018053250335|1") in new stack
    -- Goto (capiout,0018053250335,1)
    -- Executing Macro("SIP/fux2-020c", "capicall|42|0018053250335") in new stack
    -- Executing SetCIDNum("SIP/fux2-020c", "42") in new stack
    -- Executing LookupCIDName("SIP/fux2-020c", "") in new stack
    -- Changed Caller*ID to "Fux Home" <42>
    -- Executing Monitor("SIP/fux2-020c", "wav|20050414-010123-42-0018053250335|m") in new stack
    -- Executing GotoIf("SIP/fux2-020c", "0?6") in new stack
    -- Executing SendText("SIP/fux2-020c", "ISDN:0018053250335") in new stack
    -- Executing Dial("SIP/fux2-020c", "CAPI/42:b0018053250335|60") in new stack

Hast du eine Ahnung, woran das liegt ?
 
das ist merkwürdig, ich habe es bis jetzt nur über sip probiert - werde heute abend wohl mal noch die capi und zap anschlüsse prüfen;
Z.Z habe ich noch keine Idee woran es liegen könnte

EDIT:

habe es auch noch mal probiert und du hast recht *kopfeinzieh* es wir keine nummer zurück geliefert.
seltsamerweise funkioniert es wenn ich vor jedes set_variable ein print "\n"; setzte *gr*
Hier noch mal der code:
Code:
#!/usr/bin/perl -w

#0180 dblookup AGI extension. 
#(C) 2005 by Marcello Ceschia
#(C) 2005 by Marcello (dot) Ceschia (at) smiledesigns (dot) de
#Released under the GNU General Public License 
# 
#This script will dial an alternative nummber according to it's 0180 dbentry
#Use it in your extensions.conf like this: 
#
#  exten => _*0.,1,Agi(0180lookup.agi|${EXTEN:2}) 
#  exten => _*0.,2,SendText(${dblookupfirm}) 
#  exten => _*0.,3,Dial(SIP/${dblookupnumber}@sip.provider.com) 
# 
#/var/lib/asterisk/database is the base dir for the db
#and db0180 is the default table name 
#specified in the constant $datebasedir and $table below. 

use Asterisk::AGI;
use DBI;
use strict;

#############
# Settings: #
#############
my $table = "db0180";
my $datebasedir = "/var/lib/asterisk/database";
my $debug = 1;
my $original = $ARGV[0];



sub addtonumber
{
   my $i;
   my $temp = $_[$i];
   my $t0180 = substr($temp,0,5)."-".substr($temp,5,length($temp));
   return $t0180;
}

sub clearfromnumber
{
   my $i;
   my @teile = split(/\-/,$_[$i]);
   my $tnormal = $teile[0]."".$teile[1];
   return $tnormal;
}

my $agi = new Asterisk::AGI;
# my %agi_env = $agi->ReadParse;
$agi->answer;
my $dbh = DBI->connect("DBI:CSV:f_dir=$datebasedir;csv_eol=\n;csv_sep_char=\\;;csv_quote_char=\";csv_escape_char=\n");
my $query = "SELECT firma, t0180, tnormal FROM $table WHERE t0180 = '".addtonumber($ARGV[0])."'";
my $sth = $dbh->prepare($query);
$sth->execute() or die $sth->errstr;
print $query."\n";
print $sth->rows();
if($sth->rows() > 0){
	my @data = $sth->fetchrow_array;
#  	print "Firma: $data[0] \nt0180: $data[1]\nnormal: $data[2]\n";
  	print "\n";
	$agi->set_variable("dblookupnumber", clearfromnumber($data[2]));
	$agi->set_variable("dblookupfirm", $data[0]);
}
else
{
	print "\n";
	$agi->set_variable("dblookupnumber", $ARGV[0]);
}
$sth->finish();
$dbh->disconnect();
 
Ja, das tut es.

Bliebe nur noch das Problem mit der Tabelle.
Komisch ist, daß sie sich problemlos in Excel importieren läßt.
Habe sie mir dann dort angesehen und konnte nix besonderes feststellen.
 
Hi
ich reaktiviere mal den thread.
Gibt es aktuell eine einbindung des 0180-telefonbuchs.
Aktuell gibt es ja keinen export der gesamten 0180er nummern - dafür soll enum gehen - ich kriege es aber nicht hin.
Kann da jemand einen tip geben?

Gruß
Thorsten
 
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.