Advertisement
tolikpunkoff

user_ip_and_geoposition

Mar 27th, 2016
596
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.08 KB | None | 0 0
  1. <?php
  2. //Переделано из примера [8^12] v 0.7 Добавлено оформление
  3. //Область заголовков
  4. header('Content-type: text/html; charset=utf8');
  5. //Область подключения внешних скриптов
  6. include("SxGeo.php"); // Подключаем SxGeo.php класс
  7. // --------- Область глобальных переменных ---------
  8.  
  9. // Создаем объект
  10. // Первый параметр - имя файла с базой (используется оригинальная бинарная база SxGeo.dat)
  11. // Второй параметр - режим работы:
  12. //     SXGEO_FILE   (работа с файлом базы, режим по умолчанию);
  13. //     SXGEO_BATCH (пакетная обработка, увеличивает скорость при обработке множества IP за раз)
  14. //     SXGEO_MEMORY (кэширование БД в памяти, еще увеличивает скорость пакетной обработки, но требует больше памяти)
  15. $SxGeo = new SxGeo('SxGeoCity.dat');
  16. //$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); // Самый производительный режим, если нужно обработать много IP за раз
  17.  
  18. //регулярное выражение для IP
  19. $ip_pattern="#(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#";
  20.  
  21. // --------- Конец области глобальных переменных ---------
  22.  
  23. // --------- Область функций ---------
  24.  
  25. function isip($ip_str) //соответствие данных формату IP
  26. {  
  27.     global $ip_pattern;
  28.     $ret=FALSE;
  29.     if (preg_match($ip_pattern,$ip_str))
  30.     {
  31.         $ret=TRUE;
  32.     }
  33.     return $ret;
  34. }
  35.  
  36. function chkdiapip ($user_ip, $ip_from, $ip_to) //попадает ли ip в нужный диапазон
  37. {
  38.     return ( ip2long($user_ip)>=ip2long($ip_from) && ip2long($user_ip)<=ip2long($ip_to) );
  39. }
  40.  
  41. function get_spec_diap ($user_ip) //определение, попал ли IP в специальный диапазон
  42. {
  43.     $ret=1;
  44.     //Частные IP
  45.     if (chkdiapip ($user_ip,'10.0.0.0','10.255.255.255'))
  46.     {
  47.         $ret="Частная подсеть 10.0.0.0/8";
  48.         return $ret;
  49.     }
  50.     if (chkdiapip ($user_ip,'172.16.0.0','172.31.255.255'))
  51.     {
  52.         $ret="Частная подсеть 172.16.0.0/12";
  53.         return $ret;
  54.     }
  55.     if (chkdiapip ($user_ip,'192.168.0.0','192.168.255.255'))
  56.     {
  57.         $ret="Частная подсеть 192.168.0.0/16";
  58.         return $ret;
  59.     }
  60.     //Wrong IP
  61.     if (chkdiapip ($user_ip,'0.0.0.0','0.255.255.255'))
  62.     {
  63.         $ret="Бракованый IP" ;
  64.         return $ret;
  65.     }
  66.     //IP  LOOPBACK
  67.     if (chkdiapip ($user_ip,'127.0.0.0','127.255.255.255'))
  68.     {
  69.         $ret="Loopback (петлевой интерфейс)";
  70.         return $ret;
  71.     }
  72.  
  73.     return $ret;
  74. }
  75.  
  76. function get_all_info_ip() //получаем информацию о всех IP, из всех переменных HTTP_* сервера
  77. {  
  78.     global $ip_pattern;
  79.     $ret="";
  80.     foreach ($_SERVER as $k => $v)
  81.     {
  82.         //если нашли в поле HTTP_* (HTTP_VIA, HTTP_X_FORWARDED_FOR и т.д.)
  83.         //что-то похожее на IP
  84.         if ((substr($k,0,5)=="HTTP_") AND (preg_match($ip_pattern,$v)))
  85.         {
  86.             preg_match_all($ip_pattern,$v,$matches); //вытаскиваем из строки все совпадения с шаблоном IP         
  87.             foreach ($matches as $tmp) //preg_match_all выдает многомерный массив
  88.             {
  89.                 foreach($tmp as $ip) //вытаскиваем каждый отдельный IP
  90.                 {
  91.                     $ret.=get_info_ip($k,$ip)."\n"; //получаем информацию для каждого IP
  92.                 }                              
  93.             }
  94.         }      
  95.     }
  96.     return $ret;
  97. }
  98.  
  99. function get_info_ip($field, $ip)
  100. {  
  101.     global $SxGeo;
  102.     $retv=""; //возвращаемое значение
  103.        
  104.     // проверка на соответствие формату
  105.     if (!isip($ip))
  106.     {
  107.         //не IP - записали в поле MESSAGE сообщение об ошибке и прекратили работу
  108.         $retv="<tr><td>0.0.0.0</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>"
  109.         ."-</td><td>".$field."</td><td>"."<font color='red'>Не IP</font>"."</td></tr>";
  110.         return $retv;  
  111.     }
  112.  
  113.     //проверяем, не попал ли IP в особый диапазон
  114.     $check_diap = get_spec_diap($ip);
  115.     if ($check_diap!=1)
  116.     {
  117.         $retv="<tr><td>".$ip."</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>"
  118.         ."-</td><td>".$field."</td><td>"."<font color='yellow'>".$check_diap."</font>"."</td></tr>";
  119.         return $retv;
  120.     }
  121.  
  122.     $add_info = $SxGeo->getCityFull($ip); // Вся информация о городе
  123.     $main_info = $SxGeo->get($ip);         // Краткая информация о городе или код страны (если используется база SxGeo Country)
  124.  
  125.     //"FIELD|IP|MESSAGE|ISO_CODE|COUNTRY_NAME|CTNR_LAT|CTNR_LON|REGION_ISO|REGION_NAME|CITY_NAME|CTY_LAT|CTY_LON|\n";
  126.     $retv="<tr><td>".$ip."</td><td>".$main_info['country']['iso']."</td><td>".$add_info['country']['name_en']."</td><td>".
  127.         $add_info['country']['lat']."</td><td>".$add_info['country']['lon']."</td><td>".
  128.         $add_info['region']['iso']."</td><td>".$add_info['region']['name_en']."</td><td>".
  129.         $main_info['city']['name_en']."</td><td>".$main_info['city']['lat']."</td><td>".$main_info['city']['lon'].'</td><td>'
  130.         .$field."</td><td>"."<font color='lime'>OK</font>"."</td></tr>";
  131.  
  132.     return $retv;
  133. }
  134. function print_top() //печатает заголовок и верх страницы
  135. {
  136.     echo "<html>";
  137.     echo "<head>";
  138.     echo "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>";
  139.     echo "<style type='text/css'>
  140.             TABLE {
  141.             width: 300px; /* Ширина таблицы */
  142.             border-collapse: collapse; /* Убираем двойные линии между ячейками */
  143.             }
  144.             TD, TH {
  145.             padding: 3px; /* Поля вокруг содержимого таблицы */
  146.             border: 1px solid gold; /* Параметры рамки */
  147.             font: 12pt/10pt monospace;
  148.             }
  149.             #footer {
  150.             position: fixed; /* Фиксированное положение */
  151.             left: 0; bottom: 0; /* Левый нижний угол */
  152.             padding: 10px; /* Поля вокруг текста */
  153.             width: 100%; /* Ширина слоя */
  154.             }
  155.             </style>";
  156.     echo "<title>IP-адрес и географическое положение</title>";
  157.     echo "</head>";
  158.     echo "<body bgcolor='black' text='silver'>";
  159.     echo "<center><h2>IP-адрес пользователя</h2></center>"."\n";
  160.     echo "<table align='center'>";
  161.     echo "<tr><td colspan='12'><center><b>Основная информация</b></center></td></tr>"."\n";
  162.     echo "<tr><th>IP-адрес</th><th>Код страны (ISO)</th><th>Страна</th><th>Широта</th><th>Долгота</th>
  163.           <th>Регион (ISO)</th><th>Регион</th>
  164.           <th>Город</th><th>Широта</th><th>Долгота</th>
  165.           <th>Источник</th><th>Статус</th></tr>";
  166. }
  167. function print_bottom() //печатает низ страницы
  168. {
  169.     echo "</table>";
  170.     echo "</body>";
  171.     echo "</html>";
  172.     echo "<div id='footer'>";
  173.     echo "* Не анонимные прокси могут передавать ваш IP в дополнительных полях HTTP<br> \n";
  174.     echo "(L) 8^12";
  175.     echo "</div>";
  176. }
  177. // ---------Конец области функций ---------
  178.  
  179. $ip="";
  180. print_top(); //печатаем верх страницы
  181.  
  182. //проверка наличия переменной с введенным вручную IP
  183. if (isset($_GET['ip']))
  184.   {
  185.     $ip=$_GET['ip'];
  186.     echo get_info_ip("Вручную",$ip)."\n";
  187.     print_bottom();
  188.     die();
  189.   }
  190.  
  191. $ip = $_SERVER['REMOTE_ADDR'];
  192. echo get_info_ip("REMOTE_ADDR",$ip)."\n";
  193. echo "<tr><td colspan='12'><center><b>Дополнительная информация (по данным заголовков HTTP)*</b></center></td></tr>"."\n";
  194. $ip=get_all_info_ip();
  195. echo $ip;
  196.  
  197. print_bottom();
  198. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement