Vous pouvez voir cette page sur http://www.asterisk-france.org/conte...inverse-Suisse
Version imprimable
Vous pouvez voir cette page sur http://www.asterisk-france.org/conte...inverse-Suisse
C'est fun ça, mais y a pas de limitation de search.ch ;) ?
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:
Mais ils le permettent...Citation:
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.
Fastm3.
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....
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
Et je m'en vais de ce pas suprimer le ? superflu..Code:exten => cidlookup_1,n,Set(CALLERID(name)=${CURL(http://tel.search.ch:80/api/??was=${CALLERID(num)}&key=6xxxxxxx
dans extensions_additional.conf.
Raccourci faux. Il faut juste comprendre comprendre comment les inclusions de contexte marchent.
Pas trés bon !Citation:
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
Et je m'en vais de ce pas suprimer le ? superflu..Code:exten => cidlookup_1,n,Set(CALLERID(name)=${CURL(http://tel.search.ch:80/api/??was=${CALLERID(num)}&key=6xxxxxxx
dans extensions_additional.conf.
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.
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);
}
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..
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.
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.
L'utilisation se fait par l'appel du script : nom_du_script 1 téléphone .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__
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..