een geoip api gebruiken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

J opla

j opla

05/11/2015 11:20:41
Quote Anchor link
Hoi,

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
 
PHP hulp

PHP hulp

20/04/2024 06:20:44
 
- Ariën  -
Beheerder

- Ariën -

05/11/2015 12:00:07
Quote Anchor link
IP-adressen zijn niet geografisch gekoppeld. Het kán altijd aangeven waar iemand vandaan komt, maar vaak is dat juist niet zo.

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.
 
J opla

j opla

05/11/2015 12:08:42
Quote Anchor link
@ Arien
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 ...
 
Ward van der Put
Moderator

Ward van der Put

05/11/2015 12:16:19
Quote Anchor link
Heb je al eens naar 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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<!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>
Gewijzigd op 05/11/2015 12:16:56 door Ward van der Put
 
J opla

j opla

05/11/2015 12:26:35
Quote Anchor link
@Ward
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?
 
Ward van der Put
Moderator

Ward van der Put

05/11/2015 12:37:52
Quote Anchor link
Er zijn meerdere API's die je kunt gebruiken (Google is je vriend), maar zoals gezegd zijn de gratis services onbetrouwbaar. Iets met een gegeven paard...

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".
 
J opla

j opla

05/11/2015 12:47:25
Quote Anchor link
Beste Ward,
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?
 
Randy vsf

Randy vsf

05/11/2015 12:50:06
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


@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
 
J opla

j opla

05/11/2015 13:00:37
Quote Anchor link
@Randy:
Dank je wel. Zo iets bedoelde ik!

Cuijk ligt onder Nijmegen volgens mij, net in Noord Brabant.
 
Ward van der Put
Moderator

Ward van der Put

05/11/2015 13:02:52
Quote Anchor link
@Randy 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.
 
J opla

j opla

05/11/2015 13:20:06
Quote Anchor link
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:
["city"]=> NULL ["region_code"]=> NULL ["region_name"]=> string(1) " " ["success"]=> bool(true) ["is_url"]=> bool(false)
terug en lijkt het dat de gegevens van mijn provider opgevraagd worden.
 
- Ariën  -
Beheerder

- Ariën -

05/11/2015 13:26:34
Quote Anchor link
Externe API's (al dan wel of geen GeoIP-tool) zijn erg leuk, maar het zorgt ook weer voor vertraging bij het opbouwen van de website.

Dus als je iets inlaadt van een externe webserver. Zorg dat je dit dan via AJAX ophaalt, of anders laat cachen.
 
J opla

j opla

05/11/2015 13:27:01
Quote Anchor link
@Ward:
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:
["city"]=> NULL ["region_code"]=> NULL ["region_name"]=> string(1) " " ["success"]=> bool(true) ["is_url"]=> bool(false)
terug en lijkt het dat de gegevens van mijn provider opgevraagd worden.

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
 
- Ariën  -
Beheerder

- Ariën -

05/11/2015 13:44:39
Quote Anchor link
AJAX wordt client-side uitgevoerd. Je kan dan een PHP-script maken die de JSON-string van die URL uit elkaar kan pluizen, en op kan slaan in de database.

Dit PHP-script wordt dan aangeroepen via een aanroep met JavaScript en AJAX.
Een voorbeeldje met het jQuery-framework:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$.ajax({
    url: "demo_test.txt",
    success: function(result){
            $("#div1").html(result);
        }

});
 
Ward van der Put
Moderator

Ward van der Put

05/11/2015 13:47:12
Quote Anchor link
Als je de breedte- en lengtegraad weet, kun je met 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.
 
J opla

j opla

05/11/2015 13:50:15
Quote Anchor link
We gaan het allemaal vanavond nog eens bekijken. Dank voor jullie input.
 
J opla

j opla

06/11/2015 16:52:39
Quote Anchor link
Randy Flujowa op 05/11/2015 12:50:06:

Dit kan je gebruiken om de info in je php te verwerken
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>

Vraagje: hoe kan ik nu de gegevens uit $obj benaderen? Ik dacht dat het een array zou zijn, maar objecten werken kennelijk iets anders ...
 
Bo Ter Ham

Bo Ter Ham

06/11/2015 17:03:14
Quote Anchor link
Je kunt met een pijl properties van objecten ophalen, dus als je city wilt hebben doe je gewoon:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>
 
J opla

j opla

06/11/2015 17:07:50
Quote Anchor link
Dank je. En als ik alles uit wil lezen / printen? Kan dat dan met een
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?
foreach ($obj as $key=>$value)
{

    echo $key.' - '.$value.'<br/>';
}

?>

?
Gewijzigd op 06/11/2015 17:08:56 door j opla
 
Ben van Velzen

Ben van Velzen

06/11/2015 17:08:51
Quote Anchor link
Of je geeft gewoon true als tweede argument van json_decode() en dan heb je een array.
 
J opla

j opla

06/11/2015 17:11:38
Quote Anchor link
Ow, als array is het makkelijker ... ben niet zo thuis in de objecten ...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.