Caller ID name et annuaire inversé

Fonction

Asterisk par défaut, utilise sa base de données intégrée pour l’association des numéros de téléphone (callerid(num)) avec les noms (callerid(name)). Il s’agit des entrées cidname (faire un database show pour les voir).

Lors de la réception d’un appel, on vérifie s’il y a un numéro (que l’appel n’est pas masqué), et on recherche dans la base de données Asterisk s’il y a un nom associé.

S’il y en a pas, alors on appelle le script AGI qui va faire une requète sur un site Web d’annuaire inversé.

Lors du retour du script, si il y a eu un nom récupéré, alors il est ajouté a la base de données.

Script AGI

Attention le script ci-dessous n’est plus à jour mais permet de voir son fonctionnement. La version correcte est fournie dans le lien plus bas.

Voici le script inspiré de divers scripts disponibles sur Internet (en entrée: $number, en sortie: $name). Ce n’est plus qu’un exemple car les pages Web ont changées entre temps et il ne fonctionne plus tel quel. Les scripts adaptés sont dispo en téléchargement.

#!/usr/bin/perl -w

use strict;
use warnings;
use LWP 5.64;
use Asterisk::AGI;

require HTTP::Cookies;

# initialize the AGI module and read incoming arguments
my $AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();

# init the Web agent
my $browser = LWP::UserAgent->new;

# extract the caller ID
my $callerid = $AGI->get_variable('number');

# if the caller ID is in "name"  form, extract the number 
$callerid = $1 if $callerid =~ //;

# remove all other non-digits
$callerid =~ s/[^\d]//g;

# look the normalized number up
my $caller = do_lookup($callerid);

if($caller) {
        # finally, pass the name along with the normalized number
        # back to Asterisk, if lookup was successful
        #$AGI->set_callerid("\"$callerid \"");
        #$AGI->exec('Set', "name=\"\"$caller\"\"");
	$AGI->set_variable('name',$caller);
}
 
# we don't have to do anything if we don't change the caller ID
exit 0;
sub do_lookup {
  my $callerid = shift;
  my $caller = undef;
  my $url = 'http://www.pagesjaunes.fr/quidonc/aquiestcenumero.do';

  $browser->agent('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1');
  $browser->cookie_jar(HTTP::Cookies->new(file => "$ENV{HOME}/.cookies.txt"));
  $browser->timeout(3);

  my $response = $browser->post( $url,
    [ 'actionForwardName' => 'reponseIN',
      'numeroTelephone' => $callerid,
      'x' => '44',
      'y' => '21'
    ]
  );

  die "$url error: ", $response->status_line
   unless $response->is_success;

  die "Weird content type at $url -- ", $response->content_type
   unless $response->content_type eq 'text/html';

  #print $response->content;

  if( $response->content =~ m{\???(.*)\} ) { 
     $caller = $1;

     $caller =~ s/ *$//;
  }
  return $caller;
}

 

Vous pouvez récupérer la nouvelle version du script ici:

 

 

Version annuaire Free

J’ai aussi écrit une version semblable pour l’annuaire Free (accessible seulement pour les abonnés Free), qui permet de retrouver les noms associés au numéro commençant en 09. Normalement cela ne devrait pas être utile car Free envoie les noms avec les numéros dans le caller id.

Voici le script associé:

 

 

Extensions

Dans le contexte d’arrivée on récupère le CallerID

exten => s,n,Gosub(in-get-cid,s,1)

Mais aussi dans le contexte de sortie on peut nom de l’appelé (CallingID), et le présenter sur les téléphones qui le supporte (Cisco79XX par exemple en SCCP avec la fonction SetCallingParty()).

exten => _X.,1,Set(number=${EXTEN})
exten => _X.,n,Gosub(out-get-cid,s,1)

Contextes

[in-get-cid]
exten => s,1,GotoIf($["foo${CALLERID(number)}" = "foo"]?ret); no CID 
exten => s,n,GotoIf($["foo${CALLERID(number)}" = "fooptsn"]?ret)
exten => s,n,GotoIf(${DB_EXISTS(cidname/${CALLERID(number)})}?indb) ; already in DB
exten => s,n,GotoIf($[${LEN(${CALLERID(number)})} != "10"]?ret) ; call YP 
exten => s,n,Set(number=${CALLERID(number)}) 
exten => s,n,AGI(pages_blanches.agi) 
exten => s,n,Set(CALLERID(name)=${name}) 
exten => s,n,GotoIf($["foo${CALLERID(name)}" = "foo"]?ret) ; no result 
exten => s,n,GotoIf($["foo${CALLERID(name)}" = "fooPTSN"]?ret) 
exten => s,n,Set(DB(cidname/${CALLERID(num)})=${CALLERID(name)}) ; update CID 
exten => s,n,Set(CALLERID(name)=${CALLERID(name)}) 
exten => s,n,Goto(ret) 
exten => s,n(indb),Set(CALLERID(name)=${DB(cidname/${CALLERID(num)})}) ; update CID 
exten => s,n(ret),Return()
[out-get-cid]
; in: number
exten => s,1,GotoIf($[${DB_EXISTS(cidname/${number})} != 0]?indb)
exten => s,n,GotoIf($[${LEN(${number})} != 10]?ret)
exten => s,n,NoOp(${number})
exten => s,n,AGI(pages_blanches.agi)
exten => s,n,NoOp(${name})
exten => s,n,GotoIf($["foo${name}" = "foo"]?ret)
exten => s,n,Set(DB(cidname/${number})=${name})
exten => s,n,SetCalledParty("${name} ")
exten => s,n,Goto(ret)
exten => s,n(indb),SetCalledParty("${DB(cidname/${number})} ")
exten => s,n(ret),Return()