Статьи

Інформація про користувача на PHP - IP, браузер, операційна система, робот

  1. Як працює PHP клас визначення даних користувача по user-agent

Нещодавно мені потрібно було дізнатися назву браузера користувача сайту, для того щоб заборонити доступ до сайту певного браузеру. Заняття дурне, тому що будь-який користувач на сайті повинен відчувати себе комфортно незважаючи на якому він браузері, але з замовником не посперечаєшся, мабуть дизайн сайту не працював під певний браузер. В даному випадку варто змінити дизайнера а не жертвувати відвідувачами. Я не зупинився тільки на визначення браузера, мені хотілося додати в нього більше функціоналу для можливих майбутніх перевірок. У підсумку, клас вийшов досить компактним і динамічним в змінах.

На даний момент він видає:

  1. Назва браузера
  2. версія браузера
  3. Назва операційної системи
  4. Версія / ядро ​​операційної системи
  5. IP відвідувача
  6. перевірка: чи зайшов користувач з браузера
  7. перевірка: чи зайшов користувач з мобільного пристрою
  8. Назва марки / ос / браузера мобільного телефону, смартфона, планшета
  9. перевірка: чи є відвідувач роботом пошукових систем
  10. Який пошукової системи належить робот

Завантажити клас з прикладом

Як працює 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 в разі заходження з мобільного телефону, смартфона або планшета.

Приклад роботи:

&lt;? 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. &quot;<br /> Робот належить: $ AboutGuest-> robot <br /> <br /> Зайшов з мобільного?". $ AboutGuest-> is_mobile. &quot;<br /> Телефон: $ AboutGuest-> mobile <br /> <br />"; ?> Результат роботи скрипта в різних браузерах може бути по різному. Причина в тому, що браузери не видають PHP дані з $ _SERVER [ 'HTTP_USER_AGENT'] однаково, в добавок, через CRON або file_get_contents можна відправити PHP будь штучне значення для $ _SERVER [ 'HTTP_USER_AGENT'] і з цим вже нічого не поробиш. Вихідні дані: Mozilla / 5.0 (X11; Ubuntu; Linux i686; rv: 13.0) Gecko / 20100101 Firefox / 13.0.1 IP: 127.0.0.1 Браузер: Firefox версія: 13.0.1 Операційна система: Ubuntu версія: i686 Вихідні дані: Mozilla /5.0 (X11; Linux i686) AppleWebKit / 535.19 (KHTML, like Gecko) Ubuntu / 12.04 Chromium / 18.0.1025.168 Chrome / 18.0.1025.168 Safari / 535.19 IP: 127.0.0.1 Браузер: Chrome версія: 18.0.1025.168 Операційна система: Ubuntu версія: 12.04

Вдалих вам скриптів і нехай прибуде з вами звичка поділу коду на TAB блоки!

Lt;?
Php'; $ This -> $ file_and_array_name = (! Count ($ Load))?
A-zA-Z]?
Lt;?
Quot;<br /> Робот належить: $ AboutGuest-> robot <br /> <br /> Зайшов з мобільного?
Quot;<br /> Телефон: $ AboutGuest-> mobile <br /> <br />"; ?

Новости