การรับตำแหน่งจากที่อยู่ IP


205

ฉันต้องการดึงข้อมูลเช่นเมืองรัฐและประเทศของผู้เข้าชมจากที่อยู่ IP ของพวกเขาเพื่อให้ฉันสามารถปรับแต่งหน้าเว็บของฉันตามที่ตั้งของพวกเขา มีวิธีที่ดีและน่าเชื่อถือในการทำเช่นนี้ใน PHP? ฉันใช้ JavaScript สำหรับการเขียนสคริปต์ฝั่งไคลเอ็นต์, PHP สำหรับการเขียนสคริปต์ฝั่งเซิร์ฟเวอร์และ MySQL สำหรับฐานข้อมูล


นี้สวยมากซ้ำstackoverflow.com/questions/348614/...
ชาร์ลีมาร์ติน

คำตอบ:


255

คุณสามารถดาวน์โหลดฐานข้อมูล GeoIP ฟรีและค้นหาที่อยู่ IP ในพื้นที่หรือคุณสามารถใช้บริการของบุคคลที่สามและทำการค้นหาระยะไกล นี่เป็นตัวเลือกที่ง่ายกว่าเนื่องจากไม่ต้องมีการตั้งค่า

หนึ่งในบริการของบุคคลที่สามที่คุณสามารถใช้เป็นของเราhttp://ipinfo.io พวกเขามีชื่อโฮสต์ตำแหน่งทางภูมิศาสตร์เจ้าของเครือข่ายและข้อมูลเพิ่มเติมเช่น:

$ curl ipinfo.io/8.8.8.8
{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "loc": "37.385999999999996,-122.0838",
  "org": "AS15169 Google Inc.",
  "city": "Mountain View",
  "region": "CA",
  "country": "US",
  "phone": 650
}

นี่คือตัวอย่าง PHP:

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"

คุณยังสามารถใช้ฝั่งไคลเอ็นต์ นี่คือตัวอย่าง jQuery ง่ายๆ:

$.get("https://ipinfo.io/json", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#address").html("Location: " + response.city + ", " + response.region);
    $("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href="http://ipinfo.io">ipinfo.io</a></h3>

<hr/>
<div id="ip"></div>
<div id="address"></div>
<hr/>Full response: <pre id="details"></pre>


1
คุณอาจต้องการให้แน่ใจว่าคุณเพิ่ม json ในตอนท้ายของ URL เพื่อให้แน่ใจว่าคุณได้รับ json กลับมาแทนที่หน้าเว็บแบบเต็ม $ details = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Doug

1
@Manatax ไม่ใช่เพราะมันจะเป็นไปไม่ได้ที่จะแยกวิเคราะห์การตอบสนองของเซิร์ฟเวอร์
Ja͢ck

3
ดูเหมือนจะไม่ได้เป็นบริการที่น่าเชื่อถือมาก ฉันจะได้รับnullชื่อเมืองของฉัน มันไม่เหมือนเมืองเล็ก ๆ หรือบางอย่าง แต่ก็ยังหาไม่เจอ หากมันใช้งานไม่ได้ในสหรัฐอเมริกาฉันสงสัยว่ามันจะกลับมาว่างนอกสหรัฐฯได้บ่อยแค่ไหน
Derek 朕會功夫

2
ผลลัพธ์ไม่ถูกต้อง .. ภูมิภาค, เมืองไปรษณีย์
Mark Gerryl Mirandilla

2
คำเตือน: ตั้งแต่มกราคม / 2019 บางคนรายงานว่าURL ของipinfoนี้ไม่ปลอดภัยสำหรับ virustotal เนื่องจากโทรจัน คะแนนโหวตระหว่างปี 2558 ถึงปี 2561
ริคาร์โด้

55

คิดว่าฉันจะโพสต์เนื่องจากดูเหมือนว่าไม่มีใครให้ข้อมูลกับ API นี้โดยเฉพาะ แต่เป็นการส่งคืนสิ่งที่ฉันตามมาและคุณสามารถให้มันส่งกลับในหลายรูปแบบjson, xml and csvได้

 $location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
 print_r($location);

สิ่งนี้จะให้ทุกสิ่งที่คุณต้องการ:

{
      "ip": "77.99.179.98",
      "country_code": "GB",
      "country_name": "United Kingdom",
      "region_code": "H9",
      "region_name": "London, City of",
      "city": "London",
      "zipcode": "",
      "latitude": 51.5142,
      "longitude": -0.0931,
      "metro_code": "",
      "areacode": ""

}

1
เฮ้เจมี่ FreegeoIp.net ไม่ทำงาน มีวิธีอื่น ๆ ?
Adi

ขออภัยในขณะนี้ แต่นั่นเป็นความอัปยศที่เป็นบริการที่ฉันใช้ในเว็บไซต์สดของฉัน ให้ความหวังว่าพวกเขาจะกลับมาอีกครั้งในเวลาเดียวกัน
Jamie Hutber

2
ส่วนใหญ่ลดลงและไม่ค่อยให้ภูมิภาคหรือเมืองใด ๆ
Rahul aman

2
บริการของ Tony ที่ Azure ดูเหมือนว่าจะทำงานได้อย่างรวดเร็วและเชื่อถือได้: freegeoip2
Gustav

1
น่าเสียดายที่บริการนี้จะถูกตัดการเชื่อมต่อในวันที่ 1 กรกฎาคม 2018 ตามข้อความนี้: "ปลายทาง API นี้เลิกใช้แล้วและจะหยุดทำงานในวันที่ 1 กรกฎาคม 2018 สำหรับข้อมูลเพิ่มเติมกรุณาเยี่ยมชม: github.com/apilayer/freegeoip#readme \
Julio Bailon

20

ตัวอย่าง Javascript บริสุทธิ์โดยใช้บริการของhttps://geolocation-db.comซึ่งเป็นโซลูชัน JSON และ JSONP-callback

ไม่ต้องใช้ jQuery!

<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geolocation-db.com</title>
</head>
<body>
    <div>Country: <span id="country"></span></div>
    <div>State: <span id="state"></span></div>
    <div>City: <span id="city"></span></div>
    <div>Postal: <span id="postal"></span></div>
    <div>Latitude: <span id="latitude"></span></div>
    <div>Longitude: <span id="longitude"></span></div>
    <div>IP address: <span id="ipv4"></span></div>                             
</body>
<script>

    var country = document.getElementById('country');
    var state = document.getElementById('state');
    var city = document.getElementById('city');
    var postal = document.getElementById('postal');
    var latitude = document.getElementById('latitude');
    var longitude = document.getElementById('longitude');
    var ip = document.getElementById('ipv4');

    function callback(data)
    {
        country.innerHTML = data.country_name;
        state.innerHTML = data.state;
        city.innerHTML = data.city;
        postal.innerHTML = data.postal;
        latitude.innerHTML = data.latitude;
        longitude.innerHTML = data.longitude;
        ip.innerHTML = data.IPv4;
    }

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://geoilocation-db.com/json/geoip.php?jsonp=callback';
    var h = document.getElementsByTagName('script')[0];
    h.parentNode.insertBefore(script, h);

</script> 
</html>

มีการ จำกัด การใช้https://geoilocation-db.comapi หรือไม่?
Priyanka Sharma

16

ใช้ Google APIS:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>

9
The geolocation functionality in the Loader hasn't been retired, per se. We stopped documenting it several years ago and have recommended the HTML-based solutions due to their improved accuracy, but the functionality itself has not been removed from the Loader at this time. code.google.com/p/google-ajax-apis/issues/detail?id=586
TheFrost

คุณภาพของตำแหน่งทางภูมิศาสตร์ IP ของ Google APIS นี้เป็นอย่างไร (มันเป็นหรือฉันผิดฉัน?) เมื่อเทียบกับบริการอื่น ๆ เช่นipinfo.io ?
Basj

ฉันถามคนประมาณ 30 คนในเมืองต่าง ๆ และคุณภาพตำแหน่งทางภูมิศาสตร์ของ Google APIS IP ไม่ดีเมื่อเทียบกับ ipinfo.io
Basj

1
@Basj Google API ทำงานเหมือนมีเสน่ห์ในขณะที่ ipinfo.io แสดงให้เห็นว่าฉันอยู่ในสหรัฐอเมริกาในขณะที่ฉันอยู่ในยุโรปตอนกลางจริง ๆ
patryk

15

คุณต้องใช้บริการภายนอก ... เช่นhttp://www.hostip.info/หากคุณ google ค้นหา "geo-ip" คุณจะได้รับผลลัพธ์เพิ่มเติม

Host-IP API นั้นใช้ HTTP ดังนั้นคุณสามารถใช้งานได้ทั้งใน PHP หรือ JavaScript ขึ้นอยู่กับความต้องการของคุณ


6
ฉันใช้ hostip.info มาหนึ่งปีแล้วและฉันก็ไม่ประทับใจ โดยปกติแล้วจะส่งคืนเช็คที่ไม่รู้จัก 9/10
aron

ตกลงมันบอกฉันว่าฉันอาศัยอยู่ใน Woking ... ในความเป็นธรรมมันได้รับบิต GB ขวา ... แต่ฉันอยู่ในลอนดอน
Jamie Hutber

2
โปรดทราบว่าบริการใด ๆ จะดีเท่าข้อมูลสาธารณะ / ข้อมูลที่มีอยู่ เนื่องจากเหตุผลความเป็นส่วนตัวข้อมูลนี้สามารถ "ดีมาก" เท่านั้น ถ้ามันทำให้ประเทศของคุณถูกต้องและอย่างน้อยก็ใกล้กับรัฐ / จังหวัดฉันจะถือว่าเป็นชัยชนะ หากคุณกำลังใช้ข้อมูลนี้เพื่อค้นหาข้อมูลสำหรับการโจมตีของ DOS โปรดทราบว่า IP อาจไม่ถูกต้อง (ไม่ได้กำหนดให้กับทุกคนหรือนอกช่วง IP สาธารณะที่ถูกต้อง)
eselk

ในเว็บไซต์ของพวกเขาฉันได้รับ "ที่ตั้ง: ... จริง ๆ แล้วเราไม่มีเงื่อนงำ" ทั้งหมดที่ฉันต้องรู้
Bojan Kogoj

15

ฉันเขียนบอทโดยใช้ API จากipapi.coนี่คือวิธีที่คุณสามารถหาที่อยู่ IP (เช่น1.2.3.4) ในphp:

ชุดส่วนหัว:

$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);

รับการตอบกลับ JSON

echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);

ของการรับฟิลด์เฉพาะ (ประเทศเขตเวลา ฯลฯ )

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);

1
@Eoin ลบออกแล้ว ดูเหมือนว่า IP ของ phpfiddle ถูก จำกัด
Jaimes

10

คำถามนี้ได้รับการคุ้มครองซึ่งฉันเข้าใจ อย่างไรก็ตามฉันไม่เห็นคำตอบที่นี่สิ่งที่ฉันเห็นคือผู้คนจำนวนมากแสดงสิ่งที่พวกเขาเกิดขึ้นจากการมีคำถามเดียวกัน

ขณะนี้มีการลงทะเบียนอินเทอร์เน็ตระดับภูมิภาคห้ารายการที่มีองศาการทำงานที่แตกต่างกันซึ่งทำหน้าที่เป็นจุดแรกของการติดต่อเกี่ยวกับการเป็นเจ้าของ IP กระบวนการอยู่ในฟลักซ์ซึ่งเป็นสาเหตุที่บริการต่าง ๆ ที่นี่บางครั้งทำงานไม่ได้ในเวลาอื่น

Who is is (ชัด) โปรโตคอล TCP โบราณ แต่ - วิธีการทำงาน แต่เดิมคือการเชื่อมต่อกับพอร์ต 43 ซึ่งทำให้เกิดปัญหาในการกำหนดเส้นทางผ่านการเชื่อมต่อเช่าผ่านไฟร์วอลล์ ... ฯลฯ

ในขณะนี้ - ใครเป็นผู้กระทำผ่าน RESTful HTTP และ ARIN ส่วนใหญ่ RIPE และ APNIC มีบริการ RESTful ที่ใช้งานได้ LACNIC ให้ผลตอบแทน 503 และ AfriNIC เห็นได้ชัดว่าไม่มี API ดังกล่าว (ทุกคนมีบริการออนไลน์)

นั่นจะทำให้คุณได้ - ที่อยู่ของเจ้าของที่ลงทะเบียนของ IP แต่ไม่ใช่ที่ตั้งของลูกค้าของคุณคุณต้องขอจากพวกเขาและคุณต้องขอมัน นอกจากนี้พร็อกซี่ยังเป็นกังวลน้อยที่สุดของคุณเมื่อตรวจสอบ IP ที่คุณคิดว่าเป็นผู้ริเริ่ม

ผู้คนไม่เห็นด้วยกับความคิดที่ว่าพวกเขากำลังถูกติดตามดังนั้น - ความคิดของฉันคือ - รับมันจากลูกค้าของคุณโดยตรงและได้รับอนุญาตจากพวกเขา


8

ดู API จาก hostip.info - ให้ข้อมูลจำนวนมาก
ตัวอย่างใน PHP:

$data = file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//$data contains: "US"

$data = file_get_contents("http://api.hostip.info/?ip=12.215.42.19");
//$data contains: XML with country, lat, long, city, etc...

หากคุณเชื่อถือ hostip.info ดูเหมือนว่าจะเป็น API ที่มีประโยชน์มาก


1
UNF เมื่อเทียบกับบริการอื่น ๆ HostIP เป็น waaaay ปิด .. www.ip-adress.com แต่เล็บมัน
สกอตต์ Evernden

8

บริการในการตอบสนองของ Ben Dowling มีการเปลี่ยนแปลงดังนั้นตอนนี้จึงง่ายขึ้น หากต้องการค้นหาตำแหน่งให้ทำดังนี้

// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city

พิกัดกลับมาในสตริงเดียวเช่น '31, -80 'ดังนั้นคุณจึงมีเพียง:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude

4
คุณถูกต้องว่าipinfo.ioจะส่งกลับรายละเอียดสำหรับ IP ของผู้โทรตามค่าเริ่มต้น หากคุณใช้งานเว็บไซต์ PHP ที่จะเป็น IP ของเซิร์ฟเวอร์ของคุณแทนที่จะเป็น IP ของผู้ใช้ นั่นคือเหตุผลที่คุณต้องผ่านใน $ _SERVER ['REMOTE_ADDR'] หากคุณแค่ต้องการพิกัดมันจะเร็วกว่าที่จะผนวก / loc ไปที่ URL เพื่อรับเฉพาะฟิลด์นั้นด้วย
เบ็นดาวลิ่ง

อานั่นเป็นเรื่องจริง! และฉันไม่รู้เกี่ยวกับ / loc - ฉันจะแก้ไขมันในเว็บไซต์ของฉันเองทันที
Isaac Askew

7

สมมติว่าคุณต้องการทำด้วยตัวเองและไม่ต้องพึ่งพาผู้ให้บริการรายอื่นIP2Nationให้ฐานข้อมูล MySQL ของการแมปที่ได้รับการอัปเดตเนื่องจากการลงทะเบียนภูมิภาคเปลี่ยนแปลงสิ่งต่าง ๆ


ฉันใช้บริการภายนอกและทันใดนั้นเว็บไซต์ของฉันก็ช้ามาก บริการภายนอกใช้เวลา 20 วินาทีในการส่งข้อมูลกลับซึ่งเป็นภัยพิบัติสำหรับผู้เข้าชม ตัดสินใจที่จะทำด้วยตัวเองและนี่คือทางออกที่สมบูรณ์แบบ ขอบคุณมาก.
Williamz902

7

ฉันใช้บริการที่IPLocate.ioซึ่งคุณสามารถขอใช้บริการได้ฟรีด้วยการโทรเพียงครั้งเดียว:

<?php
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8');
$res = json_decode($res);

echo $res->country; // United States
echo $res->continent; // North America
echo $res->latitude; // 37.751
echo $res->longitude; // -97.822

var_dump($res);

$resวัตถุจะมีเขตทางภูมิศาสตร์ของคุณชอบcountry, cityฯลฯ

ตรวจสอบเอกสารสำหรับข้อมูลเพิ่มเติม


7

ฉันชอบGeoLite Cityฟรีจาก Maxmind ซึ่งใช้งานได้กับแอพพลิเคชั่นส่วนใหญ่และคุณสามารถอัปเกรดเป็นเวอร์ชันที่จ่ายเงินได้หากมันไม่แม่นยำพอ มีPHP APIรวมอยู่รวมถึงภาษาอื่น ๆ และถ้าคุณใช้ Lighttpd เป็นเว็บเซิร์ฟเวอร์คุณสามารถใช้โมดูลเพื่อรับข้อมูลในตัวแปร SERVER สำหรับผู้เยี่ยมชมทุกคนหากเป็นสิ่งที่คุณต้องการ

ฉันควรเพิ่มนอกจากนี้ยังมีประเทศ Geoliteฟรี(ซึ่งจะเร็วขึ้นถ้าคุณไม่จำเป็นต้องระบุเมืองที่ IP นั้นมา) และ Geolite ASN (ถ้าคุณต้องการรู้ว่าใครเป็นเจ้าของ IP) และในที่สุดสิ่งเหล่านี้ สามารถดาวน์โหลดได้บนเซิร์ฟเวอร์ของคุณมีการอัพเดททุกเดือนและค่อนข้างเร็วในการค้นหาด้วย API ที่ให้มาเนื่องจากระบุว่า "มีการค้นหานับพันครั้งต่อวินาที"


1
คุณสามารถพิจารณา IP2Location LITE lite.ip2location.comซึ่งฟรี มันมีมากถึงข้อมูลรหัสไปรษณีย์ซึ่งมีประโยชน์มาก
Michael C.

6

PHP มีส่วนขยายสำหรับสิ่งนั้น

จาก PHP.net:

ส่วนขยาย GeoIP ช่วยให้คุณค้นหาตำแหน่งของที่อยู่ IP ข้อมูลเมืองรัฐประเทศลองจิจูดและอื่น ๆ เช่น ISP และประเภทการเชื่อมต่อสามารถรับได้ด้วยความช่วยเหลือของ GeoIP

ตัวอย่างเช่น:

$record = geoip_record_by_name($ip);
echo $record['city'];

3
นี่เป็นเพียงโมดูล php สำหรับฐานข้อมูล MaxMind ซึ่งเป็นเครื่องชำระ (รุ่น "lite" ฟรีนั้นไม่ถูกต้องอย่างมาก) ไม่ได้บอกว่ามันเป็นสิ่งที่ไม่ดี แต่มันมีประโยชน์สำหรับการใช้งานเชิงพาณิชย์เท่านั้น
คน

6

Ipdata.coเป็น IP Geolocation API ที่รวดเร็วและพร้อมใช้งานสูงพร้อมประสิทธิภาพที่เชื่อถือได้

สามารถปรับขนาดได้อย่างมากด้วยจุดปลายทาง 10 จุดทั่วโลกแต่ละแห่งสามารถจัดการ> 10,000 คำขอต่อวินาที!

คำตอบนี้ใช้คีย์ 'ทดสอบ' API ที่มี จำกัด มากและใช้สำหรับการทดสอบการโทรไม่กี่ครั้งเท่านั้น ลงทะเบียนสำหรับรหัส API ฟรีของคุณเองและรับคำขอได้มากถึง 1,500 คำขอต่อวันเพื่อการพัฒนา

ใน php

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->latitude;
37.751

นี่คือตัวอย่างฝั่งไคลเอ็นต์ที่แสดงว่าคุณได้ประเทศภูมิภาคและเมืองอย่างไร

$.get("https://api.ipdata.co?api-key=test", function (response) {
	$("#response").html(JSON.stringify(response, null, 4));
  $("#country").html('Country: ' + response.country_name);
  $("#region").html('Region ' + response.region);
  $("#city").html('City' + response.city);  
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="country"></div>
<div id="region"></div>
<div id="city"></div>
<pre id="response"></pre>

ขอสงวนสิทธิ์;

ฉันสร้างบริการ

สำหรับตัวอย่างในหลายภาษาดูเอกสาร

ยังเห็นนี้การวิเคราะห์รายละเอียดของที่ดีที่สุด APIs IP Geolocation


5

ในกรณีที่ทุกคนสะดุดกับหัวข้อนี้นี่เป็นวิธีแก้ปัญหาอื่น ที่timezoneapi.ioคุณสามารถขอที่อยู่ IP และรับสิ่งของหลายอย่างตอบแทน (ฉันได้สร้างบริการ) มันถูกสร้างขึ้นเพราะฉันต้องการที่จะรู้ว่าเขตเวลาที่ผู้ใช้ของฉันอยู่ที่ไหนในโลกและเวลาปัจจุบัน

ใน PHP - คืนค่าที่ตั้งเขตเวลาและวันที่ / เวลา:

// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');

// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);

// Decode
$data = json_decode($jsondata, true);

// Request OK?
if($data['meta']['code'] == '200'){

    // Example: Get the city parameter
    echo "City: " . $data['data']['city'] . "<br>";

    // Example: Get the users time
    echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";

}

ใช้ jQuery:

// Get JSON object
$.getJSON('https://timezoneapi.io/api/ip', function(data){

    // Request OK?
    if(data.meta.code == '200'){

        // Log
        console.log(data);

        // Example: Get the city parameter
        var city = data.data.city;
        alert(city);

        // Example: Get the users time
        var time = data.data.datetime.date_time_txt;
        alert(time);

    }

});

4

ต่อไปนี้เป็นตัวอย่างที่แก้ไขแล้วที่ฉันพบซึ่งใช้http://ipinfodb.com/ip_locator.phpเพื่อรับข้อมูล โปรดทราบว่าคุณสามารถใช้คีย์ API กับพวกเขาและใช้ API โดยตรงเพื่อรับข้อมูลที่ให้มาตามที่เห็นสมควร

เศษเล็กเศษน้อย

function detect_location($ip=NULL, $asArray=FALSE) {
    if (empty($ip)) {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
        else { $ip = $_SERVER['REMOTE_ADDR']; }
    }
    elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
        $ip = '8.8.8.8';
    }

    $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
    $i = 0; $content; $curl_info;

    while (empty($content) && $i < 5) {
        $ch = curl_init();
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 1,
            CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
        );
        if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
        curl_setopt_array($ch, $curl_opt);
        $content = curl_exec($ch);
        if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
        curl_close($ch);
    }

    $araResp = array();
    if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);

    $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';

    return $asArray ? $araResp : $strResp;
}

ใช้

detect_location();
//  returns "CITY, STATE" based on user IP

detect_location('xxx.xxx.xxx.xxx');
//  returns "CITY, STATE" based on IP you provide

detect_location(NULL, TRUE);    //   based on user IP
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

detect_location('xxx.xxx.xxx.xxx', TRUE);   //   based on IP you provide
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

4

ถ้าคุณต้องการที่จะได้รับตำแหน่งจากที่อยู่ IP คุณสามารถใช้บริการทางภูมิศาสตร์ IP น่าเชื่อถือและคุณจะได้รับรายละเอียดเพิ่มเติมที่นี่ รองรับ IPv6

โบนัสจะอนุญาตให้ตรวจสอบว่าที่อยู่ ip เป็นโหนดโหนพร็อกซีสาธารณะหรือสแปมเมอร์หรือไม่

คุณสามารถใช้ javascript หรือ php ได้ดังต่อไปนี้

รหัส Javascript:

$(document).ready(function () {
        $('#btnGetIpDetail').click(function () {
            if ($('#txtIP').val() == '') {
                alert('IP address is reqired');
                return false;
            }
            $.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
                 function (result) {
                     alert('City Name: ' + result.city)
                     console.log(result);
                 });
        });
    });

รหัส php:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

เอาท์พุท:

{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}

3

ฉันได้สร้างเสื้อคลุมสำหรับ ipinfo.io คุณสามารถติดตั้งโดยใช้ผู้แต่ง

คุณสามารถใช้วิธีนี้:

$ipInfo = new DavidePastore\Ipinfo\Ipinfo();

//Get all the properties
$host = $ipInfo->getFullIpDetails("8.8.8.8");

//Read all the properties
$city = $host->getCity();
$country = $host->getCountry();
$hostname = $host->getHostname();
$ip = $host->getIp();
$loc = $host->getLoc();
$org = $host->getOrg();
$phone = $host->getPhone();
$region = $host->getRegion();


2

ฉันได้ทำการทดสอบกับที่อยู่ IP แล้วและนี่คือวิธีที่ฉันทำเอง ก่อนปิดลิงก์ที่เชื่อมโยงไปยังเว็บไซต์ที่มีประโยชน์ที่ฉันใช้:

https://db-ip.com/db มีบริการค้นหาไอพีฟรีและมีไฟล์ csv ฟรีให้คุณดาวน์โหลด นี่ใช้รหัส api ฟรีที่แนบมากับอีเมลของคุณ มัน จำกัด ที่ 2000 แบบสอบถามต่อวัน

http://ipinfo.io/ ฟรีบริการค้นหา ip โดยไม่มีฟังก์ชั่น PHP ของ API ที่สำคัญ:

//uses http://ipinfo.io/.
function ip_visitor_country($ip){
    $ip_data_in = get_web_page("http://ipinfo.io/".$ip."/json"); //add the ip to the url and retrieve the json data
    $ip_data = json_decode($ip_data_in['content'],true); //json_decode it for php use

    //this ip-lookup service returns 404 if the ip is invalid/not found so return false if this is the case.
    if(empty($ip_data) || $ip_data_in['httpcode'] == 404){
        return false;
    }else{
        return $ip_data; 
    }
}

function get_web_page($url){
    $user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';

    $options = array(
        CURLOPT_CUSTOMREQUEST  =>"GET",        //set request type post or get
        CURLOPT_POST           =>false,        //set to GET
        CURLOPT_USERAGENT      => $user_agent, //set user agent
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );
    $ch = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    $httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    curl_close( $ch );  
    $header['errno']   = $err; //curl error code
    $header['errmsg']  = $errmsg; //curl error message
    $header['content'] = $content; //the webpage result (In this case the ip data in json array form)
    $header['httpcode'] = $httpCode; //the webpage response code
    return $header; //return the collected data and response codes
}

ในท้ายที่สุดคุณจะได้รับสิ่งนี้:

Array
(
    [ip] => 1.1.1.1
    [hostname] => No Hostname
    [city] => 
    [country] => AU
    [loc] => -27.0000,133.0000
    [org] => AS15169 Google Inc.
)

http://www.geoplugin.com/ แก่กว่าเล็กน้อย แต่บริการนี้ให้ข้อมูลที่เป็นประโยชน์มากมายเช่นสกุลเงินนอกประเทศรหัสทวีปลองจิจูดและอีกมากมาย


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude เสนอกลุ่มของไฟล์ที่ดาวน์โหลดได้พร้อมคำแนะนำเพื่อนำเข้าสู่ฐานข้อมูลของคุณ เมื่อคุณลบไฟล์เหล่านี้ในฐานข้อมูลแล้วคุณสามารถเลือกข้อมูลได้อย่างง่ายดาย

SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to

ใช้ฟังก์ชั่น php ip2long (); เพื่อเปลี่ยนที่อยู่ IP ให้เป็นค่าตัวเลข ตัวอย่างเช่น 1.1.1.1 กลายเป็น 16843009 สิ่งนี้ช่วยให้คุณสแกนหาช่วง ip ที่ไฟล์ฐานข้อมูลกำหนดให้คุณ

ดังนั้นเพื่อที่จะหาว่า 1.1.1.1 เป็นของทุกสิ่งที่เราทำคือเรียกใช้แบบสอบถามนี้:

SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;

ส่งคืนข้อมูลนี้เป็นตัวอย่าง

FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809

2

มีวิธีการที่ครอบคลุม 2 แบบในการระบุตำแหน่งทางภูมิศาสตร์ IP: วิธีหนึ่งคือการดาวน์โหลดชุดข้อมูลโฮสต์ไว้ในโครงสร้างพื้นฐานของคุณและปรับปรุงให้ทันสมัยอยู่เสมอ สิ่งนี้ต้องใช้เวลาและความพยายามโดยเฉพาะหากคุณต้องการรองรับคำขอจำนวนมาก โซลูชันอื่นคือการใช้บริการ API ที่มีอยู่ซึ่งจัดการงานทั้งหมดให้คุณและอีกมากมาย

มีบริการ Geolocation API อยู่มากมาย: Maxmind, Ip2location, Ipstack, IpInfo เป็นต้นเมื่อเร็ว ๆ นี้ บริษัท ที่ฉันทำงานให้เปลี่ยนมาใช้Ipregistry ( https://ipregistry.co ) และฉันมีส่วนร่วมในกระบวนการตัดสินใจและการดำเนินการ นี่คือองค์ประกอบบางอย่างที่คุณควรพิจารณาในขณะที่ค้นหา API ตำแหน่งทางภูมิศาสตร์ของ IP:

  • บริการถูกต้องหรือไม่ พวกเขาใช้แหล่งข้อมูลเดียวหรือไม่
  • พวกเขาสามารถจัดการกับภาระของคุณได้จริงหรือ
  • พวกเขาให้เวลาตอบสนองที่สอดคล้องและรวดเร็วทั่วโลก (ยกเว้นว่าผู้ใช้ของคุณเป็นประเทศที่เฉพาะเจาะจง)?
  • รูปแบบการกำหนดราคาของพวกเขาคืออะไร

นี่คือตัวอย่างเพื่อรับข้อมูลตำแหน่งทางภูมิศาสตร์ของ IP (แต่ยังรวมถึงภัยคุกคามและข้อมูลตัวแทนผู้ใช้โดยใช้การโทรเพียงครั้งเดียว):

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;

หมายเหตุ: ฉันไม่ได้อยู่ที่นี่เพื่อโปรโมต Ipregistry และบอกว่าดีที่สุด แต่ฉันใช้เวลานานในการวิเคราะห์โซลูชันที่มีอยู่และโซลูชันของพวกเขามีแนวโน้มดีจริงๆ


-1

หากคุณกำลังค้นหาฐานข้อมูลที่อัพเดท / ถูกต้องฉันแนะนำให้ใช้ที่นี่เพราะมันแสดงตำแหน่งที่แน่นอนของฉันซึ่งไม่รวมอยู่ในบริการอื่น ๆ อีกมากมายเมื่อฉันทำการทดสอบ
(เมืองRashtของฉันและประเทศของฉันอยู่Iranกับที่อยู่นี้: 2.187.21.235เมื่อฉันทำการทดสอบ)

ฉันแนะนำให้ใช้ฐานข้อมูลแทนวิธีการ API เพราะมันจะถูกประมวลผลเร็วขึ้นในเครื่อง


-1

โอเคขอบคุณสำหรับคำแนะนำของคุณ; ในขณะที่ฉันมี 6k + ของ IP บริการบางอย่างจะล้มเหลวในการร้องขอของฉันเนื่องจากข้อ จำกัด บางอย่าง; ดังนั้นคุณสามารถใช้พวกมันทั้งหมดในโหมดทางเลือก;

หากเรามีไฟล์ต้นฉบับที่มีรูปแบบดังต่อไปนี้:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

เกินกว่าที่คุณจะใช้คำสั่ง expample อย่างง่ายนี้ (PoC) สำหรับ Yii:

class GeoIPCommand extends CConsoleCommand
{

public function actionIndex($filename = null)
{
    //http://freegeoip.net/json/{$ip} //10k requests per hour
    //http://ipinfo.io/{$ip}/json //1k per day
    //http://ip-api.com/json/{$ip}?fields=country,city,regionName,status //150 per minute

    echo "start".PHP_EOL;

    $handle      = fopen($filename, "r");
    $destination = './good_locations.txt';
    $bad         = './failed_locations.txt';
    $badIP       = [];
    $goodIP      = [];

    $destHandle = fopen($destination, 'a+');
    $badHandle  = fopen($bad, 'a+');

    if ($handle)
    {
        while (($line = fgets($handle)) !== false)
        {
            $result = preg_match('#(\d+)\s+(\d+\.\d+\.\d+\.\d+)#', $line, $id_ip);
            if(!$result) continue;

            $id = $id_ip[1];
            $ip = $id_ip[2];
            $ok = false;

            if(isset($badIP[$ip])) 
            {
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                continue;
            }

            if(isset($goodIP[$ip]))
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]);
                continue;
            }

            $query = @json_decode(file_get_contents('http://freegeoip.net/json/'.$ip));
            $city = property_exists($query, 'region_name')? $query->region_name : '';
            $city .= property_exists($query, 'city') && $query->city && ($query->city != $city) ? ', ' . $query->city : '';

            if($city)
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                $ok = true;
            }

            if(!$ok)
            {
                $query = @json_decode(file_get_contents('http://ip-api.com/json/'. $ip.'?fields=country,city,regionName,status'));
                if($query && $query->status == 'success')
                {
                    $city = property_exists($query, 'regionName')? $query->regionName : '';
                    $city .= property_exists($query, 'city') && $query->city ? ',' . $query->city : '';

                    if($city)
                    {
                        fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                        echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                        $ok = true;
                    }
                }
            }

            if(!$ok)
            {
                $badIP[$ip] = false;
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, 'Unknown');
            }

            if($ok)
            {
                $goodIP[$ip] = $city;
            }
        }

        fclose($handle);
        fclose($badHandle);
        fclose($destHandle);
    }else{
        echo 'Can\'t open file' . PHP_EOL; 
        return;
    }

    return;
}

}

นี่เป็นโค้ด shitty แต่ใช้งานได้ การใช้งาน:

./yiic geoip index --filename="./source_id_ip_list.txt"

รู้สึกอิสระที่จะใช้แก้ไขและทำมันได้ดีกว่า)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.