Files
DESKTOP-GBA0BK8\Admin 7c8c8b1c76 first commit
2023-04-08 12:19:53 -04:00

112 lines
3.0 KiB
PHP

<?php
namespace YellowTree\GeoipDetect\DataSources\HostInfo;
use YellowTree\GeoipDetect\DataSources\AbstractDataSource;
use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
const URL = 'http://api.hostip.info/get_json.php?ip=';
protected $options;
function __construct($options) {
$default_options = array(
'timeout' => 1,
);
$this->options = $options + $default_options;
}
public function city($ip) {
if (!geoip_detect_is_ip($ip, true))
throw new \Exception('The Hostip.info-Database only contains IPv4 adresses.');
$data = $this->api_call($ip);
if (!$data)
return null;
$r = array();
$r['traits']['original'] = $data;
if ($data['country_name'])
$r['country']['names'] = array('en' => $data['country_name']);
if ($data['country_code'])
$r['country']['iso_code'] = strtoupper($data['country_code']);
if ($data['city']) {
$r['city']['names'] = array('en' => $data['city']);
}
$r['traits']['ip_address'] = $ip;
$record = new \GeoIp2\Model\City($r, array('en'));
return $record;
}
public function country($ip) {
return $this->city($ip); // too much info shouldn't hurt ...
}
public function close() {
}
private function api_call($ip) {
try {
// Setting timeout limit to speed up sites
$context = stream_context_create(
array(
'http' => array(
'timeout' => $this->options['timeout'],
),
)
);
// Using @file... to supress errors
// Example output: {"country_name":"UNITED STATES","country_code":"US","city":"Aurora, TX","ip":"12.215.42.19"}
$body = @file_get_contents(self::URL . $ip, false, $context);
$data = json_decode($body);
$hasInfo = false;
if ($data) {
$data = get_object_vars($data);
foreach ($data as $key => &$value) {
if (stripos($value, '(unknown') !== false)
$value = '';
if (stripos($value, '(private') !== false)
$value = '';
if ($key == 'country_code' && $value == 'XX')
$value = '';
}
$hasInfo = $data['country_name'] || $data['country_code'] || $data['city'];
}
if ($hasInfo)
return $data;
return null;
} catch (\Exception $e) {
// If the API isn't available, we have to do this
return null;
}
}
}
class HostInfoDataSource extends AbstractDataSource {
public function getId() { return 'hostinfo'; }
public function getLabel() { return __('HostIP.info Web-API', 'geoip-detect'); }
public function getDescriptionHTML() { return __('Free (Licence: GPL)<br />(only English names, does only have the following fields: country name, country ID and city name)', 'geoip-detect'); }
public function getStatusInformationHTML() { return __('You can choose a Maxmind database below.', 'geoip-detect'); }
public function getParameterHTML() { return ''; }
public function getReader($locales = array('en'), $options = array()) { return new Reader($options); }
public function isWorking() { return true; }
}
geoip_detect2_register_source(new HostInfoDataSource());