Автоопределение региона, города

InstantCMS 2.X

Автоопределение региона, города

#31 13 октября 2019 в 12:57
Плюсану. Тоже думаю как реализовать автоопределение города и контента. Мысль такая, при добавлении контента берется айпишник автора и добавляется к контенту. При выводе контента пользователю, сравнивается геолокация по айпишнику и контент по локации выводиться вначале, потом идет по дате добавления. Кнопка в наборах к примеру Все новости выводит только по дате добавления, то есть без учета геолокации.
#32 14 октября 2019 в 09:33
Доброе время суток. Подойдет ли такой код для определения Региона, Города ipgeobase.ru ?
1
  1. /* Пример работы
  2.  * [!ipgeobase? &info=`city`!]
  3.  * Возможные параметры для info: inetnum, country, city, region, district, lat, lng
  4.  *
  5.  *[!if? &is=`[!ipgeobase!]:=:Москва` &then=`@TPL:имя_чанка`!]
  6.  */
  7.  
  8. $info = isset($info) ? $info : 'city';
  9.  
  10. //проверяем есть ли куки
  11. if(empty($_COOKIE['city']) || $_COOKIE['city']=="undefined") {
  12.  
  13. //получаем ip пользователя
  14. $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  15. $ip = explode(", ", $ip);
  16. $ip = isset($ip[1]) ? $ip[1] : $ip[0];
  17.  
  18. //запрашиваем информацию с сервера
  19. $url = "http://ipgeobase.ru:7020/geo?ip=".$ip;
  20. $xmlstr = file_get_contents($url);
  21. $xml = new SimpleXMLElement($xmlstr);
  22.  
  23. //сохраняем все данные в куки
  24. $geo['inetnum'] = (string)$xml->ip[0]->inetnum;
  25. $geo['country'] = (string)$xml->ip[0]->country;
  26. $geo['city'] = (string)$xml->ip[0]->city;
  27. $geo['region'] = (string)$xml->ip[0]->region;
  28. $geo['district'] = (string)$xml->ip[0]->district;
  29. $geo['lat'] = (string)$xml->ip[0]->lat;
  30. $geo['lng'] = (string)$xml->ip[0]->lng;
  31.  
  32. setcookie('inetnum',$geo['inetnum'],time()+36000000);
  33. setcookie('country',$geo['country'],time()+36000000);
  34. setcookie('city',$geo['city'],time()+36000000);
  35. setcookie('region',$geo['region'],time()+36000000);
  36. setcookie('district',$geo['district'],time()+36000000);
  37. setcookie('lat',$geo['lat'],time()+36000000);
  38. setcookie('lng',$geo['lng'],time()+36000000);
  39.  
  40. } else {
  41.  
  42. $geo['inetnum'] = $_COOKIE['inetnum'];
  43. $geo['country'] = $_COOKIE['country'];
  44. $geo['city'] = $_COOKIE['city'];
  45. $geo['region'] = $_COOKIE['region'];
  46. $geo['district'] = $_COOKIE['district'];
  47. $geo['lat'] = $_COOKIE['lat'];
  48. $geo['lng'] = $_COOKIE['lng'];
  49.  
  50. }
  51. return $geo[$info];
  52.  
Скрипт срабатывет 1 раз и далее уже берет значение из куков, это в разы уменьшает нагрузку.
2
  1. <?php
  2.  
  3. /**
  4.  * Возвращает информация об IP адресе
  5.  */
  6. function get_ip_info($ip)
  7. {
  8. $postData = "
  9. <ipquery>
  10. <fields>
  11. <all/>
  12. </fields>
  13. <ip-list>
  14. <ip>$ip</ip>
  15. </ip-list>
  16. </ipquery>
  17. ";
  18.  
  19. $curl = curl_init();
  20.  
  21. curl_setopt($curl, CURLOPT_URL, 'http://194.85.91.253:8090/geo/geo.html');
  22. curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
  23. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  24.  
  25. $responseXml = curl_exec($curl);
  26. curl_close($curl);
  27.  
  28. if (substr($responseXml, 0, 5) == '<?xml')
  29. {
  30. $ipinfo = new SimpleXMLElement($responseXml);
  31. return $ipinfo->ip;
  32. }
  33.  
  34. return false;
  35. }
  36.  
  37. // пример использования
  38. $ipinfo = get_ip_info($_SERVER['REMOTE_ADDR']);
  39. echo $ipinfo->city; // город
  40. echo $ipinfo->region; // регион
  41. echo $ipinfo->district; // федеральный округ РФ
  42.  
  43. ?>
/system/controllers/geo/iplookups/ipgeobase.php
  1. <?php
  2. class icmsIpgeobase {
  3.  
  4. public static $title = 'ipgeobase.ru';
  5.  
  6. public static function detect ($ip) {
  7.  
  8. $xml = file_get_contents_from_url('http://ipgeobase.ru:7020/geo?ip='.$ip);
  9. if(!$xml){ return false; }
  10.  
  11. $out = simplexml_load_string($xml);
  12. if(!$out){ return false; }
  13.  
  14. $data = array();
  15.  
  16. if($out && is_object($out) && !empty($out->ip[0])){
  17. foreach ($out->ip[0] as $key=>$value) {
  18. $data[$key] = (string)$value;
  19. }
  20. }
  21.  
  22. return $data;
  23.  
  24. }
  25.  
  26. }
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.