2010-04-04 45 views
17

Kỹ thuật phát hiện vị trí cho địa chỉ IP là gì?
Tôi biết nhìn vào các
$_SERVER['HTTP_ACCEPT_LANGUAGE'] (không chính xác nhưng chủ yếu là hữu ích để phát hiện vị trí, ví dụ nếu người dùng một dãy IP của thiết Pháp để trình duyệt của họ thì có nghĩa là phạm vi này) thuộc về Pháp

gethostbyaddr($_SERVER['REMOTE_ADDR']) (nhìn tên miền quốc gia cấp cao nhất)
sau đó có thể để whois gethostbyaddr($_SERVER['REMOTE_ADDR'])
đôi khi:
$HTTP_USER_AGENT (string user agent của Firefox có mã ngôn ngữ, không chính xác, nhưng chủ yếu có thể được sử dụng để phát hiện các vị trí)
Kỹ thuật phát hiện vị trí cho địa chỉ IP

Ngoài ra tôi biết cách lấy múi giờ nhưng nó không hoạt động trong các trình duyệt mới. Ngoài ra có css issue phát hiện lịch sử của khách truy cập, nó có thể được sử dụng để xem những trang google và wikipedia mà anh/cô ấy đã truy cập (google.co.uk, google.com.tr)

Nhưng còn thành phố thì sao?

+1

Nhiều bản sao, bao gồm http://stackoverflow.com/questions/283016/know-a-good-ip-address -geolocation-service và http://stackoverflow.com/questions/2244989/need-a-client-side-api-for-determing-geo-location-of-ip-addresses – skaffman

+3

Không, họ yêu cầu dịch vụ, tôi hỏi cách những dịch vụ đó phát hiện ra các địa điểm. – ilhan

Trả lời

7

Bạn không thể thực hiện việc này mà không có cơ sở dữ liệu ánh xạ địa chỉ IP tới các thành phố/quốc gia/nhà cung cấp. Có các dịch vụ thương mại như ip2location mà bạn có thể sử dụng. AFAIK không có thay thế miễn phí mặc dù, như duy trì cơ sở dữ liệu IP như vậy là khá nhiều công việc. miễn phí thay thế: GeoIP2

Cập nhật: Có một số điều mà cho phép bạn tạo một db như vậy, nếu bạn đầu tư đủ thời gian:

  1. Sử dụng cơ sở dữ liệu được cung cấp bởi regional and local registries để tìm chủ sở hữu của một IP .
  2. Nhiều ISP sử dụng lược đồ đặt tên cho phép bạn định vị người dùng. Đôi khi bạn có thể thậm chí đọc tên thành phố ở dạng văn bản thuần túy nếu bạn thực hiện tra cứu DNS ngược. Đôi khi nó là khó hiểu hơn. Ví dụ tôi hiện đang có p5dcf6c4a.dip.t-dialin.net và tôi không có ý tưởng rằng sơ đồ đặt tên là ..
  3. Sử dụng traceroute. Nếu bạn không thể xác định vị trí của người dùng, bạn vẫn có thể tìm thấy địa chỉ của vị trí của đường lên của nó
+0

Vâng, tôi biết họ nhưng tôi muốn tìm hiểu cách họ tạo cơ sở dữ liệu của riêng mình. – ilhan

2

Có cơ sở dữ liệu (một số miễn phí) có thể được sử dụng để chuyển đổi IP thành Thành phố :

ví dụ: http://www.maxmind.com/app/geolitecity

+0

Tôi biết điều đó, nó rất hữu ích cho các nước lớn nhưng nó không chính xác cho Bulgaria. Tất cả các du khách của tôi đến từ phía đông nam Bulgaria, nhưng nó cho thấy họ giống như họ đến từ trung tâm phía tây (thủ đô). – ilhan

0

Một cách trong đó các cơ sở dữ liệu này được biên soạn từ thông tin whois. Ví dụ, để xác định vị trí của 69.59.196.211:

fmark @ home: ~ $ host 69.59.196.211 211.196.59.69.in-addr.arpa miền tên con trỏ stackoverflow.com. fmark @ home: ~ $ stackoverflow.com whois

Whois Server phiên bản 2.0

tên miền trong .com và .net lĩnh bây giờ có thể được đăng ký với nhiều nhà đăng ký thi đấu khác nhau.

<SNIP> 

> Registrant: stackoverflow.com llc
410 Clayton Ave El Cerrito, California 94.530 Hoa Kỳ

<SNIP> 

Rõ ràng đây không phải là vô cùng chính xác, kỹ thuật rất tinh vi hơn bị cáo buộc sử dụng.

4

Nếu bạn tìm kiếm một số bản sao - giải pháp dán, i foudn mã này:

function countryCityFromIP($ipAddr) 
{ 
//function to find country and city from IP address 
//Developed by Roshan Bhattarai http://roshanbh.com.np 

//verify the IP address for the 
ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : ""; 
$ipDetail=array(); //initialize a blank array 

//get the XML result from hostip.info 
$xml = file_get_contents("http://api.hostip.info/?ip=".$ipAddr); 

//get the city name inside the node <gml:name> and </gml:name> 
preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si",$xml,$match); 

//assing the city name to the array 
$ipDetail['city']=$match[2]; 

//get the country name inside the node <countryName> and </countryName> 
preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches); 

//assign the country name to the $ipDetail array 
$ipDetail['country']=$matches[1]; 

//get the country name inside the node <countryName> and </countryName> 
preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si",$xml,$cc_match); 
$ipDetail['country_code']=$cc_match[1]; //assing the country code to array 

//return the array containing city, country and country code 
return $ipDetail; 

} 

Hy vọng điều này sẽ giúp ai đó.

+1

http://api.hostip.info dường như không còn nữa – shenkwen

1

Thay vì sử dụng API của bên thứ ba, tôi khuyên bạn nên sử dụng bản ghi IP tự lưu trữ. Bài viết này giải thích cho bạn nhiều

http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

Về cơ bản họ đang sử dụng thành phố cả nước kỷ lục cơ sở dữ liệu IP MaxMind của [http://dev.maxmind.com/geoip/geoip2/geolite2/] với vài sửa đổi. Sau đó một truy vấn mẫu

$ip = $_SERVER['REMOTE_ADDR']; 
$long = sprintf('%u', ip2long($ip)); 
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`"; 
0

Nếu các chức năng định vị địa lý không phải là một yêu cầu lớn cho dự án của bạn, bạn có thể sử dụng một cái gì đó đơn giản như này:

$geotxt=''; 
$dt=json_decode(@file_get_contents('https://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR'])); 
if ($dt!=null) $geotxt=$dt->country_name.', '.$dt->region_name.', '.$dt->city; 
echo $geotxt; 

Bạn cần phải đưa vào tài khoản mà freegeoip có giới hạn yêu cầu 10k/giờ.

0

U có thể sử dụng chức năng này

function ip_info(){ 
      return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true); 
     } 

Gọi chức năng

$info = ip_info(); 
var_dump($info); 
+0

Làm thế nào để bạn chuyển địa chỉ IP đến chức năng này khác với địa chỉ IP hiện tại của bạn? Tôi đang ghi địa chỉ IP khi ai đó nhập dữ liệu vào biểu mẫu, tôi chỉ muốn xác minh người dùng đang nhập spam hoặc rác –

+0

@KimWilson xem câu trả lời của tôi bên dưới – Jonathan

0

Hầu hết các cơ sở dữ liệu hiện có sử dụng một tập hợp dữ liệu từ cơ quan đăng ký quốc tế ARIN, AFRINIC, ANIC vv cũng như người dùng vị trí đã gửi. Các kỹ thuật phức tạp hơn bao gồm Định vị Địa lý và Ràng buộc.

Tôi chạy API của riêng mình https://ipdata.co cung cấp một số điểm dữ liệu bao gồm, quốc gia, thành phố, vùng, vĩ độ/dài và các điểm khác.

php > $data = json_decode(file_get_contents('https://api.ipdata.co/69.59.196.211'),true); 
php > echo $data['country_name']; 
//United States 
php > echo $data['city']; 
//Albany 
0

Bạn có thể ánh xạ một địa chỉ IP đến vị trí của nó (thành phố, quốc gia, mã bưu điện), múi giờ, vv với một trong hai cơ sở dữ liệu hoặc một API (lưu trữ cơ sở dữ liệu).

Dưới đây là một ví dụ của việc sử dụng một API

curl https://ipapi.co/city/ 
> Mountain View 

curl https://ipapi.co/country/ 
> US 

curl https://ipapi.co/timezone/ 
> America/Los_Angeles 

thêm ở đây: Location from IP address

Các vấn đề liên quan