Page 1 sur 1

comment récupérer le nom du pays grâce a l adresse ip

Posté : 30 avr. 2021, 17:53
par flexi2202
bonjour a tous
j ai un code qui me permet de savoir quelle adresse ip , a quelle heure , avec quel système d exploitation et quelle url a été visité
je suppose qu il doit y avoir des erreurs de syntaxe mais cela fonctionne
je souhaiterais a présent connaître le pays du visiteur

merci de l aide

Code : Tout sélectionner

<?php $user_agent = getenv("HTTP_USER_AGENT"); if (strpos($user_agent, "Win") !== FALSE) $os = "Windows"; elseif ((strpos($user_agent, "Mac") !== FALSE) || (strpos($user_agent, "PPC") !== FALSE)) $os = "Mac"; elseif (strpos($user_agent, "Linux") !== FALSE) $os = "Linux"; elseif (strpos($user_agent, "FreeBSD") !== FALSE) $os = "FreeBSD"; elseif (strpos($user_agent, "SunOS") !== FALSE) $os = "SunOS"; elseif (strpos($user_agent, "IRIX") !== FALSE) $os = "IRIX"; elseif (strpos($user_agent, "BeOS") !== FALSE) $os = "BeOS"; elseif (strpos($user_agent, "OS/2") !== FALSE) $os = "OS/2"; elseif (strpos($user_agent, "AIX") !== FALSE) $os = "AIX"; else $os = "Autre"; /*** Après on fait ce qu'on souhaite de l'information : * affichage, stockage dans une base de données ... **/ echo $os; $filename = 'test.txt'; if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $somecontent=$_SERVER['HTTP_X_FORWARDED_FOR']; else $somecontent=$_SERVER['REMOTE_ADDR']; $date=$_SERVER['REQUEST_TIME']; //$adresse=$_SERVER['HTTP_HOST']; $date1 = date('Y-m-d H:i:s', $date +7200); // Date du jour if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') $link = "https"; else $link = "http"; // Here append the common URL characters. $link .= "://"; // Append the host(domain name, ip) to the URL. $link .= $_SERVER['HTTP_HOST']; // Append the requested resource location to the URL $link .= $_SERVER['REQUEST_URI']; setlocale(LC_TIME, "fr_FR"); // Assurons nous que le fichier est accessible en écriture if (is_writable($filename)) { // Dans notre exemple, nous ouvrons le fichier $filename en mode d'ajout // Le pointeur de fichier est placé à la fin du fichier // c'est là que $somecontent sera placé if (!$handle = fopen($filename, 'a')) { echo "Impossible d'ouvrir le fichier ($filename)"; exit; } // Ecrivons quelque chose dans notre fichier. echo $date2; if (fwrite($handle,strftime("%A %d %B %G %H:%M:%S", strtotime($date1))."\t $os.\t $somecontent.\t $link.\r\n") === FALSE) { echo "Impossible d'écrire dans le fichier ($filename)"; exit; } echo "L'écriture de ($somecontent) dans le fichier ($filename) a réussi"; fclose($handle); } else { echo "Le fichier $filename n'est pas accessible en écriture."; } ?>

Re: comment récupérer le nom du pays grâce a l adresse ip

Posté : 30 avr. 2021, 18:36
par @rthur
Le pays n'est pas une info fournie par le navigateur.
En revanche le navigateur te donne la langue de l'utilisateur ou les langues par ordre de préférence qu'il souhaite, dans la variable $_SERVER['HTTP_ACCEPT_LANGUAGE']


Si tu veux réellement le pays de connexion, il faut faire du geocoding de l'adresse IP, ce n'est pas une science exacte, mais pour t'expliquer le fonctionnement chaque plage d'adresses IP est attribuée à un fournisseur d'accès, et donc en fonction du fournisseur d'accès (par exemple Free) on peut estimer que l'utilisateur est de tel pays (Free => France)
Pour faire celà 2 possibilités :
Soit tu as la chance que ton hébergeur passe par Cloudflare, et alors il est possible que le pays soit renseigné automatiquement dans la variable $_SERVER["HTTP_CF_IPCOUNTRY"] (c'est Cloudflare qui fait le geocoding)
Soit tu es comme le commun des mortels et alors il faut que tu utilises un service tiers pour faire ce geocoding.
Le plus connu et aussi le plus fiable (c'est celui utilisé par les chaines de TV pour bloquer les diffusions à l'étranger) c'est MaxMind.
MaxMind a la générosité de fournir une version gratuite de sa base de correspondance : https://dev.maxmind.com/geoip/geoip2/geolite2/

Sinon après tu as des centaines de prestataires qui proposes celà, parfois gratuitement, parfois en payant :
https://ip-api.com/
https://ipgeolocation.io/pricing.html
https://ipstack.com/product
https://ipapi.com/product
...

Re: comment récupérer le nom du pays grâce a l adresse ip

Posté : 30 avr. 2021, 19:12
par or 1
et pour ne pas réinventer la roue, en plus des log serveurs, il y a des solutions comme https://marketingplatform.google.com/about/analytics/

Re: comment récupérer le nom du pays grâce a l adresse ip

Posté : 30 avr. 2021, 22:56
par flexi2202
bonsoir Arthur
merci pour les explications et pas de bol je n ai pas de prise en charge avec la variable $_SERVER["HTTP_CF_IPCOUNTRY"]
donc ben je viens d aller voir un peu la documentation des différents liens
cela me semble assez complique pour un novice comme moi d utiliser maxmind
je me sens un peu plus a l aise avec les autres liens

j ai donc essaye pour commencer ip-api.com
en fait je dois juste entrer cette ligne avec l adresse ip
http://ip-api.com/php/24.48.0.1
mais comment faire pour remplacer les chiffres de l ip par une variable ?
je ne vois pas l explication dans la documentation

pour ce qui est de ipstack
pareil je ne vois pas bien comment remplacer l adresse ip par une variable

je pense que pour les autre j aurais le meme soucis

bonsoir or1
oui j avais déjà été voir , mais pour utiliser le service je pense que le site doit déjà être référencé , cela fonctionne avec mon blog creer avec blogger

un tout grand merci a vous deux pour l aide

Re: comment récupérer le nom du pays grâce a l adresse ip

Posté : 01 mai 2021, 13:00
par @rthur
file_get_contents() pour aller interroger une url externe.
Et tu construit l'url à interroger avec le chemin de base http://ip-api.com/php/ que tu concatènes avec l'adresse IP qui est dans la variable $_SERVER['SERVER_ADDR']
https://www.php.net/manual/fr/language. ... string.php

Re: comment récupérer le nom du pays grâce a l adresse ip

Posté : 01 mai 2021, 13:20
par flexi2202
merci rthur je suis occuppe a chercher comment tu as pu faire avec ip-api pour que quand je clic dessus je vois ou j habite

je dois donc utiliser file_get_contents()
mais j avoue que j ai du mal a comprendre ce coup la