При работе с сайтами может понадобиться такая информация о пользователе, как IP, браузер, ОС и некоторая другая информация. В выводе этой информации нам поможет PHP
— информация всегда будет полезна для учета статистики. Решение есть в виде готового скрипта на PHP, выводящего всю доступную информацию о зашедшем пользователе:
- IP посетителя
- Вход с ПК-браузера или с браузера мобильного устройства
- Название браузера
- Версия браузера
- Название ОС
- Версия/ядро ОС
- Название браузера мобильного устройства
- Вход осуществил человек или робот
- Какой поисковой системы принадлежит робот
Оглавление:
Как работает PHP класс «Информация о пользователе» по user-agent?
Из папки arrays загружаются ассоциативные массивы, содержащие аббревиатуры или короткие название браузеров, операционных систем или роботов, которые встречаются в строке user-agent, полученную из браузера. После получения данных динамично вызываются все методы, имеющие префикс set_ и заполняют переменные класса, так как только они являются публичными, и только их можно вывести за пределы видимости класса.
<?php /* * Данные о пользователе сайта * Автор: Mowshon */ class AboutGuest { public $is_browser = False; public $is_mobile = False; public $is_robot = False; public $browsers = array(); public $operating_systems = array(); public $mobiles = array(); public $robots = array(); public $ip = ''; public $version = ''; public $browser = ''; public $browser_full_name = ''; public $operating_system = ''; public $os_version = ''; public $robot = ''; public $mobile = ''; public function __construct() { // Загружаем массивы для работы с данными $files = array('browsers', 'operating_systems', 'mobiles', 'robots'); foreach($files as $file) { $this->load( $file ); } // Данные пользователя $this->agent = (@$_SERVER['HTTP_USER_AGENT'])? $_SERVER['HTTP_USER_AGENT'] : ''; // Вызываем методы для заполнения данных пользователя $setMethods = array('set_ip', 'set_browser', 'set_operating_system', 'set_robot', 'set_mobile'); foreach($setMethods as $method) { $this->$method(); } } private function load( $file_and_array_name ) { /* * Загружает массивы из папки с массивами */ $Load = require_once( dirname( __FILE__ ) ) . '/arrays/'.$file_and_array_name.'.php'; $this->$file_and_array_name = (!count($Load))? array() : $Load; } private function set_ip() { $this->ip = $_SERVER['REMOTE_ADDR']; return True; } private function set_browser() { if (is_array($this->browsers) and count($this->browsers) > 0) { foreach ($this->browsers as $key => $val) { if (preg_match("|".preg_quote($key).".*?([0-9\.]+)|i", $this->agent, $match)) { $this->is_browser = TRUE; $this->version = $match[1]; $this->browser = $val; $this->browser_full_name = $match[0]; return True; } } } return False; } private function set_operating_system() { if (is_array($this->operating_systems) AND count($this->operating_systems) > 0) { foreach ($this->operating_systems as $key => $val) { if (preg_match("|".preg_quote($key).".*?([a-zA-Z]?[0-9\.]+)|i", $this->agent, $match)) { $this->operating_system = $val; $this->os_version = $match[1]; return True; } } } $this->operating_system = 'Unknown'; } private function set_robot() { if (is_array($this->robots) AND count($this->robots) > 0) { foreach ($this->robots as $key => $val) { if (preg_match("|".preg_quote($key)."|i", $this->agent)) { $this->is_robot = TRUE; $this->robot = $val; return TRUE; } } } return FALSE; } private function set_mobile() { if (is_array($this->mobiles) AND count($this->mobiles) > 0) { foreach ($this->mobiles as $key => $val) { if (FALSE !== (strpos(strtolower($this->agent), $key))) { $this->is_mobile = TRUE; $this->mobile = $val; return TRUE; } } } return FALSE; } } ?>
Это был пример того, как выглядит массив с «браузерами». Переменную, содержащую сам массив, указывать не нужно, ибо достаточно просто начать код с return. Если данный файл вызвать через require или require_once, а результат выполнения присвоить переменной, данная переменная будет содержать в себе массив (как это делает метод $this->load() в нашем классе).
<?php return array( 'Flock' => 'Flock', 'SeaMoney' => 'SeaMonkey', 'Chrome' => 'Chrome', 'Opera' => 'Opera', 'MSIE' => 'Internet Explorer', 'Internet Explorer' => 'Internet Explorer', 'Shiira' => 'Shiira', 'Firefox' => 'Firefox', 'Chimera' => 'Chimera', 'Phoenix' => 'Phoenix', 'Firebird' => 'Firebird', 'Camino' => 'Camino', 'Netscape' => 'Netscape', 'OmniWeb' => 'OmniWeb', 'Safari' => 'Safari', 'Mozilla' => 'Mozilla', 'Konqueror' => 'Konqueror', 'icab' => 'iCab', 'Lynx' => 'Lynx', 'Links' => 'Links', 'hotjava' => 'HotJava', 'amaya' => 'Amaya', 'IBrowse' => 'IBrowse' ); ?>
Описание работы методов класса:
Главный метод — конструктор «__construct» в момент вызова класса AboutGuest выполняется первым, тем самым играет ключевую роль в работе класса. Первым делом создает массивы данных для работы остальных методов. Объект $this->agent содержит в себе ничто иное, как $_SERVER[‘HTTP_USER_AGENT’], из которого мы вытаскиваем нужную нам информацию браузера.
Метод $this->load( $file_and_array_name ) загрузчик
Данный метод загружает из папки arrays массивы и присваивает их переменной, указанной в значении атрибута $file_and_array_name. Данный атрибут так же является названием файла из папки arrays.
Метод $this->set_ip()
Он возвращает значение из массива $_SERVER с ключом REMOTE_ADDR, как известно, $_SERVER[‘REMOTE_ADDR’] это IP пользователя, доступный браузеру.
Метод $this->set_browser() файл массива: arrays / browsers.php
После того, как метод $this->load загрузил массивы, этот метод будет работать с массивом из объекта $this->browsers. Как только он находит совпадение ключа массива с содержимым строки из $this->agent, он присваивает объекту $this->browser значение ключа из массива $this->browsers. Так же данный метод присваивает и версию браузера в $this->version. Так как браузер уже нашел совпадение, это не вызывает сомнения, что пользователь зашел с браузера, а не выполнил вход на сайт через скрипт. Присваиваем $this->is_browser значение True;
Метод $this->set_operating_system() файл массива: arrays / operating_systems.php
Работает аналогично методу $this->set_browser за исключением того, что, как массив проверки совпадении, он пользуется объектом $this->operating_systems, который получил массив из файла arrays/operating_systems.php после выполнения метода $this->load(). К сожалению, браузеры не столь активно делятся версией операционной системы. Иногда можно получить непонятные цифры вместо версии. Так что будете осторожны, когда пользуетесь $this->os_version. Название операционной системы содержится в $this->operating_system (не путать с $this->os_version)
Метод $this->set_robot() файл массива: arrays / robots.php
Проверяем, является ли посетитель роботом или нет. Если он является роботом, тогда значение для $this->is_robot будет TRUE; в значение $this->robot будет содержать название поисковика, запустившего робота на сайт (Google Bot, Yandex Bot, Rambler Bot…)
Метод $this->set_mobile() файл массива: arrays / mobiles.php
Работает аналогично методу $this->set_operating_system(), только присваивает объекту $this->mobile название марки телефона/ Значение $this->is_mobile будет TRUE в случае захода с мобильного телефона, смартфона или планшета.
<?php header('Content-Type: text/html; charset=utf-8'); include_once('AboutGuest.php'); $AboutGuest = new AboutGuest; echo "Исходные данные: $AboutGuest->agent <br /><br /> IP: $AboutGuest->ip Браузер: $AboutGuest->browser версия: $AboutGuest->version<br /> Операционная система: $AboutGuest->operating_system версия: $AboutGuest->os_version<br /><br /> Являюсь роботом? ". $AboutGuest->is_robot ."<br /> Робот принадлежит: $AboutGuest->robot<br /><br /> Зашел с мобильного? ". $AboutGuest->is_mobile ."<br /> Телефон: $AboutGuest->mobile<br /><br />"; ?>
Результат работы скрипта в разных браузерах может разным. Причина в том, что браузеры не выдают по PHP информацию из $_SERVER[‘HTTP_USER_AGENT’] одинаково, в добавок, через CRON или file_get_contents можно отправить PHP любое искусственное значение для $_SERVER[‘HTTP_USER_AGENT’], а с этим уже ничего не поделать.