Как в PHP узнать IP пользователя и определить его страну?

Как в PHP узнать IP пользователя и определить его страну?
Содержание:
  1. Как в PHP получить IP адрес посетителя сайта
  2. Определение страны по ip с помощью Sypex Geo
  3. Определение города по ip с помощью Sypex Geo
  4. Определение страны и города по ip через сервис через сервис ipstack
  5. Как в PHP получить IP адрес сервера
  6. Пример реализации определения локации в CMS MODX
  7. Комментарии

В этой статье рассмотрим, как в PHP можно узнать IP клиента и сервера, а также разберём как зная IP клиента определить его страну и город.

Как в PHP получить IP адрес посетителя сайта

Получить IP адрес клиента в PHP можно через суперглобальный массив $_SERVER. В этом массиве IP адрес посетителя доступен через ключ REMOTE_ADDR.

// сохраним в переменную ip значение IP адреса клиента
$ip = $_SERVER['REMOTE_ADDR'];

Но, если клиент использует прокси-сервер, то значение $_SERVER['REMOTE_ADDR'] будет содержать IP последнего прокси-сервера, через который клиент попал на сайт.

В этом случае, чтобы узнать IP посетителя можно попробовать использовать $_SERVER['HTTP_CLIENT_IP'] и $_SERVER['HTTP_X_FORWARDED_FOR']. HTTP_CLIENT_IP и HTTP_X_FORWARDED_FOR – это заголовки, содержащие IP адрес пользователя. Данные заголовки устанавливает прокси-сервер. Обычно прокси-сервер устанавливает один из них. Данным в этих заголовках можно доверять, только если прокси-сервер надёжный. В противном случае, им доверять не стоит, т.к. их можно очень просто подделать. В этом случае лучше просто использовать $_SERVER['REMOTE_ADDR'] или сохранять в базу как $_SERVER['REMOTE_ADDR'], так и заголовок, устанавливаемый прокси-сервером.

function getIp() {
  $keys = [
    'HTTP_CLIENT_IP',
    'HTTP_X_FORWARDED_FOR',
    'REMOTE_ADDR'
  ];
  foreach ($keys as $key) {
    if (!empty($_SERVER[$key])) {
      $ip = trim(end(explode(',', $_SERVER[$key])));
      if (filter_var($ip, FILTER_VALIDATE_IP)) {
        return $ip;
      }
    }
  }
}

$ip = getIp();
// выведем IP клиента на экран
echo 'ip = ' . $ip;

Определение страны по ip с помощью Sypex Geo

Основные шаги по созданию php скрипта, с помощью которого можно будет определять страну по ip:

1. Скачаем Sypex Geo для PHP и базу данных стран. Sypex Geo распространяется по лицензии BSD, т.е. является абсолютно бесплатным.

2. Распакуем архивы и загрузим на сервер файлы «SxGeo.php» и «SxGeo.dat». В качестве примера, создадим на сервере папку SxGeo и загрузим эти файлы в неё.

3. Создадим свой скрипт, например, «get_country_code.php».

4. Вставим в этот файл следующий код:

<?php

// получим ip клиента
$ip = $_SERVER['REMOTE_ADDR'];
// подключим файл SxGeo.php
require_once 'SxGeo.php';
// создадим объект SxGeo (1 аргумент – имя файла базы данных, 2 аргумент – режим работы: SXGEO_FILE (по умолчанию), SXGEO_BATCH  (пакетная обработка, увеличивает скорость при обработке множества IP за раз), SXGEO_MEMORY (кэширование БД в памяти, еще увеличивает скорость пакетной обработки, но требует больше памяти, для загрузки всей базы в память).
$SxGeo = new SxGeo('SxGeo.dat', SXGEO_BATCH | SXGEO_MEMORY);
// получаем двухзначный ISO-код страны (RU, UA и др.)
$country_code = $SxGeo->getCountry($ip);

5. Включим файл «get_country_code.php» в другие скрипты, в которых нужно реализовать выполнение кода в зависимости от принадлежности ip посетителя к той или иной стране.

require_once 'SxGeo/get_country_code.php';
if ($country_сode === 'RU') {
// код для посетителей из России...
} else {
// код для посетителей из других стран...
}

Определение города по ip с помощью Sypex Geo

Для определения города, потребуется загрузить архив с базой данных городов для Sypex Geo, распаковать его и загрузить на сервер.

Скрипт в этом случае будет следующий:

<?php

// узнаем ip посетителя
$ip = $_SERVER['REMOTE_ADDR'];
require_once 'SxGeo.php';
// подключаем файл с базой данных городов
$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY);
$city = $SxGeo->get($ip);
// также можно использовать следующий код
// $SxGeo->getCity($ip);

// широта
$lat = $city['city']['lat'];
// долгота
$lon = $city['city']['lon'];
// название города на русском языке
$city_name_ru = $city['city']['name_ru'];
// название города на английском языке
$city_name_en = $city['city']['name_en'];
// ISO-код страны
$country_code = $city['country']['iso'];

// для получения информации более полной информации (включая регион) можно осуществить через метод getCityFull
$city = $SxGeo->getCityFull($ip);
// название региона на русском языке
$region_name_ru = $city['region']['name_ru'];
// название региона на английском языке
$region_name_en = $city['city']['name_en'];
// ISO-код региона
$region_name_iso = $city['city']['iso'];

Для автоматического обновления баз можно воспользоваться этим архивом. В этом архиве находится php скрипт. Этот скрипт необходимо настроить, т.е. указать в нём URL для скачивания базы и пути к файлам на сервере. После этого загрузить его на сервер и настроить его запуск по расписанию с помощью cron.

Определение страны и города по ip через сервис через сервис ipstack

Рассмотрим ещё один вариант определения в php местоположения по ip посетителя, но уже не через Sypex Geo, а с помощью сервиса ipstack.

Сервис ipstack имеет бесплатный план, который позволяет обрабатывать до 10000 запросов в месяц.

Планы сервиса ipstack для определения страны и города посетителя по его ip

Для получения бесплатного плана нажимаем на кнопку «GET FREE API KEY» и переходим на страницу, на которой нужно заполнить регистрационную карточку.

После регистрации, на личной странице ipstack вам будет назначен «API Access Key», который нужно скопировать. Он нам потребуется при создании php скрипта.

<?php
// получим ip адрес клиента
$ip = $_SERVER['REMOTE_ADDR'];
// переменная $access_key должна содержать ваш API Access Key
$access_key = '...';
// инициализируем новый сеанс cURL
$ch = curl_init('http://api.ipstack.com/'.$ip.'?access_key='.$access_key.'');
// если нужно выбрать только страну, то можно так
//$ch = curl_init('http://api.ipstack.com/'.$ip.'?access_key='.$access_key.'&fields=country_code');
// устанавливаем параметр для указанного сеанса cURL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// выполняем запрос cURL и сохраняем данные в $json
$json = curl_exec($ch);
// завершаем сеанс cURL
curl_close($ch);
// декодируем JSON ответ
$api_result = json_decode($json, true);

// получаем ISO-код страны
$county_code = $api_result['country_code'];
// получаем название региона
$region_name = $api_result['region_name'];
// получаем название города
$city = $api_result['city'];

Как в PHP получить IP адрес сервера

Узнать IP адрес сервера в PHP можно с помощью следующей инструкции:

// сохраним IP адрес сервера в переменную $ip_server
$ip_server = $_SERVER['SERVER_ADDR'];
// выведем IP адрес сервера на экран
$echo $ip_server;

Пример реализации определения локации в CMS MODX

В качестве примере рассмотрим, как в CMS MODX Revolution можно очень просто без сторонних сервисов осуществить определение страны посетителя. Разработаем решение на базе Sypex Geo.

1. Для этого сначала нужно загрузить Sypex Geo в проект:

Загрузка библиотеки Sypex Geo в проект на CMS MODX Revolution с помощью которой организуем определение страны посетителя по его ip

Файл «SxGeo.php» – это основной скрипт, а «SxGeo.dat» – это база стран. Этих двух файлов достаточно для определения страны пользователя по его ip. Дополнительно в каталоге SxGeo ещё расположен файл «SxGeoCity.dat», данный файл в текущей реализации не нужен, он может потребовать, если в проекте потребуется определять не только страну пользователя, а ещё его регион и город.

2. Создадим сниппет, например «get_location.php». В качестве примера организуем это с помощью файлов. Для этого нужно чтобы был установлен pdoTools и в настройках включена опция «Использовать Fenom на страницах».

Код сниппета «get_location.php»:

<?php
$country = '';
$ip = $_SERVER['REMOTE_ADDR'];
include MODX_CORE_PATH.'/elements/SxGeo/SxGeo.php';
$SxGeo = new SxGeo(MODX_CORE_PATH.'/elements/SxGeo/SxGeo.dat', SXGEO_MEMORY);
$country = $SxGeo->getCountry($ip);
unset($SxGeo);
$modx->setPlaceholder('countrycode', $country);
return;

Поместим файл «get_location.php» в каталог /core/elements/snippets/.

Данный сниппет будет определять страну и помещать его код в плейсхолдер countrycode.

3. После этого в нужных шаблонах поместим код вызова сниппета и сохранение значение плейсхолдера countrycode в переменную $country_code.

{$_modx->runSnippet('@FILE snippets/get_location.php')}
{set $country_code = $_modx->getPlaceholder('countrycode')}

Всё теперь чтобы написать логику достаточно использовать эту переменную.

Например:

{if $country_code === 'UA'}
Код для Украины
{else}
Код для других стран
{/if}

Комментарии: 37

AlexBLR
AlexBLR

Приветствую, Александр! Дорабатывал свой скрипт сниффера на php, гуглил инфу и попал на ваш сайт. Много полезного для себя нашёл, даже успел уже на свой сайт запилить вашего чатбота для теста. Раньше про ваш сайт не знал. Не планируете ли установить себе на сайт форум для удобного общения с пользователями? Может он есть и я его пропустил? Кстати, если можно тут оставлять ссылки, то я могу поделиться своим сниффером (работает на файлах, определяет IP и другие данные посетителей). Думаю скрипт будет полезен нуждающимся. Сам я не программер, так сказать, интересующийся скриптами, предпочитаю скрипты на файлах.

Александр Мальцев
Александр Мальцев

Привет! Спасибо за отзыв. Устанавливать форум для общения на сайте не планирую. Возможно доработаю раздел «Q&A (Вопросы и ответы)». Просто пока не знаю, насколько он нужен здесь.

Да, можете поделиться файлами или ссылкой на GitHub, если только это не нарушает чьи-то авторских прав.
AlexBLR
AlexBLR

На форуме своего сайта http://vox.dx.am/forum/index.php?fid=6&id=066534 выложил для скачивания Сниффер (написан на php, работает на файлах). Заходите в гости, как говорится, от нашего стола к вашему :)

Борис Широков
Борис Широков

Здравствуйте, Александр.

Прекрасный код и подробная информация в статье, благодаря ей и вашему коду смог разобраться.

Также я заметил, что код выводит ipv6, если он есть у пользователя.

Если же пользователь отключил этот протокол, то выводит приятный глазу ipv4.

Александр, у меня вопрос, как возможно настроить, так сказать заглянуть в этот черный ящик, функцию, чтобы она выводила ipv4 и ipv6?

Спасибо за ваш труд!
Александр Мальцев
Александр Мальцев

Привет! Спасибо за отзыв! Когда клиент отправляет запрос, то для этого используется один протокол. Он не отправляет запрос, используя одновременно IPv4 и IPv6.

То есть, если клиент отправил запрос с использованием IPv4, то получите IPv4-адрес. Если он отправил запрос с использованием IPv6, то получите адрес IPv6.
David
David

Добрый день. Почему ip адрес посетителей моего сайта может отображаться как 0.0.0.0?

Не у всех посетителей, только у некоторых. Примерно у 5% пользователей.
Александр Мальцев
Александр Мальцев

Привет! Не всегда IP-адрес можно получить с помощью $_SERVER['SERVER_ADDR'].

Попробуйте для этого использовать следующую функцию:
<?php

function getClientIp() {
  $ip = '';
  $ipAll = []; // networks IP
  $ipSus = []; // suspected IP
  $serverVariables = [
      'HTTP_X_FORWARDED_FOR',
      'HTTP_X_FORWARDED',
      'HTTP_X_CLUSTER_CLIENT_IP',
      'HTTP_X_COMING_FROM',
      'HTTP_FORWARDED_FOR',
      'HTTP_FORWARDED',
      'HTTP_COMING_FROM',
      'HTTP_CLIENT_IP',
      'HTTP_FROM',
      'HTTP_VIA',
      'REMOTE_ADDR',
  ];
  foreach ($serverVariables as $serverVariable) {
    $value = '';
    if (isset($_SERVER[$serverVariable])) {
      $value = $_SERVER[$serverVariable];
    } elseif (getenv($serverVariable)) {
      $value = getenv($serverVariable);
    }
    if (!empty($value)) {
      $tmp = explode(',', $value);
      $ipSus[] = $tmp[0];
      $ipAll = array_merge($ipAll, $tmp);
    }
  }
  $ipSus = array_unique($ipSus);
  $ipAll = array_unique($ipAll);
  $ip = (sizeof($ipSus) > 0) ? $ipSus[0] : $ip;
  return [
    'ip' => $ip,
    'suspected' => $ipSus,
    'network' => $ipAll,
  ];
}

// выведем IP-адрес клиента
echo getClientIp()['ip'];
David
David

Спасибо за ответ!

Один раз IP определился вот так: 2a01:4450:c100:b192:f195:566:e7b3

Это тоже может быть с этим связано?

Артемий
Артемий
Спасибо за статью, помогла.

p/s: в самом конце статьи, Пример реализации определения локации в CMS MODX, потерялся оператор сравнения:
{if $country_code = 'UA'}
Александр Мальцев
Александр Мальцев
Пожалуйста! За найденный отпечаток спасибо.
Danil
Danil
Александр, здравствуйте!
Помогите пожалуйста поправить данный код, чтобы при подтверждении страны RU, открывалась страница site/ru/, при условии, что она уже не открыта.
<?php
require_once ('core/elements/SxGeo/snippets/get_location.php');
$a = [[++site_url]];
$country = $SxGeo->getCountry($ip);
if($country === 'RU' && $a !== 'http://site/ru/') {

}
elseif($country === 'UA' && $a !== 'http://site/ua/') {

}
else($country === 'EN' && $a !== 'http://site/en/') {

}
?>
Если вам не сложно. Буду очень вам благодарен!
Lisa
Lisa
Здравствуйте, вы не могли бы мне помочь? Как записать количество вхождений на сайт с IP адреса? То есть у меня есть сайт и мне нужно записать количество входов через каждый час в таблице недели. А в месячной таблице сколько с одного и того же IP заходили на мой сайт.
Artem
Artem
Столкнулся с такой проблемой. Когда я на странице использую код 1 раз, то все работает, но если мне надо сделать в двух местах проверку, то из-за второго раза выбивает критическую ошибку. Например, в wordpress вставляю код в файл «single.php»:
<?php require_once ('sxgeo/get_country_code.php');
  $country = $SxGeo->getCountry($ip);
  if ($country === 'RU' || $country === 'BY') {
    echo do_shortcode( '[sc name="reklama-yandex"]' );
  } else {
    echo do_shortcode( '[sc name="reklama-google"]' );
  } 
?>
А потом в «footer.php»:
<?php require_once ('sxgeo/get_country_code.php');
  $country = $SxGeo->getCountry($ip);
  if ($country != 'UA') {
    echo do_shortcode( '[sc name="yandex-metrika"]' );
  }
?>
Так вот второй раз выдает ошибку.
Александр Мальцев
Александр Мальцев
Зачем несколько раз получать одно и тоже. Получите один раз, сохраните значение, например в сессионную переменную и используйте. Можно также в сессионную переменную и IP адрес пользователя сохранить. А затем проверять соответствует ли текущий IP адрес пользователя тому, что находится в сессионной переменной и если да, то просто брать сразу страну из сессии. Так производительность вашего сайта возрастёт, т.к. не будет ненужного выполнения кода.
Artem
Artem
Спасибо, ну вы же понимаете, что для многих, кто читает вашу статью для них такие слова как сессионная переменная это дремучий лес :)
Khisrav Khudoyorov
Khisrav Khudoyorov
А как узнать телефонный код страны?
Igor
Igor
Здравствуйте, Александр!
У Вас интересные статьи.
Просмотрев эту, возникла идея сделать модуль, выводящий онлайн статистику просмотров.
Сколько посетителей «прямо сейчас» смотрят страницу. Не сайт вообще, а конкретную страницу.
Н.р. эту статью. И выводить виджет с общим кол-вом смотрящих под заголовком или сбоку, а при клике на «глаз» выводить попап с подробным списком, сколько людей и откуда смотрят.

Звучит сложновато )))
На чистом PHP я ещё представляю как сделать, но API Modx вообще не знаю.

Как думаете, насколько «геморная» задача?

Видел подобные виджеты на Букинге и ещё на каком-то сайте бронирования.
Выглядит интересно.
Александр Мальцев
Александр Мальцев
Здравствуйте, спасибо. Решения такой задачи у меня нет. Вам тут нужно будет создавать дополнительную таблицу в базе данных для сохранения этой информации. Одним PHP тут навряд ли получится обойтись, вам же нужно будет знать находится ли ещё пользователь на какой-то странице или нет. Для этого вам нужно будет ещё написать JavaScript код, с помощью которого вы будете отправлять данные через определённые промежутки времени на сервер, на основании которых вы и будете строить эту статистику.

Если посещаемость ресурса высокая, то это может всё привести к значительному увеличению нагрузки на сервер. Поэтому эту задачу стоит внедрять на ресурс только в том случае, если эта статистика действительно нужна пользователям.
Валера Рыбаков
Валера Рыбаков
Здравствуйте у вас харошие стотьи
Stanislav
Stanislav
Доброго времени суток, подскажите пожалуйста, можно ли вывести полученные данные SxGeo о стране на экран в формате JSON, данные нужны для плагина который считывает их в данном формате?
Александр Мальцев
Александр Мальцев
Привет!
Тут вроде бы всё просто. Устанавливаете Content-Type для JSON и выводите данные.
Для страны:
<?php
header('Content-Type: application/json; charset=utf8');
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeo.dat');
$ip = $_SERVER['REMOTE_ADDR'];
echo json_encode($SxGeo->get($ip));
exit();
Полная информация:
<?php
header('Content-Type: application/json; charset=utf8');
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$ip = $_SERVER['REMOTE_ADDR'];
echo json_encode($SxGeo->getCityFull($ip));
exit();
inferno
inferno
Александр, добрый день!

Могли бы вы чуть подробней объяснить про то, как выводить разный рекламный баннер в зависимости от страны с которой зашел пользователь на сайт, используя IP адрес через суперглобальный массив $_SERVER.

Например для Беларуси и России мне нужно чтобы выводились два абсолютно разных блока. Какой PHP-скрипт должен быть в шапке, и какой скрипт с теле самой статьи?

Буду признателен Вам за любую помощь
Александр Мальцев
Александр Мальцев
Привет! В статье этот момент подробно описан.
Условия для вывода одного или другого блока будет таким:
if ($country_сode === 'RU') {
  // Россия ...
} elseif ($country_сode === 'BY') {
  // Беларусь...
}
Дмитрий
Дмитрий
Александр, здравствуйте!
Помогите пожалуйста привязать данный код к проверке по IP адресу. Чтобы один и тот же IP не смог накрутить количество нажатий на одну и ту же ссылку.
<?php
//
if ($_GET['img'] == 1) {
  header("location: http://website.ru");
  $file = fopen("file.txt","a+");
  flock($file,LOCK_EX); 
  $count = fread($file,100);
  $count++; 
  ftruncate($file,0); 
  fwrite($file,$count); 
  flock($file,LOCK_UN); 
  fclose($file); 
}
?>
Если вас не затруднит. Буду очень вам благодарен!
Александр Мальцев
Александр Мальцев
Здравствуйте!
Это можно выполнить без использования базы данных следующим образом:
<?php

  $path = $_SERVER['DOCUMENT_ROOT'].'clicks.txt';
  $data = array();
  if (isset($_GET['id'])) {
    if (file_exists($path)) {
      $data = json_decode(file_get_contents($path), true);
      if (count($data['id-'.$_GET['id']]) > 0) {
        if (!in_array($_SERVER['REMOTE_ADDR'], $data['id-'.$_GET['id']])) {
          $data['id-'.$_GET['id']][] = $_SERVER['REMOTE_ADDR'];
        }
      } else {
        $data['id-'.$_GET['id']][] = $_SERVER['REMOTE_ADDR'];
      }
      file_put_contents($path, json_encode($data), LOCK_EX);
    } else {
      $data['id-'.$_GET['id']][] = $_SERVER['REMOTE_ADDR'];
      file_put_contents($path, json_encode($data), LOCK_EX);
    }
  } else {
    if (file_exists($path)) {
      $data = json_decode(file_get_contents($path), true);
    }
  }

  function getCountById($id) {
    global $data;
    return count($data['id-'.$id]);
  }

?>
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Clicks</title>
  </head>
  <body>

    <a href="/1.php?id=0">Ссылка 1 (<?php echo getCountById(0); ?>)</a>
    <a href="/1.php?id=1">Ссылка 2 (<?php echo getCountById(1); ?>)</a>    

  </body>
</html>
Это пример. Его конечно желательно доработать под ваш конкретный сценарий. Для теста необходимо в корне сайта создать файл «1.php» и поместить в него данный код.

На странице при нажатии на ссылку запрос отправляется на эту же страницу, но с GET-параметром id. Значение id используется для определения того на какую ссылку нажал пользователь.
Далее, если GET-параметр id имеется, то выполняется логика.
Сохраняются данные в файл «clicks.txt» в таком виде:
{"id-0":["192.168.0.102","192.168.0.50"],"id-1":["192.168.0.50"]}
Количество кликов определяется по числу элементов в соответствующем массиве.
Для защиты от накрутки скрипт сначала проверяет, есть ли уже этот элемент в массиве, и только после этого его добавляет в него.
Дмитрий
Дмитрий
Я в php не разбираюсь от слова совсем) Дело в том, что после нажатия на ссылку открывается определенный материал. А представленный код в моем вопросе идеально справляется со своей задачей, кроме очень важной части, по распределению уникальных кликов. Всё таки хотелось получить более точную статистику нажатий.
Александр, могли бы вы добавить пожалуйста в этот код проверку по IP.
<?php
//
if ($_GET['img'] == 1) {
  header("location: http://website.ru");
  $file = fopen("file.txt","a+");
  flock($file,LOCK_EX); 
  $count = fread($file,100);
  $count++; 
  ftruncate($file,0); 
  fwrite($file,$count); 
  flock($file,LOCK_UN); 
  fclose($file); 
}
?>
Александр Мальцев
Александр Мальцев
Вам в любом случае код нужно переделывать, т.к. куда-то нужно сохранять IP-адреса пользователей. Иначе как вы будете сравнивать нажимал ли уже пользователь с этим IP-адресом на ссылку или нет.
Дмитрий
Дмитрий
А как можно сделать в вашем коде, чтобы при нажатии на ссылку (их 115 штук) переходило на саму эту ссылку, но с учетом количества кликов по IP?
Александр Мальцев
Александр Мальцев
Как-то так:
<?php
  if ($_GET['img'] == 1) {
    header("location: http://website.ru");
    $path = 'file.txt';
    $data = array();
    if (isset($_GET['id'])) {
      if (file_exists($path)) {
        $data = json_decode(file_get_contents($path), true);
        if (count($data['id-'.$_GET['img']) > 0) {
          if (!in_array($_SERVER['REMOTE_ADDR'], $data['id-'.$_GET['img'])) {
            $data['id-'.$_GET['img'][] = $_SERVER['REMOTE_ADDR'];
          }
        } else {
          $data['id-'.$_GET['img'][] = $_SERVER['REMOTE_ADDR'];
        }
        file_put_contents($path, json_encode($data), LOCK_EX);
      } else {
        $data['id-'.$_GET['img'][] = $_SERVER['REMOTE_ADDR'];
        file_put_contents($path, json_encode($data), LOCK_EX);
      }
    } else {
      if (file_exists($path)) {
        $data = json_decode(file_get_contents($path), true);
      }
    }
  }
?>
Дмитрий
Дмитрий
Проверил, не работает почему-то
Александр Мальцев
Александр Мальцев
Вам ещё нужно менять код в том месте в котором вы выводите количество из этого файла на страницу.
Дмитрий
Дмитрий
После нажатия не открывается ссылка из кода
header("location:
Ладно, фиг с ним, пусть код учитывает все клики подряд.
Благодарю вас за помощь, Александр!
Виктор
Виктор
Спасибо, шикарная статья! Все по делу и понятно…
По определению IP сейчас уже много решений для определения. появились такие сервисы, позволяющие узнавать не только IP, но и телефонные номера всех посетителей сайта. используют в маркетинге для обзвонов. говорят, что легально — патенты, резрешения, все дела. как они это делают?
пример — vse-klienty.ru
Александр Мальцев
Александр Мальцев
Пожалуйста!
Там в принципе описывается как они это делают, т.е. просто устанавливают счётчик, который собирает все возможные сведения о пользователе (слепок), а именно — его IP, данные браузера, операционной системы, параметры монитора и т.д. Но этот слепок никакой информации не даст. Вы даже не сможете точно узнать IP адрес пользователя, т.к. он может использовать прокси или VPN. Кроме этого, у большинства пользователей IP адрес динамический, сегодня один, а завтра другой.

Чтобы узнать данные о пользователе по этому слепку должен быть какой-то другой крупный сайт, какая-нибудь социальная сеть, в которой пользователи указывают свой телефон, имя, фамилию и т.д. И когда пользователи заходят в эту социальную сеть, она тоже должна делать их слепки. А так как пользователи заходят туда часто, то это место откуда можно делать актуальные слепки. Затем уже будет просто узнать пользователя просто сравнив эти слепки и предоставить информацию о нём. Т.е. если какой-то сервис предоставляет эту возможность, то он должен быть как-то связан хотя бы с одной социальной сетью. Не знаю, насколько это легально, т.к. этот сервис без третьей стороны (социальной сети) ничего предоставить не может.
barsik
barsik
Спасибо! Очень давно искал подобную информацию с подробным описанием. Осталось только понять реализацию подмены контента (допустим баннеров на главной) после определения ip
Александр Мальцев
Александр Мальцев
Ну, тут всё просто. Если, например, страна пользователя Россия, Беларусь или Казахстан, то, например, показываем Яндекс рекламу. В других странах, например, показываем AdSense рекламу.
$arrCountry = array('RU', 'BY', 'KZ');
if (in_array($country_code, $arrCountry)) {
  // код подключения Яндекс баннера
} else {
  // код подключения AdSense баннера
}
Так же, например это можно использовать для отключения некоторых сервисов сайта, т.к. эти сервисы могут быть доступны в одной стране, а в другой заблокированы.
if ($country_code == 'UA') {
  // здесь подключаем сервис для Украины
} else {
  // здесь подключаем сервис для других стран
}
Как функционал определения страны реализовать в CMS MODX и как его использовать тоже добавлю в статью в ближайшее время.
Александр Мальцев
Александр Мальцев
Если интересно как это осуществить в CMS MODX Revolution, то добавил эту информацию в статью.