php - आईपी पते से स्थान प्राप्त करना
geolocation ip (16)
Google एपीआईएस का उपयोग करना:
<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>
मैं अपने आईपी पते से एक आगंतुक के शहर, राज्य और देश जैसी जानकारी पुनर्प्राप्त करना चाहता हूं, ताकि मैं अपने वेब पेज को उनके स्थान के अनुसार अनुकूलित कर सकूं। क्या PHP में ऐसा करने का कोई अच्छा और विश्वसनीय तरीका है? मैं क्लाइंट-साइड स्क्रिप्टिंग के लिए जावास्क्रिप्ट का उपयोग कर रहा हूं, सर्वर-साइड स्क्रिप्टिंग के लिए PHP, और डेटाबेस के लिए MySQL।
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 पर भरोसा करते हैं, तो यह एक बहुत ही उपयोगी एपीआई प्रतीत होता है।
अगर कोई इस धागे पर ठोकर खाता है, तो यहां एक और समाधान है। Timezoneapi.io पर आप एक आईपी पते का अनुरोध कर सकते हैं और बदले में कई ऑब्जेक्ट प्राप्त कर सकते हैं (मैंने सेवा बनाई है)। यह बनाया गया था क्योंकि मुझे यह जानने की ज़रूरत थी कि मेरे उपयोगकर्ता किस समय में थे, जहां दुनिया में और वर्तमान में यह किस समय है।
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);
}
});
आप "स्मार्ट-आईपी" सेवा का भी उपयोग कर सकते हैं:
$.getJSON("http://smart-ip.net/geoip-json?callback=?",
function (data) {
alert(data.countryName);
alert(data.city);
}
);
आपको बाहरी सेवा का उपयोग करने की आवश्यकता है ... जैसे http://www.hostip.info/ अगर आप "geo-ip" के लिए खोज करते हैं तो आप अधिक परिणाम प्राप्त कर सकते हैं।
होस्ट-आईपी एपीआई HTTP आधारित है ताकि आप इसे अपनी आवश्यकताओं के आधार पर PHP या जावास्क्रिप्ट में उपयोग कर सकें।
ठीक है, दोस्तों, आपके सुझावों के लिए धन्यवाद; जबकि मेरे पास 6k + आईपी हैं, कुछ सीमाएं कुछ सीमाओं के कारण मेरे अनुरोध विफल हो जाएंगी; तो, आप उन सभी को फ़ॉलबैक मोड में उपयोग कर सकते हैं;
अगर हमारे पास निम्नलिखित प्रारूप के साथ स्रोत फ़ाइल है:
user_id_1 ip_1
user_id_2 ip_2
user_id_3 ip_1
आप 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;
}
}
यह किसी प्रकार का शर्टी-कोड है, लेकिन यह काम करता है। उपयोग:
./yiic geoip index --filename="./source_id_ip_list.txt"
उपयोग करने के लिए स्वतंत्र महसूस करें, इसे संशोधित करें, और इसे बेहतर करें)
बेन डॉउलिंग की प्रतिक्रिया में सेवा बदल गई है, इसलिए अब यह आसान है। स्थान ढूंढने के लिए, बस करें:
// 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
मान लीजिए कि आप इसे स्वयं करना चाहते हैं और अन्य प्रदाताओं पर भरोसा नहीं करना चाहते हैं, IP2Nation मैपिंग्स का एक MySQL डेटाबेस प्रदान करता है जिसे क्षेत्रीय रजिस्ट्रियां बदलती हैं क्योंकि चीजें बदलती हैं।
मैंने 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();
मैंने ipapi.co से एपीआई का उपयोग करके एक बॉट लिखा है, यहां बताया गया है कि आप एक आईपी पते के लिए स्थान कैसे प्राप्त कर सकते हैं (उदाहरण के लिए 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);
मैंने कुछ महीने पहले इस लेख को लिखा था और आपके लिए सहायक हो सकता है। आलेख आईपी 2 देश के ओपन सोर्स डेटाबेस के उपयोग पर वर्णन करता है और एक ओपन सोर्स डेटाबेस काम करने के लिए मैंने लिखा एक php वर्ग के बारे में भी वर्णन करता है। लिंक यहां दिया गया है
http://www.samundra.com.np/find-visitors-country-using-his-ip-address/1018
यदि आपको इस संबंध में किसी भी मदद की ज़रूरत है तो कृपया मुझे साइट पर टिप्पणी छोड़ दें।
उम्मीद है कि यह आपकी मदद करता है।
यदि आप एक अद्यतन / सटीक डेटाबेस की तलाश में हैं, तो मैं इसे here उपयोग करने की अनुशंसा करता हूं क्योंकि यह मेरा सटीक स्थान दिखा रहा था जो परीक्षण करते समय कई अन्य सेवाओं में शामिल नहीं था।
(मेरा शहर 2.187.21.235
था और मेरा देश इस आईपी पते के साथ Iran
था: 2.187.21.235
जब मैं परीक्षण कर रहा था।)
मैं एपीआई विधियों के बजाय डेटाबेस का उपयोग करने की सलाह देता हूं, क्योंकि इसे स्थानीय रूप से बहुत तेज़ी से संसाधित किया जाएगा।
यह सवाल संरक्षित है, जिसे मैं समझता हूं। हालांकि, मुझे यहां कोई जवाब नहीं दिख रहा है, जो मैं देखता हूं वह बहुत से लोग दिखाते हैं कि वे एक ही प्रश्न रखने के साथ क्या आए थे।
वर्तमान में पांच क्षेत्रीय इंटरनेट रजिस्ट्रीज हैं जो कार्यक्षमता की विभिन्न डिग्री हैं जो आईपी स्वामित्व के संबंध में संपर्क के पहले बिंदु के रूप में कार्य करती हैं। प्रक्रिया प्रवाह में है, यही कारण है कि यहां विभिन्न सेवाएं कभी-कभी काम करती हैं और दूसरी बार नहीं होती हैं।
कौन है (स्पष्ट रूप से) एक प्राचीन टीसीपी प्रोटोकॉल है, हालांकि - जिस तरह से यह मूल रूप से काम करता है वह पोर्ट 43 के संबंध में था, जिससे इसे पट्टे पर चलने वाले कनेक्शन के माध्यम से पट्टे पर कनेक्शन के माध्यम से समस्याग्रस्त हो जाता है ... आदि।
इस समय - रीस्टफुल HTTP और एआरआईएन, आरआईपीई और एपीएनआईसी के माध्यम से सबसे ज्यादा किया जाता है जो काम करने वाली रीस्टफुल सेवाएं हैं। एलएसीएनआईसी का 503 रिटर्न और अफ्रिनिक के पास ऐसा कोई एपीआई नहीं है। (हालांकि सभी ऑनलाइन सेवाएं हैं।)
यह आपको मिलेगा - आईपी के पंजीकृत मालिक का पता, लेकिन - आपके ग्राहक का स्थान नहीं - आपको उनसे यह भी प्राप्त करना होगा - आपको इसके लिए भी पूछना होगा। इसके अलावा, आईपी को सत्यापित करते समय प्रॉक्सी आपकी चिंताओं में से कम से कम हैं जो आपको लगता है कि उत्प्रेरक है।
लोग इस धारणा की सराहना नहीं करते कि उन्हें ट्रैक किया जा रहा है, इसलिए - मेरे विचार हैं - इसे सीधे अपने ग्राहक से प्राप्त करें और उनकी अनुमति के साथ और धारणा पर बहुत कुछ करने की उम्मीद है।
सोचा था कि मैं पोस्ट करूंगा क्योंकि किसी ने इस विशेष एपीआई पर जानकारी नहीं दी है, लेकिन यह ठीक है कि मैं इसके बाद क्या कर रहा हूं और आप इसे कई प्रारूपों, 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": ""
}
Ipdata.co आपको किसी भी आईपीवी 4 या आईपीवी 6 पते से भौगोलिक स्थान, संगठन, मुद्रा, टाइमज़ोन , कॉलिंग कोड, ध्वज और टोर निकास नोड स्थिति डेटा देता है।
यह दुनिया भर में 10 एंडपॉइंट्स के साथ बेहद स्केलेबल और तेज़ है, प्रत्येक को 800 एम कॉल करने में सक्षम है।
PHP में
php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}"));
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", 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>
अस्वीकरण;
मैंने सेवा बनाई
कई भाषाओं में उदाहरणों के लिए Docs देखें
मैं वही जवाब दूंगा जो मैंने here किया था क्योंकि सेवा PHP के लिए भी उपलब्ध है:
मुझे मैक्समिंड से मुफ्त जियोलाइट सिटी पसंद है जो अधिकांश एप्लिकेशन के लिए काम करता है और इससे आप एक भुगतान संस्करण में अपग्रेड कर सकते हैं यदि यह पर्याप्त सटीक नहीं है। एक PHP एपीआई भी शामिल है, साथ ही साथ अन्य भाषाओं के लिए भी। और यदि आप लाइटटैड को वेबसर्वर के रूप में चला रहे हैं, तो आप प्रत्येक विज़िटर के लिए SERVER चर में जानकारी प्राप्त करने के लिए module का उपयोग भी कर सकते हैं यदि आपको इसकी आवश्यकता हो।
मुझे जोड़ना चाहिए कि एक मुफ्त जिओलाइट देश भी है (जो तेज होगा यदि आपको आईपी से शहर को इंगित करने की आवश्यकता नहीं है) और जिओलाइट एएसएन (यदि आप जानना चाहते हैं कि आईपी का मालिक कौन है) और अंत में ये सभी हैं अपने सर्वर पर डाउनलोड करने योग्य, हर महीने अपडेट होते हैं और प्रदान किए गए एपीआई के साथ देखने के लिए बहुत तेज़ होते हैं क्योंकि वे "प्रति सेकंड हजारों लुकअप" कहते हैं।