Automatisch 0180-Rufnummern ersetzen

thorsten.gehrig

Mitglied
Mitglied seit
14 Jun 2004
Beiträge
493
Punkte für Reaktionen
0
Punkte
16
Hallo,
nachdem das "Reverse-lookup-Script" ja scheinbar sehr häufig eingesetzt wird möchte ich euch nun an meiner neuen "Erungenschaft" partizipieren lassen:
Das 0180-geht-auch-Billiger-Script :)

Hintergrund: auf http://www.tk-anbieter.de/0180/ kann man für 0180er Rufnummern nach billigen alternativrufnummern suchen.
Es ging wohl mal per ENUM - leider wohl aber (seid langem) nicht mehr. Daher musste ich dafür wieder HTML-content durchsuchen...

Die Routione funktioniert so, dass bei 0180er-Rufnummern automatisch nach alternativen gesucht wird. Wenn eine gefunden wird, bekommt der Teilnehmer eine Ansage "es wurde eine alternativrufnummer gefunden - bitte drücken Sie die 1 zum wählen der alternativen Rufnummer oder drücken Sie die 2 zum wählen der originalen Rufnummer". Beim auswählen der altenativrufnummer wird diese vor dem Wählen Angesagt...
Alternativrufnummern werde automatisch in einem Cache gespeichert (der auch manuell "befüllbar" ist). Stehen mehrere Alternativrufnummern zur auswahl wird nur die erste genommen (soll eine andere genommen werden ist dies manuell in die cachedatei einzufügen).

Extensions.conf
Code:
; 0180-Context
exten => _00180.,1,Set(NUM1=${EXTEN})
exten => _00180.,2,Set(NUM2=${EXTEN:1})
exten => _00180.,3,Set(NUM2_FOUND="FALSE")
exten => _00180.,4,AGI,0180.agi|${NUM2}
exten => _00180.,5,Noop(${NUM2} - ${NUM2_FOUND})
exten => _00180.,6,GotoIf($[${NUM2_FOUND}=TRUE]?0180-auswahl|s,1)
exten => _00180.,7,Dial(SIP/${EXTEN:1}@dusnet,90,T)
exten => _00180.,8,goto,hangup|${HANGUPCAUSE}|1

[0180-auswahl]
;Menü - 1 für alternative Nummer, 2 für normale nummer
exten => s,1,Background(0180auswahl)
exten => s,2,WaitExten(5)
exten => s,3,Goto(0180-auswahl,s,1) ;

; alternative Nummer ansagen und wählen
exten => 1,1,Playback(0180alternativ)
exten => 1,2,saydigits(${NUM2:1})
exten => 1,3,goto(line-out,${NUM2},1)

;2 Gedrückt - wähle Originl
exten => 2,1,Playback(0180original)
exten => 2,2,Dial(SIP/${NUM1:1}@dusnet,90,T)
exten => 2,3,goto,hangup|${HANGUPCAUSE}|1

exten => i,1,Goto(0180-auswahl,1,1) ; gehe zu Nummer 2, schritt 1

und hier das 0180.agi-script
Code:
#!/bin/sh 

#pfad zum cachefile
CACHE="/var/spool/asterisk/0180_cache"

#pfad um das tempfile anzulegen
TMPFILE="/tmp/tmpsuche"
TMPFILE2="/tmp/tmpclir"
NUM2_FOUND="FALSE"

echo "$1-$2-$3" >/tmp/reverse.tmp

    NUMMER=`echo $1 | sed -e "s/\ //g" -e "s/+49/0/"`
    #echo "Suche nach $NUMMER im cache"
    NUM2=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $2 }' $CACHE`
    if [ "$NUM2" == "" ]; then
	wget "http://www.tk-anbieter.de/0180/suche.html?NR=$NUMMER" -O $TMPFILE -q
        NUM2=`grep "&nbsp;<b>"  $TMPFILE |  sed "-e s/\&nbsp\;/\ /g" | sed "-e s/<b>/\ /g" | sed "-e s/<\/b>/\ /g" | awk '{ if (FNR == 1) print $1 }' `

        echo -e "$NUMMER\t$NUM2" >>$CACHE
	
        if [ "$NUM2" == "" ]; then
            NUM2=$NUMMER
        else
	    NUM2_FOUND="TRUE"
	fi;
    else
	NUM2_FOUND="TRUE"
    fi;
    

echo 'SET VARIABLE NUM2 '"\"0$NUM2\"" >/dev/stdout
echo 'SET VARIABLE NUM2_FOUND '"\"$NUM2_FOUND\"" >/dev/stdout

read in

exit 0

Hier gibts noch die 3 Sounddateien für die Ansagen:
http://gehrig.info/ast_sound/0180auswahl.wav
http://gehrig.info/ast_sound/0180original.wav
http://gehrig.info/ast_sound/0180alternativ.wav

Ich bin auf euer Feedback gespannt.

Gruß
Thorsten Gehrig

Edit/Nachtrag:
a)wie man ja an den Codezeilen erkennen kann wird bei mir mit "0" das Amt "geholt" - daher werden bei den ersetzen Rufnummern natürlich auch die 0 davor gesetzt - kann man aber leicht anpassen.
b) In der extensions.conf ist direkt meine SIP-Wahl drinnen... muss sich auch jeder persönlich anpassen.
c) "exten => _00180.,8,goto,hangup|${HANGUPCAUSE}|1" srpingt bei mir in eine Standardansage warum die Verbindung beendet wurde (Besetzt, Nummer ungültig, etc). Dies kann man natürlich durch ein einfaches "Hangup" ersetzen...
 
Zuletzt bearbeitet:
thorsten.gehrig schrieb:
Das 0180-geht-auch-Billiger-Script :)

Besten Dank,

hast du auch eine funktionierende Telefonnummer um das Script zu probieren? Ich habe gerade wohl 30 Nummern erfolglos probiert.

Mit einem NoOp in Zeile 7 kann man dann das ganze Script testen.
 
Hi
Probier mal:
01801112288
01803333227
01801300201
01803333120
01802799799
01801188111
0180122235001
01805354101

Die kannst du auch im Web direkt probieren und siehst dass es alternativnummern gibt - bei mir sind das ca. 70% aller 0180er wo ich alternativnummern bekomme :-D

Gruß
Thorsten
 
thorsten.gehrig schrieb:


Hallo Thorsten,

besten Dank!

Meine Fehler sind beseitigt, läuft jetzt bestens.

Gruß

Karl-Heinz
 
Hi
@Karl-Heinz: irgendwelche Fehler in die andere auch reintappen könnten - oder spezifika deiner Konfiguration?

Gruß
Thorsten
 
thorsten.gehrig schrieb:
Hi
@Karl-Heinz: irgendwelche Fehler in die andere auch reintappen könnten

Jaein, ich habe das Skript an meinen Dialplan angepasst und dabei den Sprung in den anderen Kontext übersehen:
exten => 1,3,goto(line-out,${NUM2},1)

Einmal das Skript komplett durchprobiert, da kam es dann raus.
 
Hi,
danke - war doch ein guter Hinweis. Hätten andere sicherlich auch rienlaufen können...
Kurz zur erklärung: wird eine alternative Rufnummer gewählt springt das script in meinen "normalen" Dial-Out-Kontext (man kann hier sicherlich auch direkt dein Call aufbauen wenn man will - je nachdem was der normale Kontext so macht). Bei der Originalrufnummer MUSS sogar direkt gewählt werden (daher mein SIP/Dusnet-Aufruf) - damit das Script nicht in einer Endlosschleife hängt... (im normalen Kontext würde er bei einer 0180er Nummer ja wieder suchen...)

Gruß
Thorsten
 
Hallo Torsten,
vielen Dank für das Skript.
Ich werde es in den nächsten Tagen ausprobieren.
Leider bin ich kein Asterisk Guru und habe noch ein paar Fragen:
Habe bis jetzt noch nicht mit AGI gearbeitet. Fkt. dies auch mit Asterisk 1.2?
Ist Agi standardmäßig mit dabei oder muss ich irgendwas installieren bzw. beim kompilieren beachten?

Könntest Du in Deiner Extensions.conf noch ein paar Anmerkungen in die entscheidenden Zeilen schreiben, damit man weiß, was es ist.

Vielen Dank

boelkstoff
 
Hi boelkstoff,
a) ja, es müsste auch mit Asterisk 1.2 funktionieren - es werden keine 1.4-spezifischen funktionen verwendet
b) agi ist automatisch mit dabei (ist nicht viel mehr als ein externer aufruf)
c) nö - die extensions.conf ist so "trivial" dass sie selbstsprechend sein sollte. wenn du konkrete fragen hast: immer her damit.

gruß
thorsten
 
@tg

ich hätte 'ne kleine Verbesserung für folgende Zeile:
Code:
NUM2=`grep "&nbsp;<b>"  $TMPFILE |  sed "-e s/\&nbsp\;/\ /g" | sed "-e s/<b>/\ /g" | sed "-e s/<\/b>/\ /g" | awk '{ if (FNR == 1) print $1 }' `
Da glaub ich sind die Anführungszeichen etwas verrutcht.
Mein Ersatz für das Extrahieren der Nummer ist:

Code:
NUM2=`grep "&nbsp;<b>"  $TMPFILE |  sed -e 's,.*<b>,,;s,</b>.*$,,;s,[/ -],,g'|head -1`
Ich glaub awk/FNR macht das gleiche wie "head -1",
die regexps extrahieren die Nummer aus dem HTML.

Blöd ist noch, daß bei mehreren Nummern nur die erste
extrahiert wird. Ich vermute mal, daß 'ne Lösung dafür
nicht in Sicht ist.

Gruß
britzelfix
 
Hi britzelfix
deine lösung funktioniert auch - danke für die zeile...
an einer lösung mehrere ersatzrufnummer zu ermitteln und dem anrufer abzubieten arbeite ich *nicht* - ich finde es nicht sinnvoll dem teilnehmer mehere rufnummern anzubieten weil
a) das sprachinterface dazu schlecht geeignet ist (drücken sie 1 für 08150815, 2 für 47114711....) das wird alles zu lange und unübersichtlich
b) es zu selten vorkommt
c) die bisherige lösung zu 95% eine zufriedenstellende lösung liefert

alleridngs will ich niemanden hindern das script entsprechend zu erweitern... vielleicht kann mich ja doch jemand von der sinnhaftigkeit überzeugen...

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.