Rückwärtssuche bei dasoertliche.de neues Script

Neue Version: Jetzt auch Spanien

So, es gibt wie versprochen etwas technisch neues: Das Skript kann jetzt auch in MYSQL cachen und - Nutzer von LCR-Tools wird das bekannt vorkommen, seine Parameter einschließlich Rufnummernauflösung zu Land/Netz/Ort/Region aus MYSQL beziehen.
Die notwendigen MYSQL-Tabellen, wie sie in dem Skript verwendet werden, sind als mysqldump beigefügt, Einspielung über

Code:
mysql <database> < dump.sql

Nicht erschrecken: Die exten-Tabelle, die für die Zuordnung Rufnummer-Zieltext zuständig ist, hat über 170.000 Einträge, sie enthält die ganze Welt und insbesondere für USA/CA die komplette Auflösung der Ortsnetze nach aktuellem Stand (mit AreaCode und ExchangeCode). Gleichfalls komplett ist Russland und überwiegend komplett Kasachstan (je incl. Mobilfunk). Wem das zuviel ist, kann das natürlich jederzeit einkürzen.

@kombjuder: Wenns für die Frau ist- Bitteschön, hier mit Spanien :cool:

Allerdings ist die reine Spanien-Abfrage jetzt php, das in ast_revers_agi angesprochen wird (alles notwendige ist im File). Dank des äußerst "intelligenten" Seitenaufbaus in Kombination mit meinen begrenzten Bash-Fähigkeiten ist es mir nicht gelungen, das ganze in Bash zu tun.

Das PHP-Teil stammt im übrigen aus meinem eigentlichen Projekt, das komplett in PHP ist.

Zu den spanischen Privateinträgen: Mit Trick 17 könnte man da was machen, allerdings dauert die Suche dann (ich sag nur: Mit der gefundenen PLZ oder dem Ort kann man dann vorwärts suchen und die Rufnummer hat man ja :p) und ich werd' mal bei Gelegenheit testen, ob man da asynchron was machen kann, so dass der Cache nachträglich aktualisiert wird.

Falls jemandem eine bash-Umsetzung der spanien.php gelingen sollte, die wird sicher auch von kasper-ls gern genommen.
 

Anhänge

  • ast_revers.tar.bz2
    27.9 KB · Aufrufe: 42
  • dump.sql.bz2
    682.8 KB · Aufrufe: 31
Zuletzt bearbeitet:
@kombjuder: Wenns für die Frau ist- Bitteschön, hier mit Spanien :cool:

Bin ich mal wieder zu ungeschickt, was zu installieren, oder wieso sagt das Programm:

Code:
asterisk:/var/lib/asterisk/agi-bin # ./ast_revers.agi 0034911876717 (=Fantasienummer)
PHP Notice:  Undefined variable: STREET in /var/lib/asterisk/agi-bin/spanien.php on line 70
PHP Notice:  Undefined variable: ZIP in /var/lib/asterisk/agi-bin/spanien.php on line 70
PHP Notice:  Undefined variable: CITY in /var/lib/asterisk/agi-bin/spanien.php on line 70
SET VARIABLE LONGNAME "kein Eintrag"
SET VARIABLE LONGDETAILS "keine Adresse"
 
Lag nicht an Dir, der Fehler stammt wieder mal von mir (copy&paste).
Hier noch mal die korrigierte spanien.php

PHP:
#!/usr/bin/php -q
<?php

require_once("classes/class_HTTPRetriever.php");
include_once("classes/snoopy.class.php");
include_once("classes/htmlsql.class.php");


        $CHNUM=$argv[1];
        $NAME='';$STREET='';$CITY='';$ZIP='';
        $fields = array(
                        'inphCoordType' => 'EPSG',
                        'qPhone' => $CHNUM,
                        'SubmitREV' => 'Suchen'
                        );
        $tb = &new HTTPRetriever();
        if (!$tb->post("http://www.infobel.com/de/spain/Inverse.aspx?q=Spanien",$tb->make_query_string($fields))) {
                echo "HTTP request error: #{$tb->result_code}: {$tb->result_text}";
        }
        $charset=strtolower(preg_replace('/^.*\=/','',$tb->stats['content_type']));
        $wsql = new htmlsql();
        $wsql->connect('string', $tb->response);
        $wsql->query('SELECT * FROM h3 where preg_match("/^[1-9].*/", $text)');
        foreach($wsql->fetch_array() as $item){
                $NAME=preg_replace('/^[1-9]\.\ +/','',preg_replace('/\&amp\;/','&',strip_tags($item['text'])));
                if ($charset != 'utf8') {
                        $NAME=preg_replace('/[^[:print:]]/',' ',$NAME);
                        $NAME=utf8_encode($NAME);
                }
                if ( preg_match('/^[^X][^X]/',$NAME)) {
                        $NAME=ucwords(strtolower($NAME));
                        break;
                }
        }
        $wsql->query('SELECT * FROM td where preg_match("/InfoItemNoPack/", $class)');
        foreach($wsql->fetch_array() as $item){
                if ($charset != 'utf8') {
                        $TEMP=preg_replace('/[^[:print:]]/',' ',$item['text']);
                        $TEMP=utf8_encode($TEMP);
                }
                $TEMP=preg_replace('/\<.*/','',$TEMP);
                $parts = explode(',', $TEMP);
                if ( preg_match('/^[0-9]{5}\ /', $parts[0])) {
                        $parts = explode(' ', $TEMP);
                        $ZIP=$parts[0];
                        $CITY='';
                        for ($i=1;$i<count($parts);$i++) {
                                $CITY=$CITY." ".$parts[$i];
                        }
                        $CITY=substr($CITY,1);
                } else {
                        $STREET=ucwords(strtolower($parts[0]));
                        $parts = explode(' ', preg_replace('/^\s+/','',$parts[1]));
                        if (count($parts)>0) {
                                if (preg_match('/^[0-9]{5}\ /', $parts[0])) {
                                        $ZIP=$parts[0];
                                        $CITY='';
                                        for ($i=1;$i<count($parts);$i++) {
                                                $CITY=$CITY." ".$parts[$i];
                                        }
                                        break;
                                } else {
                                        $CITY=preg_replace('/^\s+/','',$parts[0]);
                                }
                        }
                }
        }

print "$NAME|$STREET|$ZIP $CITY"
?>

Geändert hat sich nur die Zeile

PHP:
$NAME='';$STREET='';$CITY='';$ZIP='';

die die Variablen initialisiert, da standen andere Variablen und schwubs - war der Fehlerteufel erfolgreich :mad:
 
...
Ausserdem vermisse ich Anrufliste_log aus dem Originalscript (Kann sein ich bn nur zu blöd es zu finden.)

Das ist richtig, es ist kein Anrufliste integriert.
Wie soll den so eine Liste aussehen?
Hast du vielleicht ein Beispiel?
 
Hast du vielleicht ein Beispiel?

Datum, Uhrzeit, Rufnummer, Name

Also alles Sachen, die schon in Variablen hinterlegt sind.

Hintergrund: Ich habe meinen Asterisk angewiesen, Nachts nur einige bestimmte Rufnummern durchzulassen, der Rest bekommt eine Ansage, die Rufnummer wäre falsch.

Das heisst, ich sehe nächtliche Anruf auf keinem Telefon und die asteriskeigenen Logs sind nicht gerade konfortabel zu lesen. Ausserdem sehe ich, ob jemand einmal oder 20 mal angerufen hat.
 
Neue Version.

- Anruf Log kann eingeschaltet werden
- Pfad zu externe Suchmaschinen (z.B. spanien.php) kann konfiguriert werden
- im TAR Archiv ist alles enthalten (README, mysql-dump, spanien.php)

Zukunft:
- auslagern aller Suchscripts


@abw1oim kannst du mir den genauen Aufbau vom Inhalt "TEMP" wie es das spanien.php übermittelt mitteilen?
Wo muss der "classes-Ordner" hin kopiert werden?
 

Anhänge

  • ast_revers.agi-0.1_2007.04.28.tar.bz2
    713.3 KB · Aufrufe: 558
Fehler im Skript - auf einem anderen Server läufts

Hey,
vielleicht stelle ich mich nur doof an... will es nicht ausschließen... ;-)
Auf einem Server (SuSi 10) funktioniert das Skript einwandfrei,
starte ich es auf einem Debian-System bekomme ich folgende Fehlermeldung:

./ast_revers.agi: line 175: conditional binary operator expected
./ast_revers.agi: line 175: syntax error near `=~'
./ast_revers.agi: line 175: ` if [[ "$NUMMER" =~ ^\+.* ]]; then'

habe die Datei auf beiden Systemen entpackt und aufgerufen. Auf dem einem geht es, auf dem anderen nicht... irgendeine Idee was evtl. hier fehlt?

Gruß
Alex
 
Hallo.

Ich selber Test auf einem Debian Etch System.
Welche Debian- und Bash- Version nutzt du?

Code:
bash --version
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
 
Code:
GNU bash, version 2.05b.0(1)-release (i386-pc-linux-gnu)
Copyright (C) 2002 Free Software Foundation, Inc.
 
Da stellst Du dich wahrscheinlich nicht zu doof an :rolleyes:

Das Problem dürften unterschiedliche bash-Versionen sein, die mit den Regex unterschiedlich umgehen. (siehe auch kasper-ls)

Zu
Code:
if [[ "$NUMMER" =~ ^\+.* ]]; then

kann man alternativ auch nehmen:

Code:
TMP=`echo $NUMMER | sed -e s/^+//`
if [ "$NUMMER" != "$TMP" ] then

Für alle, bei denen entsprechende Fehler auftauchen, müssen die Regex an allen Stellen entsprechend umgebaut werden. Leider ist das jeweilige Auflösen der Regex durch entsprechende sed-Aufrufe langsamer, weshalb es nur im Fehlerfall gemacht werden sollte.

Hier nochmal die komplette Funktion ohne bash-regex (mit der Bitte um Test, ist jetzt nur schnell zusammengehackt :mad:):

Code:
## Nummer Normalisierung auf internationales Formaat mit +<CC><NDC><SN>
function normalisierung {
        # Leerzeichen raus
        NUMMER=`echo $NUMMER | sed -e "s/\ //g"`
        # Pruefen auf +
        TMP=`echo $NUMMER | sed -e s/^\+//`
        TMP2=`echo $NUMMER | sed -e s/^$IAC//`
        TMP3=`echo $NUMMER | sed -e s/^$NAC//`
        if [ "$NUMMER" != "$TMP" ]; then
                # eigener IAC und eigener CC und eigener NDC
                TMP=`echo $NUMMER | sed -e s/^\+$CC$NDC//`
                TMP2=`echo $NUMMER | sed -e s/^\+$CC//`
                if [ "$NUMMER" != "$TMP" ]; then
                        NUM=`echo $NUMMER | sed -e "s/^\+$CC$NDC//"`
                 # eigener IAC und eigener CC
                elif [ "$NUM" != "$TMP2" ]; then
                        NUM=`echo $NUMMER | sed -e "s/^\+$CC$NDC/$NAC/"`
                else
                        NUM=`echo $NUMMER | sed -e "s/^\+/$IAC/"`
                fi
        # Pruefen auf eigenen IAC
        elif [ "$NUMMER" != "$TMP2" ]; then
                # eigener IAC und eigener CC und eigener NDC
                TMP=`echo $NUMMER | sed -e s/^$IAC$CC$NDC//`
                TMP2=`echo $NUMMER | sed -e s/^$IAC$CC//`
                if [ "$NUMMER" != "$TMP" ]; then
                        NUM=`echo $NUMMER | sed -e "s/^$IAC$CC$NDC//"`
                # eigener IAC und eigener CC
                elif [ "$NUMMER" != "$TMP2" ]; then
                        NUM=`echo $NUMMER | sed -e "s/^$IAC$CC/$NAC/"`
                else
                        NUM=$NUMMER
                fi
                NUMMER=`echo $NUMMER | sed -e "s/^$IAC/+/"`
        # Pruefen auf long distance domestic
        elif [ "$NUMMER" !=  "$TMP3" ]; then
                TMP=`echo $NUMMER | sed -e s/^$NAC$NDC//`
                if [ "$NUMMER" != "$TMP" ]; then
                        NUM=`echo $NUMMER | sed -e "s/^$NAC$NDC//"`
                else
                        NUM=$NUMMER
                fi
                NUMMER=`echo $NUMMER | sed -e "s/^$NAC/+$CC/"`
        # Local Call
        else
                NUM=$NUMMER
                NUMMER=+$CC$NDC$NUMMER
        fi
        echo "Normalisierung der Rufnummer: " >> $LOGFILE
        echo "Rueckwahlform der Nummer (NUM) : $NUM (gueltig fuer Land $CC und Ortsnetz $NDC)"  >> $LOGFILE
        echo "Internationale Form der Nummer : $NUMMER" >> $LOGFILE
}

Es möge nützen


Edit 02.06.2008:

Es hatte sich im Code eine doppelte [ eingeschlichen, hiermit korrigiert
 
Zuletzt bearbeitet:
so, ende des frust mit den US Nummern

ich habe stundenlang versucht, den Fehler im Script zu finden... hier ist die Antwort:
Wenn ihr USA oder auch Canada suchen startet, dann muss die Abfrage mit der regulären Expression so aussehen:

if [[ "$NUMMER" =~ "^\+${CC[$index]}$i.*" ]]; then

man kann den Unterschied fast nicht feststellen, aber die RegEx muss bei einem SuSE 10.1 System die Gänsefüsschen vor- und nachgestellt haben. Und zwar nicht nur bei $NUMMER, sondern ebenfalls bei der RegEx selber !!!!!

dann läufts prima... (bei mir :) )
 
@merkc

Danke für den Tipp.
Werde bei einer überarbeitung das mit aufnehmen.
Die dieverse Landes Such Funktionen kann ich leider nicht testen.
Vielleich benötigt man mal eine Test-Nummern Liste :)
 
Hallo,

ich hab die aktuelle ast_reverse.agi.tar nach

var/lib/asterisk/agi-bin entpackt.
Ich benötige nur die Cache-File Variante.

meine extensions.conf sieht so aus :

Code:
[incoming]
include => default

exten => 0441212121,1,Set(LANGUAGE()=de)
exten => 0441212121,2,Ringing()
exten => 0441212121,3,AGI(ast_revers.agi)
exten => 0441212121,4,Set(CALLERID(number)=${CID})
exten => 0441212121,5,Set(CALLERID(name)=${NAME})
exten => 0441212121,6,Dial(SIP/10,${localdialtimeout},t)
exten => 0441212121,7,Congestion()
exten => 0441212121,8,Wait(10)
exten => 0441212121,9,Hangup()

bei einem eingehenden Anruf wird alerdings nix angezeigt.


Code:
asterisk*CLI>
    -- Executing Set("SIP/0441212121-ad46", "LANGUAGE()=de") in new stack
    -- Executing Ringing("SIP/0441212121-ad46", "") in new stack
    -- Executing AGI("SIP/0441212121-ad46", "ast_revers.agi") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/ast_revers.agi
    -- AGI Script ast_revers.agi completed, returning 0
    -- Executing Set("SIP/0441212121-ad46", "CALLERID(number)=") in new stack
    -- Executing Set("SIP/0441212121-ad46", "CALLERID(name)=") in new stack
    -- Executing Dial("SIP/0441212121-ad46", "SIP/10|120|t") in new stack
    -- Called 10
    -- SIP/10-125e is ringing

hab ich da was übersehen ?
 
Hast Du: Dem Skript fehlt die zu untersuchende Rufnummer.
Mach mal aus

exten => 0441212121,3,AGI(ast_revers.agi)

Code:
exten => 0441212121,3,AGI(ast_revers.agi|${CALLERID(num)})

Dann kann das Skript auch etwas suchen.
 
hallo abw1oim

danke für die Hilfe,

die angepasste version :

Code:
exten => 0441212121,1,Set(LANGUAGE()=de)
exten => 0441212121,2,Ringing()
exten => 0441212121,3,AGI(ast_revers.agi|${CALLERID(num)})
exten => 0441212121,4,Dial(SIP/10,${localdialtimeout},t)
exten => 0441212121,5,Congestion()
exten => 0441212121,6,Wait(10)
exten => 0441212121,7,Hangup()

ergibt :

Code:
    -- Executing Set("SIP/0441212121-5414", "LANGUAGE()=de") in new stack
    -- Executing Ringing("SIP/0441212121-5414", "") in new stack
    -- Executing AGI("SIP/0441212121-5414", "ast_revers.agi|0795000000") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/ast_revers.agi
    -- AGI Script ast_revers.agi completed, returning 0
    -- Executing Dial("SIP/0441212121-5414", "SIP/10|120|t") in new stack
    -- Called 10
    -- SIP/10-cde8 is ringing

da fehlt immer noch was ? ;-)
 
Zuletzt bearbeitet:
Na, jetzt hast Du ja auch die Betrachtung der Variablen, die das Skript zurückliefert, ausgeschaltet, dann kann da auch nichts kommen. (BTW: Asche auf mein Haupt :mad:! Ich hatte in Deinem ersten Dialplan übersehen, dass Du die erwarteten Rückgabewerte falsch benutzt)

Mit folgendem Dialplan solltest Du Erfolg haben:

Code:
exten => 0441212121,1,Set(LANGUAGE()=de)
exten => 0441212121,2,Ringing()
exten => 0441212121,3,AGI(ast_revers.agi|${CALLERID(num)})
[B]exten => 0441212121,4,Set(CALLERID(name)=${LONGNAME})[/B]
exten => 0441212121,5,Dial(SIP/10,${localdialtimeout},t)
exten => 0441212121,6,Congestion()
exten => 0441212121,7,Wait(10)
exten => 0441212121,8,Hangup()

In der hier veröffentlichten Variante werden zwei Variablen gesetzt:
${LOGNAME} - enthält den gefundenen Namen oder "kein Eintrag"
${LONGDETAILS} - enthält die gefundene Adresse oder "kein Eintrag"

Die CALLERID(num) wird zwar vom Skript benötigt, innerhalb des Skripts normalisiert und lokalisiert, jedoch nicht zurrückgegeben.

Wenn Du das möchtest, müsstest du im Skript in function asterisk folgendes hinzufügen:

Code:
echo "SET VARIABLE LOCALNUM "\"$NUM\"" >/dev/stdout

Dann wäre Deine lokalisierte rückwahlfähige Anrufernummer in Asterisk über

${LOCALNUM} benutzbar, etwa mit

Code:
exten => 0441212121,1,Set(LANGUAGE()=de)
exten => 0441212121,2,Ringing()
exten => 0441212121,3,AGI(ast_revers.agi|${CALLERID(num)})
exten => 0441212121,4,Set(CALLERID(name)=${LONGNAME})
[B]exten => 0441212121,5,Set(CALLERID(num)=${LOCALNUM})[/B]
exten => 0441212121,6,Dial(SIP/10,${localdialtimeout},t)
exten => 0441212121,7,Congestion()
exten => 0441212121,8,Wait(10)
exten => 0441212121,9,Hangup()
 
Mit folgendem Dialplan solltest Du Erfolg haben:

hab es nun so angepasst .. jedoch "noch" ohne erfolg.

Ich habe so langsam das gefühl das script wird überhaupt nicht ausgeführt.

Obwohl ich die log eingeschaltet habe wird nicht's eingetragen. (777)


edit : die "ast_revers.agi_log" und der cache.txt wurden beim ersten Eingehenden anruf automatisch erstellt.

Liegt es vielleicht an meiner version ?
* 1.2.9.1-BRIstuffed-0.3.0-PRE-1r
 
Zuletzt bearbeitet:
hab es nun so angepasst .. jedoch "noch" ohne erfolg.

Ich habe so langsam das gefühl das script wird überhaupt nicht ausgeführt.

Obwohl ich die log eingeschaltet habe wird nicht's eingetragen. (777)


edit : die "ast_revers.agi_log" und der cache.txt wurden beim ersten Eingehenden anruf automatisch erstellt.

Liegt es vielleicht an meiner version ?
* 1.2.9.1-BRIstuffed-0.3.0-PRE-1r



Wenn ich das Script aus der Konsole aufrufe

./ast_revers.agi 04415151515

bekomm ich folgende Fehlermeldung :

Code:
./ast_revers.agi: line 184: syntax error in conditional expression
./ast_revers.agi: line 184: syntax error near unexpected token `;'
./ast_revers.agi: line 184: `                elif [[ "$NUM" != "$TMP2" ]; then'

Ich habe die änderungen bzgl. bash-Versionen von obigem Post schon eingefügt.
 
Sorry, da hast Du jetzt in meinem damals schnell getippten Alternativvorschlag auch direkt einen Syntaxfehler gefunden:

./ast_revers.agi: line 184: ` elif [[ "$NUM" != "$TMP2" ]; then'

saht aiuch schon, was falsch ist. Tausch mal die Zeile (184) aus gegen die Korrektur

Code:
elif [ "$NUM" != "$TMP2" ]; then

dann ist der Fehler weg. Das kommt vom schnellen Tippen :mad:

Letztlich ist die doppelte öffnende [ schuld, das es (noch) nicht funktioniert.
 
184 is oke ;-)

upps :

Code:
./ast_revers.agi: line 233: conditional binary operator expected
./ast_revers.agi: line 233: syntax error near unexpected token `=~'
./ast_revers.agi: line 233: `                                           if [[ "$NUMMER" =~ ^\+${CC[$index]}$i.* ]]; then'
 
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.