een geoip api gebruiken
Ik wilde iets doen met het opvragen van de geolocatie van een bezoeker om een soort bezoekerslogboekje voor mezelf bij te kunnen houden.
Nu kwam ik dit tegen:
Kan ik in een php script dit aanroepen en dan voor het UIP adres $_SERVER['GEOIP_ADDR'] invullen en dan de uitkomende gegevens gebruiken? En zo ja, hoe dan?
Dit leek me een makkelijker oplossing dan iets met een database op de hostingsserver te zetten en die steeds te moeten updaten.
Alvast bedankt voor jullie gewaardeerde mening.
Jop
De coördinaten van mijn eigen privé IP-adres komt uit in Amersfoort. Mogelijk een knooppuntcentrale voor mijn VDSL verbinding, terwijl ik in de nabijheid van Woerden woon. Een behoorlijk verschil dus. Verder zijn er ook internetproviders in Nederland die IP-adressen gebruiken die in het buitenland geregistreerd zijn. Een mooi voorbeeld is AOL (bestaat dat nog?) en T-Mobile.
Verder is $_SERVER['GEOIP_ADDR'] alleen beschikbaar als je mod_geoip hebt geïnstalleerd op je webserver.
Dank je voor je reactie. Niet helemaal antwoord op mijn vraag helaas. Maar even op jouw antwoorden in te gaan:
Quote:
Het kán altijd aangeven waar iemand vandaan komt, maar vaak is dat juist niet zo.
Daar ben ik me van bewust, maar vaak klopt het ook weer wel.
Quote:
Verder is $_SERVER['GEOIP_ADDR'] alleen beschikbaar als je mod_geoip hebt geïnstalleerd op je webserver.
Kennelijk staat dat aan bij mijn provider, want die variabele werkt.
Blijft de vraag of ik in een php script de data van die api kan oproepen en gebruiken ...
geolocatie in HTML5 gekeken? Nadeel daarvan is onder andere dat deze een pop-up toont die gebruikers om toestemming vraagt, maar het grote voordeel is dat de locatie vervolgens veel nauwkeuriger en actueel is. Weigert de gebruiker de toestemming, dan kun je alsnog IP-geolocatie als plan B toepassen.
Mijn ervaring is dat gratis geolocatie-services er veel te vaak te ver naast zitten. Ik heb al meer dan tien jaar een vast IP-adres in Eindhoven, maar tot op de dag van vandaag plaatsen veel services mij in op het hoofdkantoor van KPN in Den Haag, op een internetknooppunt in Amsterdam of op een ander knooppunt bij een terrein van Defensie in Sint-Oedenrode. De site die jij noemt, denkt dat ik in Cuijk in Zuid-Limburg zit...
Voorbeeld:
Heb je al eens naar Mijn ervaring is dat gratis geolocatie-services er veel te vaak te ver naast zitten. Ik heb al meer dan tien jaar een vast IP-adres in Eindhoven, maar tot op de dag van vandaag plaatsen veel services mij in op het hoofdkantoor van KPN in Den Haag, op een internetknooppunt in Amsterdam of op een ander knooppunt bij een terrein van Defensie in Sint-Oedenrode. De site die jij noemt, denkt dat ik in Cuijk in Zuid-Limburg zit...
Voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Geolocatie in HTML5</title>
<meta name="author" content="Ward van der Put">
</head>
<body>
<p id="positie"></p>
<div id="kaartje"></div>
<script>
// Deze JavaScript-functie meldt de geolocatie-eigenschappen
// position.coords.latitude (breedtegraad) en position.coords.longitude
// (lengtegraad) van de huidige positie. Deze geografische cordinaten
// geven we vervolgens door aan de API van Google Maps.
function showPosition(position)
{
document.getElementById("positie").innerHTML
= "Breedtegraad: " + position.coords.latitude
+ "<br>Lengtegraad: " + position.coords.longitude;
var pos = position.coords.latitude + "," + position.coords.longitude;
var src = "http://maps.googleapis.com/maps/api/staticmap?center="
+ pos + "&zoom=15&size=640x480&maptype=roadmap&sensor=false";
document.getElementById("kaartje").innerHTML = "<img src='"
+ src + "' alt='Google Maps'>";
}
// Als een browser geolocatie met HTML5 ondersteunt, kun je de huidige
// locatie ophalen met de methode getCurrentPostion() van het object
// navigator.geolocation. Als er een positie wordt gevonden, dan geven
// we die door aan de bovenstaande functie showPosition().
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
document.getElementById("positie").innerHTML
= "Geolocatie wordt niet ondersteund door deze browser.";
}
</script>
</body>
</html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Geolocatie in HTML5</title>
<meta name="author" content="Ward van der Put">
</head>
<body>
<p id="positie"></p>
<div id="kaartje"></div>
<script>
// Deze JavaScript-functie meldt de geolocatie-eigenschappen
// position.coords.latitude (breedtegraad) en position.coords.longitude
// (lengtegraad) van de huidige positie. Deze geografische cordinaten
// geven we vervolgens door aan de API van Google Maps.
function showPosition(position)
{
document.getElementById("positie").innerHTML
= "Breedtegraad: " + position.coords.latitude
+ "<br>Lengtegraad: " + position.coords.longitude;
var pos = position.coords.latitude + "," + position.coords.longitude;
var src = "http://maps.googleapis.com/maps/api/staticmap?center="
+ pos + "&zoom=15&size=640x480&maptype=roadmap&sensor=false";
document.getElementById("kaartje").innerHTML = "<img src='"
+ src + "' alt='Google Maps'>";
}
// Als een browser geolocatie met HTML5 ondersteunt, kun je de huidige
// locatie ophalen met de methode getCurrentPostion() van het object
// navigator.geolocation. Als er een positie wordt gevonden, dan geven
// we die door aan de bovenstaande functie showPosition().
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
document.getElementById("positie").innerHTML
= "Geolocatie wordt niet ondersteund door deze browser.";
}
</script>
</body>
</html>
Gewijzigd op 05/11/2015 12:16:56 door Ward van der Put
Dank je voor je tip. Mijn locaties worden wel steeds op een paar km nauwkeurig aangegeven ... ;-)
Ik had "geolocatie in HTML5" al eens bekeken. Ik was niet zo gecharmeerd van de pop-up en daarom was het voor mij in eerste instantie afgevallen. Daarom de vraag hoe ik de data die door die andere site wordt gegeneerd zou kunnen gebruiken. Is het theoretisch wel mogelijk? Of moet ik dat gewoon vergeten?
Je moet zelf op twee punten overwegen wat acceptabel is voor je applicatie:
• Hoeveel procent van de locaties mag onjuist zijn?
• Hoe groot mag de geografische afwijking zijn?
De overweging "in minstens 75% van de gevallen moet het land juist zijn" is een andere dan "in meer dan 95% van de gevallen moet minimaal de plaats juist zijn".
Google is mijn vriend niet. Maar dat maakt ook niet uit ;-)
De ervaringen die ik met andere trackers heb (statcounter, piwik) over de locatie zijn voor mij bevredigend om voor mijn eigen gebruik en interesse te gebruiken. Als meer dan 75% kloppend is ben ik al ruim tevreden. Maar alleen land (krijg ik al met $_SERVER['GEOIP_COUNTRY_NAME']) vind ik wat summier.
Alleen: ik ben te weinig onderlegd met hoe ik de data uit "https://geoiptool.com/api/view/?ip=8.8.8.8" via php kan oproepen en kan gebruiken. Is het mogelijk of niet?
https://geoiptool.com geeft bij mij niet eens een woonplaats oid weer.
Alleen het land laat hij zien, de rest staat op NULL.
Dus echt betrouwbaar is het niet.
Dit kan je gebruiken om de info in je php te verwerken
@ward,
Cuijk ligt naast utrecht als ik mij niet vergis, niet in zuid limburg.
Alleen het land laat hij zien, de rest staat op NULL.
Dus echt betrouwbaar is het niet.
Dit kan je gebruiken om de info in je php te verwerken
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$data = file_get_contents('https://geoiptool.com/api/view/?ip=8.8.8.8');
$obj = json_decode($data);
var_dump($obj);
?>
$data = file_get_contents('https://geoiptool.com/api/view/?ip=8.8.8.8');
$obj = json_decode($data);
var_dump($obj);
?>
@ward,
Cuijk ligt naast utrecht als ik mij niet vergis, niet in zuid limburg.
Gewijzigd op 05/11/2015 12:57:20 door Randy vsf
Dank je wel. Zo iets bedoelde ik!
Cuijk ligt onder Nijmegen volgens mij, net in Noord Brabant.
Cuijk ligt in Noord-Brabant om precies te zijn, maar https://geoiptool.com/ zegt dat mijn Cuijk in Limburg ligt ;-)
Ik heb net ook nog even de nauwkeurigheid getest van de HTML5-geolocatie. Op mijn laptop zit ik volgens Firefox in de tuin van de buren en volgens Chrome en Edge in het plantsoen aan de overkant van de straat. Mijn telefoon doet het beter: die plaatst me in mijn eigen achtertuin terwijl ik binnen zit.
@Randy Ik heb net ook nog even de nauwkeurigheid getest van de HTML5-geolocatie. Op mijn laptop zit ik volgens Firefox in de tuin van de buren en volgens Chrome en Edge in het plantsoen aan de overkant van de straat. Mijn telefoon doet het beter: die plaatst me in mijn eigen achtertuin terwijl ik binnen zit.
Quote:
terug en lijkt het dat de gegevens van mijn provider opgevraagd worden.["city"]=> NULL ["region_code"]=> NULL ["region_name"]=> string(1) " " ["success"]=> bool(true) ["is_url"]=> bool(false)
Dus als je iets inlaadt van een externe webserver. Zorg dat je dit dan via AJAX ophaalt, of anders laat cachen.
Ik heb geolocatie in HTML5 ook even geprobeerd, ik hoef geen kaartje te hebben, maar kan ik ook alleen de "City" als gegevens terug krijgen ipv de coördinaten?
Toevoeging op 05/11/2015 13:30:45:
PS. En kan ik die gegevens in php verder verwerken?
Toevoeging op 05/11/2015 13:32:05:
Jo pla op 05/11/2015 13:20:06:
Het werkt en ook ook weer niet met de geoip-tool. Als ik het in de browser op vraag krijg ik dat ik wel een city, maar als ik hetzelfde adres op vraag met de php code dan komt er
Quote:
terug en lijkt het dat de gegevens van mijn provider opgevraagd worden.["city"]=> NULL ["region_code"]=> NULL ["region_name"]=> string(1) " " ["success"]=> bool(true) ["is_url"]=> bool(false)
Tja, dan moet je natuurlijk wel de code goed zetten ... Ik krijg wel het goede adres terug.
@Arien:
Inderdaad het is meteen een stuk trager. Maar ja, ik ben geen voetbalfan, maar dat is het enige dat bij mij boven komt als ik "AJAX" hoor. Hoe zou jij het stukje code dan aanpassen zodat het sneller wordt?
Gewijzigd op 05/11/2015 13:34:21 door j opla
Dit PHP-script wordt dan aangeroepen via een aanroep met JavaScript en AJAX.
Een voorbeeldje met het jQuery-framework:
reverse geocoding een adres opzoeken via de Google Maps Geocoding API.
Kijk voor PHP-oplossingen ook eens naar de IP Geolocation API van ip-api.com of de gratis GeoLite2-database en de bijbehorende GeoIP2 PHP API van MaxMind.
Als je de breedte- en lengtegraad weet, kun je met Kijk voor PHP-oplossingen ook eens naar de IP Geolocation API van ip-api.com of de gratis GeoLite2-database en de bijbehorende GeoIP2 PHP API van MaxMind.
We gaan het allemaal vanavond nog eens bekijken. Dank voor jullie input.
Randy Flujowa op 05/11/2015 12:50:06:
Dit kan je gebruiken om de info in je php te verwerken
Dit kan je gebruiken om de info in je php te verwerken
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$data = file_get_contents('https://geoiptool.com/api/view/?ip=8.8.8.8');
$obj = json_decode($data);
var_dump($obj);
?>
$data = file_get_contents('https://geoiptool.com/api/view/?ip=8.8.8.8');
$obj = json_decode($data);
var_dump($obj);
?>
Vraagje: hoe kan ik nu de gegevens uit $obj benaderen? Ik dacht dat het een array zou zijn, maar objecten werken kennelijk iets anders ...
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$data = file_get_contents('https://geoiptool.com/api/view/?ip=8.8.8.8');
$obj = json_decode($data);
echo $obj->city;
?>
$data = file_get_contents('https://geoiptool.com/api/view/?ip=8.8.8.8');
$obj = json_decode($data);
echo $obj->city;
?>
Of je geeft gewoon true als tweede argument van json_decode() en dan heb je een array.
Ow, als array is het makkelijker ... ben niet zo thuis in de objecten ...