• Annuaire inverse Suisse

      Vous avez un asterisk, xivo ou autre chez vous, dans votre entreprise suisse..... ou qui reçoit beaucoup d'appel de la suisse.

      Vous souhaiteriez voir le nom de la personne qui vous appels lorsque vous recevez votre appels......

      Et vous n'avez pas en interne d'annuaire inversé.....

      Bon et bien voici un script qui vous permettra de récupérer les noms des personnes qui vous appels depuis la suisse.



      Le script est volontairement plus large que prévus, quelques fonctionnalités lui seront ajoutée au fur et à mesure que je m'amuse avec.


      Je suis de loin pas un pro des scripts alors un peu de retenue sur vos commentaires néfastes

      je reste à l'écoute bien entendu des améliorations.....

      On commence.......

      Par de l'administratif..... allez sur le lien suivant : search.ch API Key

      Inscrivez-vous, attendez votre clé, et vous pouvez continuer.

      Allez hop on file faire du code

      Allons dans le dossier suivant : /var/lib/asterisk/agi-bin/

      créons un fichier et éditons le au moyen de la commande suivante : vim inverse.agi

      et insérez y le script suivant :

      Code:
      #!/bin/bash
      
      #********************
      #***** Variable *****
      #********************
      
      #Numero de telephone recherche
      NUMBER=$1
      
      #Cle API pour utiliser les services de search.ch
      APIKEYSEARCHCH=METTEZ ICI LA CLE RECU DE SEARCH.CH
      
      #Chemin du fichier temporaire stockant le contact
      TMP=/tmp/CallerIDTempo-$(date '+%Y%m%d%H%M%S')
      
      #Fonction demandee au script 1:Callerid Uniquement
      FUNCT=$2
      
      #Annuaire souhaite pour la recherche : 1 : search.ch
      ANNU=$3
      
      #Variable de stockage du nom du contact
      NAME="Inconnu"
      
      #********************
      #***** Fonction *****
      #********************
      
      function Callerid() {
      		echo "SET CALLERID \"$NAME <$NUMBER>\""
      }
      
      function Searchch() {
                      echo "Recherche dans search.ch"
                      #Recuperation du contact et stockage dans le fichier tempo
                      $(wget -q -O $TMP http://tel.search.ch/api/?was=$NUMBER&key=$APIKEYSEARCHCH)
      
                      #Extraction du contact depuis le fichier tempo
                      NAME=$(cat $TMP| grep -m 1 'content type="text"' | awk -F '>' '{print $2}' | awk -F ',' '{print $1$2}')
      }
      
      #********************
      #****** Script ******
      #********************
      
      #Traitement selon l'annuaire choisit
      case "$ANNU" in
      	1)
      		Searchch
      		;;
      
      	*)
      		echo "Annuaire introuveable, Fermeture du script !!!"
      		exit 1
      		;;
      esac
      
      
      #Controle si un nom est trouve, sinon affectation Inconnu
      if [ "$NAME" = "" ]
      then
      	NAME="Inconnu"
      fi
      
      #tri des fonctions
      case "$FUNCT" in
              1)
                      echo "CallerID Uniquement"
      		Callerid
                      ;;
              2)
                      echo "CallerID et SMS"
      		Callerid
                      ;;
      	3)
      		echo "CallerID et Mail"
      		Callerid
      		;;
      	4)
      		echo "Callerid, Sms, Mail"
      		Callerid
      		;;
      	*)
      		echo "Fonction Introuveable, Fermeture du script !!!"
      		exit 1
      		;;
      esac
      
      #Suppression du fichier Tempo
      $(rm -f $TMP)
      
      exit 0
      ensuite quitter votre editeur et rendre votre script exécutable au moyen de la commande suivante : chmod +u+x inverse_suisse.agi

      voilà voilà..... un petit test :
      Code:
       ./inverse.agi 0229300610 1 1
      devrait vous donner comme résultat :
      Code:
      Recherche dans search.ch
      CallerID Uniquement
      SET CALLERID "Agencement Trosselli SA <0229300610>"
      voilà, cela fonctionne vous êtes content hein ......

      Bon on intègre cela dans son asterisk.... avec ceci comme ligne dans son extensions.conf :
      Code:
      [AppelEntrant]
      exten = _X.,1,NoOp(! ! ! Appel Entrant ! ! !)
      exten = _X.,n,AGI(inverse.agi,${CALLERID(num)},1,1)
      exten = _X.,n,Traitement...Appel

      Et hop c'est parti...... profitez bien de la fonctions.....

      Pour les possesseur d'un Xivo, il vous suffit de mettre le script au même endroit, que mentionné précédemment,

      puis cliquer sur fichier de configuration, ajouter et nommer le fichier : inverse.conf

      Insérez ensuite dedans :

      Code:
      [inverse]
      exten = s,1,NoOp(Recuperation Callerid)
      exten = s,n,AGI(inverse.agi,${CALLERID(num)},1,1)
      exten = s,n,Return()
      cliquer sur sauvegarder

      allez ensuite dans appels entrants, et insérez dans sous routine de prétraitement le mot
      Code:
      inverse
      voilà recharger votre xivo et ce seras ok pour vous ......

      Amusez-vous bien
      Commentaires 10 Commentaires
      1. Avatar de quintana
        quintana -
        C'est fun ça, mais y a pas de limitation de search.ch ?
      1. Avatar de fastm3
        fastm3 -
        Meme reflexion que toi et c'est d'ailleurs pour ca que personne ne publie l'equivalent pour pasgesjaunes ou autre annuaire francais meme si perso, je me permets d'aller chercher les infos a partir des cdrs d'un clic mais manuel.
        Ils sont un peu plus ouverts chez search et autorise cela automatiquement si tu suis le lien dans l'article de Cedric pour obtenir une clé "officielle" et donc legale.
        Neanmoins les conditions et limites sont super vague:
        search.ch SA se réserve le droit de bloquer l'accès API d'un utilisateur à tout moment sans préavis, par exemple si celui enfreint les présentes conditions d'utilisation ou en cas de dépassement d'un nombre d'accès fixé par search.ch SA.
        Mais ils le permettent...
        Fastm3.
      1. Avatar de cedricscha
        cedricscha -
        Oui, y sont ouvert, mais pas trop.....

        ils se limitent pour éviter qu'un centre de télémarketing sortant utilise leur données.....

        je suis en contact avec 118000 chez vous pour le même système.

        on verra bien la reponse finale même si je me fais pas trop d'illusion....
      1. Avatar de remy74
        remy74 -
        J'ai découvert ce post ce matin, et j'ai tenté l'opération. Comme je suis sous FreePBX, inutile de vouloir modifier les fichiers à la main. J'ai donc fait un petit screen de ma config qui semble fonctionner.
        http://imageshack.us/photo/my-images...nuinverse.jpg/
        Aprés un rapide check dans la config, il semble que FreePBX ajoute cette ligne
        Code:
        exten => cidlookup_1,n,Set(CALLERID(name)=${CURL(http://tel.search.ch:80/api/??was=${CALLERID(num)}&key=6xxxxxxx
        Et je m'en vais de ce pas suprimer le ? superflu..
        dans extensions_additional.conf.
      1. Avatar de fastm3
        fastm3 -
        Citation Envoyé par remy74 Voir le message
        J'ai découvert ce post ce matin, et j'ai tenté l'opération. Comme je suis sous FreePBX, inutile de vouloir modifier les fichiers à la main.
        Raccourci faux. Il faut juste comprendre comprendre comment les inclusions de contexte marchent.
        J'ai donc fait un petit screen de ma config qui semble fonctionner.
        http://imageshack.us/photo/my-images...nuinverse.jpg/
        Aprés un rapide check dans la config, il semble que FreePBX ajoute cette ligne
        Code:
        exten => cidlookup_1,n,Set(CALLERID(name)=${CURL(http://tel.search.ch:80/api/??was=${CALLERID(num)}&key=6xxxxxxx
        Et je m'en vais de ce pas suprimer le ? superflu..
        dans extensions_additional.conf.
        Pas trés bon !
        C'est fait pour pointer sur une adresse locale avec ton code ou en tout cas , du code, ou tu maitrises le temps de réponse. Un systeme de cache, timeout, verif du format callerid , gestion en arriere plan est nécessaire si tu veux faire les choses bien. En appelant en direct le web service dans le dialplan de freepbx , tu auras de fort delais et perturbations lors de certains appels.
        Si le site est down, tes appels chez toi risquent tout simplement de ne pas arriver par exemple en fonction du timeout.
        Fastm3.
      1. Avatar de Comdif
        Comdif -
        J'adore toujours ces fonction, qui même si pas autorisée, peuvent être utilisées
        sur une ligne recevant pas beaucoup d'appels.

        Et j'ai construit plein d'applis basées la dessus, qui même si elles ne sont pas légalement vendables, font réaliser au client lors de démos toute la puissance
        d'* et en général le spectateur est plutôt impressioné !

        A ce propos infoblel a largement simplifié la requête puisque l'ensemble des datas
        est maintenant dans le titre :-)

        exemple d'une popup avec présentation de l'appelant nom, adresse et proposition d'ajouter dans une appli locale de gestion de contacts + proposition de géoloc

        Code:
        			if( ($prefix != 06) && ($prefix != 07) )
        			{
        			if (strlen($num) == 10){ $numi= substr($num, -9); $num= '33'.$numi; }
        			echo "<div align=\"center\">0".$numi."</p></div>";
        			$url = file_get_contents("http://www.infobel.com/fr/france/Inverse.aspx?inphCoordType=EPSG&qphone=".$num, NULL, NULL, 0, 500);
        				if (ereg("<title>(.*)(,)(.*)( - Infobel Fran.*)</title>", $url, $regs))
        				{
        				echo "<div align=\"center\">".$regs[1]."</p>".$regs[3]."</div>";
        				echo'<div align="center">
        				<a href="http://'.$_SERVER['HTTP_HOST'].'/contact/add_contact.php?telephone=0'.$numi.'&nom='.$regs[1].'&adresse='.$regs[3].'">
        				cliquez ici pour ajouter au repertoire</div><div align="center">
        				<a href="http://maps.google.fr/maps?f=q&hl=fr&geocode=&q='.$regs[3].'" target="_blank">Geolocaliser</a></div>';
        				unset($url, $result, $num, $toto, $regs);
        				}
      1. Avatar de remy74
        remy74 -
        Citation Envoyé par fastm3 Voir le message
        Raccourci faux. Il faut juste comprendre comprendre comment les inclusions de contexte marchent.
        Pas trés bon !
        C'est fait pour pointer sur une adresse locale avec ton code ou en tout cas , du code, ou tu maitrises le temps de réponse. Un systeme de cache, timeout, verif du format callerid , gestion en arriere plan est nécessaire si tu veux faire les choses bien. En appelant en direct le web service dans le dialplan de freepbx , tu auras de fort delais et perturbations lors de certains appels.
        Si le site est down, tes appels chez toi risquent tout simplement de ne pas arriver par exemple en fonction du timeout.
        Fastm3.
        Juste, qu'est-ce qui est faux ? L'image s'affiche bien chez moi..Je comprends que si le site web de search est down, je risque de ne pas recevoir les appels. J'imagine qu'avec "Résultats du cache" actif, je met en cache (quelque part) les requetes.
        En fait, il faut donc prévoir un timeout < 1sec pour l'interrogation du webservice avec un retour "Inconnu" ou un texte au choix.. J'imagine que c'est possible quelque part sous FreePBX / Asterisk. Sinon toute les fonctions "externe" sont dangereuses..
      1. Avatar de fastm3
        fastm3 -
        Citation Envoyé par remy74 Voir le message
        Juste, qu'est-ce qui est faux ?
        Je reponds en dessous de qui est "quoté". Donc le contexte de ma reponse est lié a ce qui est juste au dessus. Tu y indiques qu'il est inutile de modifier les fichiers parce que tu utilises freepbx. Je corrige. On peut integrer avec Freepbx n'importe quel dialplan. Les include des contextes _custom sont la pour ca. Il y a d'autres moyens mais ca n'est pas le sujet du thread. Fin du HS.
        Fastm3.
      1. Avatar de remy74
        remy74 -
        J'avais quelques heures de libre, alors je me suis lancé dans le script, en ajoutant quelques fonctionnalitées.
        - Le script utilise une base de données, pour s'afranchir du possible "dowtime" du site web.
        - Si l'enregistrement n'existe pas dans la DB, il lance un process qui va va faire la recherche sur le net, mais retourne inconnu. (c'est un process non bloquant) Le second appel aura donc son nom dans la base de données renseigné.
        - ajout de code pour debugguer.

        Code:
        #!/usr/bin/perl -w
        #
        # Utilisation du script : inverse.pl <téléphone> 1
        # 
        # ex :    inverse.pl 022010101 1
        #
        # Si le modules Perl n'existe pas, pour l'installer :
        #     perl -MCPAN -we 'install "Net::HTTP"'
        #
        #
        # Création de la table Mysql  : inverse.pl 3 
        #
        ########################################################
        use DBI;
        use Net::HTTP::NB;
        use Cwd qw(abs_path);
        my $host 		= "localhost"; 
        my $user		= "";  
        my $pass 		= ""; 
        my $database 		= "asteriskcdrdb";
        my $engine_db		= "mysql";
        my $contact_name	= "";
        my $APIKEY		= "";
        my $phone		= "00"; 
        my $cmd			= undef;
        my $dbtable		= "inverse_contact";
        my $threads		= undef;
        my $deb			= 0;
        my $result		= "SET CALLERID ";
        my $message		= "";
        my $prog  		= abs_path($0);
        my $host_url	= "tel.search.ch";
        
        #################################################################
        # Ne rien modifier sous cette ligne.
        #################################################################
        $phone			= $ARGV[0] if $ARGV[0];
        $cmd			= $ARGV[1] if $ARGV[1];
        $deb			= $ARGV[2] if $ARGV[2];
        # respecter l'ordre de gestion des variables (inter-dépendance)
        
        my $dir_url			= "/api/?was=$phone&key=$APIKEY";
        
        if ( $cmd == 1 ) { &dbquery();	}
        if ( $cmd == 3 ) { &dbcreate() ; }
        if ( $cmd == 2 ) { &search() ;   }
        if ( $cmd = undef) { 
        	$message = "<Option Error";
        	&quit();
        	}	
        if (($phone < 1  )and ($cmd != 3)) {die "$result <error phone number>"};
        	
        sub search {
        	# recherche du contact via le numéro de tél, 
        	if ($deb >= 1 )
        	{
        		print " Search in progress..\n"
        	}
         my $s = Net::HTTP->new(Host => $host_url) or $err=1;
         push @ERRORS, "$host_url Failed\n" if $err;
          myerr() if $err;
          print "Failed url\n"  if $err;
         $s->write_request(GET => $dir_url);
         
         my($code, $mess, %h) = $s->read_response_headers;
         my $content = undef;
         while (1) {
            my $buf;
            my $n = $s->read_entity_body($buf, 1024) ;
            die "read failed: $!" unless defined $n;
            last unless $n;
            $content = $content . $buf;
            if ($deb >1 )	{ print $content;}
         }
        # recherche le texte contenu entre les 2 balises suivante:
        my $searchStart = '<tel:name>';
        my $searchEnd = '</tel:name>';
        
        if($content =~ m/$searchStart(.*)$searchEnd/i) {
        		$contact_name = $1;
        			if ($deb >= 1 ){ print "Go to db insert\n";}
        		&dbinsert();	
        	}
        	else
        	{
        		# retourne inconnu si la recherche est infructueuse.
        		$contact_name="inconnu";
        		if ($deb >= 1 ){ print "inconnu => exit \n";}
        	
        	}
        $message= $contact_name . " <$phone> (Net)";
        if ($deb >= 1 ){ print "$message\n";}
        &quit();
        } 
        
        sub dbquery {	
        	# recherche du contact dans la DB, retourne inconnu si n'existe pas.
        	$query= "select case WHEN (select count(*) from " . $dbtable . " where phone_number ='" . $phone . "' and archive='0') =1 THEN (select contact_name from " . $dbtable ." where phone_number ='" . $phone . "') ELSE ( select 'inconnu') 	END AS Contact_name;";
        	my $dbh= DBI->connect("DBI:$engine_db:database=$database;host=$host;", $user, $pass, {'RaiseError' => 0});
        	my $sth = $dbh->prepare($query);
        	$sth->execute() or $err=1;
        	push @ERRORS, "DB errors" if $err;
        	myerr() if $err;
        	while (my $ref = $sth->fetchrow_hashref() ) {
        		
        		$contact_name= $ref->{'Contact_name'} ;
        		}
        		if ($contact_name eq "inconnu" )
        			{
        				#lance la recherche sur internet par un appel externe OS.
        				if ($deb==1) { print "Start search";}
        				system "perl $prog 2 $phone &";
        			}
        			
        	$sth->finish();
        	$dbh->disconnect();
        	$message= $contact_name . " <$phone>";
        	&quit();
        	}	  
        		
        sub dbinsert {
        	# insertion dans la DB du résultat de la recherche
        	$query= "insert into " . $dbtable . "  (contact_name,phone_number,create_date) values ( '" . $contact_name . "','" . $phone . "', now());";
        	if ($deb >= 1 ){ print "$query\n";}
        	my $dbh= DBI->connect("DBI:$engine_db:database=$database;host=$host;", $user, $pass, {'RaiseError' => 0});
        	my $sth = $dbh->prepare($query);
        	$sth->execute();
        	$sth->finish();
        	$dbh->disconnect();
        	}	  
        	
        sub dbcreate {
        	# creation de la table dans la DB
        	$query="CREATE TABLE `" . $dbtable . "` (`contact_name` varchar(250) default NULL,`phone_number` varchar(20) NOT NULL, `archive` char(1) default '0',`Create_date` DATETIME,PRIMARY KEY  (`phone_number`) );";
        	my $dbh= DBI->connect("DBI:$engine_db:database=$database;host=$host;", $user, $pass, {'RaiseError' => 0});
        	my $sth = $dbh->prepare($query);
        	$sth->execute();
        	$sth->finish();
        	$dbh->disconnect();
        	
        }
        
        sub quit{
        	
        	if ($cmd!=2) {print "$result \"$message\"";}
        	if ($deb >= 1) {
        		print "\nEndofScript\n" ;
        	}
        	exit 0;
        }
        
        sub myerr {
          $message= @ERRORS . " <$phone>";
          &quit();
        }
         
        
        __END__
        L'utilisation se fait par l'appel du script : nom_du_script 1 téléphone .
        exemple : inverse.pl 022010101 1
        Le "1" correspond à une utilisation normale. Si on met 2 à la place, il fait la recherche directement sur le net, et enregistre le résultat dans la DB (si résultat il y a..).
        Si on met 3, le script créer la table dans la base de données. Ce qui est obligatoire, à moins d'utiliser une table existante (il faudrat donc , dans ce cas la , changer quelques valeurs dans le script, comme les noms des champs, et le nom de la table).

        N'oubliez pas de renseigner les variables du script..

        Tester le script, pour être sur qu'il fonctionne comme bon vous semble.

        N'hesitez pas à me faire part de vos commentaires, adaptation, etc..
      1. Avatar de adamsam2016
        adamsam2016 -
        salut tous j'utilise cet annuaire inversé pour identifier les numéros de téléphone c'est facile et gratuit
    • A propos d'Asterisk

      Asterisk

      Asterisk est un IPBX open source (logiciel libre) pour Linux originellement créé en 1999 par Mark Spencer, fondateur de la société Digium.

      logo asterisk
    • Downloads populaires

    • Articles récents

    • Utilisateurs actuellement connectésUtilisateurs actuellement connectés

      0 membre(s) et 264 invité(s)

      Le record de connectés est de 2 678, 22/07/2022 à 11h34.

    • Ils nous soutiennent

      logo digium
      logo alter-it
      logo avencall
      logo beronet
      logo celya
      logo cnsi
      logo dolmen
      logo easypyro
      logo eyepea
      logo keyyo
      logo opcom
      logo openip
      logo ovh
      logo qualigaz
      qualistream
      logo voip-asterisk
      logo voxity
      logo yealink