Affichage des résultats 1 à 10 sur 11

Discussion: Annuaire inverse Suisse

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Junior
    Date d'inscription
    novembre 2011
    Messages
    14
    Downloads
    0
    Uploads
    0
    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..
    Dernière modification par remy74 ; 15/11/2011 à 13h23.

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •