В этой статье показано, как получить информацию об IP посетителя сайта, используя Geolocation API ряда Who-is провайдеров:
– IP-API
– IP-Info
– Geobytes
– SxGeo
На самом деле, источников получения данных об IP посетителя существуют и более. Однако, экспериментальным путем выбраны выше перечисленные. Другие либо обладают не полной базой данных, либо неточны, либо не обладают интерфейсом API для удаленного доступа к их БД, либо требуют денег.
Формат доступа к выбранным провайдерам разный, а именно:
– строка доступа к IP-API
// Receiving data from API JSON – format.
$country_info = json_decode( $wp_filesystem->get_contents( ‘http://ip-api.com/json/’ . $user_ip ), true );
– строка доступа к IP-Info
// Receiving data from API JSON – format.
$country_info = json_decode( $wp_filesystem->get_contents( ‘http://ipinfo.io/’ . $user_ip . ‘/json’ ) );
– строка доступа к Geobytes
// Receiving data from API JSON – format.
$country_info = json_decode( $wp_filesystem->get_contents( ‘http://gd.geobytes.com/GetCityDetails?fqcn=’ . $user_ip ), true );
– строка доступа к SxGeo
// Receiving data from API JSON – format.
$geo_api_request = ‘http://api.sypexgeo.net/json/’ . $user_ip;
Хотя данные от перечисленных Who-is провайдеров поступают в большом объема, плагин WatchMan-Site7 принимает и хранит лишь часть:
– Код и название страны.
– Название города.
– Название интернет провайдера посетителя сайта.
– Географические координаты интернет провайдера посетителя сайта (широта, долгота).
Ниже представлен отлаженный и хорошо зарекомендовавший себя код:
<?php /** * Description: Takes the IP of the visitor. Returns an array of information about IP. * * @category wms7-ip-info.php * @package WatchMan-Site7 * @author Oleg Klenitskiy <klenitskiy.oleg@mail.ru> * @version 3.0.0 * @license GPLv2 or later */ if ( ! defined( 'ABSPATH' ) ) { exit(); } /** * Used for select of name who is provider. * * @param string $user_ip User ip. * @param string $provider_who_is Name of who is provider. * @return array. */ function wms7_who_is( $user_ip, $provider_who_is ) { switch ( $provider_who_is ) { case 'IP-API': return wms7_ip_api( $user_ip ); case 'IP-Info': return wms7_ip_info( $user_ip ); case 'Geobytes': return wms7_geobytes( $user_ip ); case 'SxGeo': return wms7_sx_geo( $user_ip ); case 'none': return array(); } } /** * Used to retrieve ip information from the provider IP_API. * * @param string $user_ip User ip. * @return array. */ function wms7_ip_api( $user_ip ) { WP_Filesystem(); global $wp_filesystem; $_https = filter_input( INPUT_SERVER, 'HTTPS', FILTER_SANITIZE_STRING ); $_server_port = filter_input( INPUT_SERVER, 'SERVER_PORT', FILTER_SANITIZE_STRING ); $str_info = array(); // Receiving data from API JSON - format. $country_info = json_decode( $wp_filesystem->get_contents( 'http://ip-api.com/json/' . $user_ip ), true ); // get user country code. $country_code = isset( $country_info['countryCode'] ) ? $country_info['countryCode'] : 'AA'; // get user country flag. $path_img = WP_PLUGIN_URL . '/watchman-site7/images/flags/' . $country_code . '.gif'; if ( ( isset( $_https ) && 'on' === strtolower( $_https ) ) || ( isset( $_server_port ) && '443' === $_server_port ) ) { $path_img = str_replace( 'http:', 'https:', $path_img ); } $flag = '<img src=' . $path_img . '>'; // get user country region. $region = isset( $country_info['regionName'] ) ? $country_info['regionName'] : ''; // get user country city. $city = isset( $country_info['city'] ) ? $country_info['city'] : ''; // get user country name. $country_name = wms7_country_name( $country_code ); // info. $str_info['country'] = ( '[' . $country_code . '] ' . $flag . '<br>' . 'Country: ' . $country_name . '<br>' . 'Region: ' . $region . '<br>' . 'City: ' . $city ); $provider = isset( $country_info['as'] ) ? $country_info['as'] : 'no data'; $str_info['provider'] = $provider; // coordinates. $lat = isset( $country_info['lat'] ) ? sanitize_text_field( $country_info['lat'] ) : ''; $lon = isset( $country_info['lon'] ) ? sanitize_text_field( $country_info['lon'] ) : ''; $lat = ( isset( $lat ) && strlen( $lat ) !== 0 ) ? 'Lat_ip=' . $lat . '<br>' : ''; $lon = ( isset( $lon ) && strlen( $lon ) !== 0 ) ? 'Lon_ip=' . $lon : ''; $str_info['geo_ip'] = $lat . $lon; return $str_info; } /** * Used to retrieve ip information from the provider Geobytes. * * @param string $user_ip User ip. * @return array. */ function wms7_geobytes( $user_ip ) { WP_Filesystem(); global $wp_filesystem; $_https = filter_input( INPUT_SERVER, 'HTTPS', FILTER_SANITIZE_STRING ); $_server_port = filter_input( INPUT_SERVER, 'SERVER_PORT', FILTER_SANITIZE_STRING ); $str_info = array(); // Receiving data from API JSON - format. $country_info = json_decode( $wp_filesystem->get_contents( 'http://gd.geobytes.com/GetCityDetails?fqcn=' . $user_ip ), true ); // get user country code. $country_code = isset( $country_info['geobytesinternet'] ) ? $country_info['geobytesinternet'] : 'AA'; if ( '' === $country_info['geobytesinternet'] ) { $country_code = 'AA'; } // get user country flag. $path_img = WP_PLUGIN_URL . '/watchman-site7/images/flags/' . $country_code . '.gif'; if ( ( isset( $_https ) && 'on' === strtolower( $_https ) ) || ( isset( $_server_port ) && '443' === $_server_port ) ) { $path_img = str_replace( 'http:', 'https:', $path_img ); } $flag = '<img src=' . $path_img . '>'; // get user country region. $region = isset( $country_info['geobytesregion'] ) ? $country_info['geobytesregion'] : ''; // get user country city. $city = isset( $country_info['geobytescity'] ) ? $country_info['geobytescity'] : ''; // get user country name. $country_name = ( 'AA' !== $country_code ) ? wms7_country_name( $country_code ) : ''; // info. $str_info['country'] = ( '[' . $country_code . '] ' . $flag . '<br>' . 'Country: ' . $country_name . '<br>' . 'Region: ' . $region . '<br>' . 'City: ' . $city ); $provider = 'no data'; $str_info['provider'] = $provider; // coordinates. $lat = isset( $country_info['geobyteslatitude'] ) ? sanitize_text_field( $country_info['geobyteslatitude'] ) : ''; $lon = isset( $country_info['geobyteslongitude'] ) ? sanitize_text_field( $country_info['geobyteslongitude'] ) : ''; $lat = ( isset( $lat ) && strlen( $lat ) !== 0 ) ? 'Lat_ip=' . $lat . '<br>' : ''; $lon = ( isset( $lon ) && strlen( $lon ) !== 0 ) ? 'Lon_ip=' . $lon : ''; $str_info['geo_ip'] = $lat . $lon; return $str_info; } /** * Used to retrieve ip information from the provider IP_info. * * @param string $user_ip User ip. * @return array. */ function wms7_ip_info( $user_ip ) { WP_Filesystem(); global $wp_filesystem; $_https = filter_input( INPUT_SERVER, 'HTTPS', FILTER_SANITIZE_STRING ); $_server_port = filter_input( INPUT_SERVER, 'SERVER_PORT', FILTER_SANITIZE_STRING ); $str_info = array(); // Receiving data from API JSON - format. $country_info = json_decode( $wp_filesystem->get_contents( 'http://ipinfo.io/' . $user_ip . '/json' ) ); // get user country code. $country_code = isset( $country_info->country ) ? $country_info->country : 'AA'; // get user country flag. $path_img = WP_PLUGIN_URL . '/watchman-site7/images/flags/' . $country_code . '.gif'; if ( ( isset( $_https ) && 'on' === strtolower( $_https ) ) || ( isset( $_server_port ) && '443' === $_server_port ) ) { $path_img = str_replace( 'http:', 'https:', $path_img ); } $flag = '<img src=' . $path_img . '>'; // get user country region. $region = isset( $country_info->region ) ? $country_info->region : ''; // get user country city. $city = isset( $country_info->city ) ? $country_info->city : ''; // get user country name. $country_name = wms7_country_name( $country_code ); // info. $str_info['country'] = ( '[' . $country_code . '] ' . $flag . '<br>' . 'Country: ' . $country_name . '<br>' . 'Region: ' . $region . '<br>' . 'City: ' . $city ); $provider = isset( $country_info->org ) ? $country_info->org : 'no data'; $str_info['provider'] = $provider; // coordinates. $loc = isset( $country_info->loc ) ? explode( ',', $country_info->loc ) : array(); $loc[0] = isset( $loc[0] ) ? sanitize_text_field( $loc[0] ) : ''; $loc[1] = isset( $loc[1] ) ? sanitize_text_field( $loc[1] ) : ''; $lat = ( isset( $loc[0] ) && strlen( $loc[0] ) !== 0 ) ? 'Lat_ip=' . $loc[0] . '<br>' : ''; $lon = ( isset( $loc[1] ) && strlen( $loc[1] ) !== 0 ) ? 'Lon_ip=' . $loc[1] : ''; $str_info['geo_ip'] = $lat . $lon; return $str_info; } /** * Used to retrieve ip information from the provider SxGeo. * * @param string $user_ip User ip. * @return array. */ function wms7_sx_geo( $user_ip ) { WP_Filesystem(); global $wp_filesystem; $_https = filter_input( INPUT_SERVER, 'HTTPS', FILTER_SANITIZE_STRING ); $_server_port = filter_input( INPUT_SERVER, 'SERVER_PORT', FILTER_SANITIZE_STRING ); $str_info = array(); // Receiving data from API JSON - format. $geo_api_request = 'http://api.sypexgeo.net/json/' . $user_ip; $geo_info_json = $wp_filesystem->get_contents( $geo_api_request ); // Receive associative array with result of request to API. $country_info = json_decode( $geo_info_json, true ); // get user country code. $country_code = isset( $country_info['country']['iso'] ) ? $country_info['country']['iso'] : 'AA'; // get user country name. $country_name = wms7_country_name( $country_code ); // get user country region. $region = isset( $country_info['region']['name_en'] ) ? $country_info['region']['name_en'] : ''; // get user country city. $city = isset( $country_info['city']['name_en'] ) ? $country_info['city']['name_en'] : ''; // get user country flag. $path_img = WP_PLUGIN_URL . '/watchman-site7/images/flags/' . $country_code . '.gif'; if ( ( isset( $_https ) && 'on' === strtolower( $_https ) ) || ( isset( $_server_port ) && '443' === $_server_port ) ) { $path_img = str_replace( 'http:', 'https:', $path_img ); } $flag = '<img src=' . $path_img . '>'; // info. $str_info['country'] = ( '[' . $country_code . '] ' . $flag . '<br>' . 'Country: ' . $country_name . '<br>' . 'Region: ' . $region . '<br>' . 'City: ' . $city ); $provider = 'no data'; $str_info['provider'] = $provider; // coordinates. $lat = isset( $country_info['city']['lat'] ) ? sanitize_text_field( $country_info['city']['lat'] ) : ''; $lon = isset( $country_info['city']['lon'] ) ? sanitize_text_field( $country_info['city']['lon'] ) : ''; $lat = ( isset( $lat ) && strlen( $lat ) !== 0 ) ? 'Lat_ip=' . $lat . '<br>' : ''; $lon = ( isset( $lon ) && strlen( $lon ) !== 0 ) ? 'Lon_ip=' . $lon : ''; $str_info['geo_ip'] = $lat . $lon; return $str_info; } /** * Used to retrieve information of country of visitor. * * @param string $country_code Country code. * @return array. */ function wms7_country_name( $country_code ) { global $wpdb; if ( 'AA' === $country_code ) { return; } $cache_key = 'country_code_' . $country_code; $results = wp_cache_get( $cache_key ); if ( ! $results ) { $results = $wpdb->get_var( $wpdb->prepare( " SELECT `name` FROM {$wpdb->prefix}watchman_site_countries WHERE `code` = %s ", $country_code ) );// db call ok; cache ok. wp_cache_set( $cache_key, $results ); } return $results; }
🙂 p.s.: Замечено, что даже эта четверка лидеров – Who-is providers, в зависимости от региона посетителя – дает немного различную информацию. Поэтому, определяйте сами, кого выбрать в качестве источника информации об IP посетителя. В плагине WatchMan-Site7 используются все 4 провайдера. И в зависимости от ситуации можно выбирать оперативно любого из 4.