| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- <?php
- namespace App\Game\Services;
- class IgtUserAgentParser
- {
- private $userAgent;
- private $parsed = [];
- public function __construct($userAgent = null)
- {
- $this->userAgent = $userAgent ?? ($_SERVER['HTTP_USER_AGENT'] ?? '');
- $this->parse();
- }
- private function parse()
- {
- $ua = $this->userAgent;
- $this->parsed['IsCrawler'] = $this->isCrawler($ua) ? 'Y' : 'N';
- $this->parsed['BrowserName'] = $this->getBrowserName($ua);
- $this->parsed['BrowserVersion'] = $this->getBrowserVersion($ua);
- $this->parsed['BrowserVendor'] = $this->getBrowserVendor($this->parsed['BrowserName']);
- $this->parsed['PlatformName'] = $this->getPlatformName($ua);
- $this->parsed['PlatformVersion'] = $this->getPlatformVersion($ua);
- $this->parsed['PlatformVendor'] = $this->getPlatformVendor($this->parsed['PlatformName']);
- $this->parsed['HardwareName'] = $this->getHardwareName($ua);
- $this->parsed['HardwareModel'] = $this->getHardwareModel($ua);
- $this->parsed['HardwareFamily'] = $this->getHardwareFamily($this->parsed['HardwareName']);
- $this->parsed['HardwareVendor'] = $this->getHardwareVendor($ua);
- $this->parsed['OEM'] = $this->parsed['HardwareVendor'];
- $this->parsed['ScreenPixelsWidth'] = $this->getScreenWidth($ua);
- $this->parsed['ScreenPixelsHeight'] = $this->getScreenHeight($ua);
- $this->parsed['ScreenInchesDiagonal'] = $this->getScreenDiagonal($ua);
- $this->parsed['ScreenInchesWidth'] = '0';
- $this->parsed['ScreenInchesHeight'] = '0';
- $this->parsed['Popularity'] = $this->getPopularity($ua);
- }
- public function getDeviceConfig()
- {
- return $this->parsed;
- }
- private function isCrawler($ua)
- {
- $crawlers = [
- 'bot', 'crawl', 'spider', 'slurp', 'mediapartners',
- 'google', 'yahoo', 'bing', 'facebook', 'twitter'
- ];
- $uaLower = strtolower($ua);
- foreach ($crawlers as $crawler) {
- if (strpos($uaLower, $crawler) !== false) {
- return true;
- }
- }
- return false;
- }
- private function getBrowserName($ua)
- {
- if (preg_match('/Edg(e|A|iOS)\//', $ua)) {
- return 'Microsoft Edge';
- }
- if (preg_match('/Chrome\//', $ua) && !preg_match('/Chromium\//', $ua)) {
- return 'Chrome';
- }
- if (preg_match('/Safari\//', $ua) && !preg_match('/Chrome\//', $ua)) {
- if (preg_match('/Mobile\//', $ua)) {
- return 'Mobile Safari';
- }
- return 'Safari';
- }
- if (preg_match('/Firefox\//', $ua)) {
- return 'Firefox';
- }
- if (preg_match('/Opera\/|OPR\//', $ua)) {
- return 'Opera';
- }
- if (preg_match('/MSIE |Trident\//', $ua)) {
- return 'Internet Explorer';
- }
- if (preg_match('/SamsungBrowser\//', $ua)) {
- return 'Samsung Browser';
- }
- if (preg_match('/UCBrowser\//', $ua)) {
- return 'UC Browser';
- }
- return 'Unknown';
- }
- private function getBrowserVersion($ua)
- {
- $patterns = [
- '/Edg(e|A|iOS)\/(\d+\.\d+)/',
- '/Chrome\/(\d+\.\d+)/',
- '/Safari\/(\d+\.\d+)/',
- '/Firefox\/(\d+\.\d+)/',
- '/OPR\/(\d+\.\d+)/',
- '/Version\/(\d+\.\d+)/',
- '/MSIE (\d+\.\d+)/',
- '/rv:(\d+\.\d+)/',
- ];
- foreach ($patterns as $pattern) {
- if (preg_match($pattern, $ua, $matches)) {
- return $matches[count($matches) - 1];
- }
- }
- return '0.0';
- }
- private function getBrowserVendor($browserName)
- {
- $vendors = [
- 'Chrome' => 'Google',
- 'Safari' => 'Apple',
- 'Mobile Safari' => 'Apple',
- 'Firefox' => 'Mozilla',
- 'Opera' => 'Opera Software',
- 'Microsoft Edge' => 'Microsoft',
- 'Internet Explorer' => 'Microsoft',
- 'Samsung Browser' => 'Samsung',
- 'UC Browser' => 'UCWeb',
- ];
- return $vendors[$browserName] ?? 'Unknown';
- }
- private function getPlatformName($ua)
- {
- if (preg_match('/Windows NT/', $ua)) {
- return 'Windows';
- }
- if (preg_match('/Mac OS X|MacPPC|MacIntel/', $ua)) {
- if (preg_match('/iPhone|iPod|iPad/', $ua)) {
- return 'iOS';
- }
- return 'macOS';
- }
- if (preg_match('/Android/', $ua)) {
- return 'Android';
- }
- if (preg_match('/Linux/', $ua)) {
- return 'Linux';
- }
- if (preg_match('/CrOS/', $ua)) {
- return 'Chrome OS';
- }
- return 'Unknown';
- }
- private function getPlatformVersion($ua)
- {
- if (preg_match('/OS (\d+)[_\.](\d+)/', $ua, $matches)) {
- return $matches[1] . '.' . $matches[2];
- }
- if (preg_match('/Android (\d+\.\d+)/', $ua, $matches)) {
- return $matches[1];
- }
- if (preg_match('/Windows NT (\d+\.\d+)/', $ua, $matches)) {
- $version = $matches[1];
- $windowsVersions = [
- '10.0' => '10',
- '6.3' => '8.1',
- '6.2' => '8',
- '6.1' => '7',
- '6.0' => 'Vista',
- '5.1' => 'XP',
- ];
- return $windowsVersions[$version] ?? $version;
- }
- if (preg_match('/Mac OS X (\d+)[_\.](\d+)/', $ua, $matches)) {
- return $matches[1] . '.' . $matches[2];
- }
- return '0.0';
- }
- private function getPlatformVendor($platformName)
- {
- $vendors = [
- 'iOS' => 'Apple',
- 'macOS' => 'Apple',
- 'Android' => 'Google',
- 'Windows' => 'Microsoft',
- 'Chrome OS' => 'Google',
- 'Linux' => 'Linux Foundation',
- ];
- return $vendors[$platformName] ?? 'Unknown';
- }
- private function getHardwareName($ua)
- {
- if (preg_match('/iPhone/', $ua)) {
- return 'iPhone';
- }
- if (preg_match('/iPad/', $ua)) {
- return 'iPad';
- }
- if (preg_match('/iPod/', $ua)) {
- return 'iPod';
- }
- if (preg_match('/SM-[A-Z]\d+/', $ua, $matches)) {
- return $matches[0];
- }
- if (preg_match('/(HW|HUAWEI)[- ]([A-Z0-9\-]+)/', $ua, $matches)) {
- return $matches[2];
- }
- if (preg_match('/MI [A-Z0-9]+|Redmi/', $ua, $matches)) {
- return $matches[0];
- }
- if (preg_match('/Android/', $ua)) {
- return 'Android Device';
- }
- if (preg_match('/Windows|Mac OS X|Linux/', $ua)) {
- return 'Desktop';
- }
- return 'Unknown Device';
- }
- private function getHardwareModel($ua)
- {
- if (preg_match('/iPhone/', $ua)) {
- return 'iPhone';
- }
- if (preg_match('/iPad/', $ua)) {
- return 'iPad';
- }
- if (preg_match('/\(([^)]*Android[^)]*)\)/', $ua, $matches)) {
- $parts = explode(';', $matches[1]);
- if (count($parts) >= 2) {
- return trim($parts[count($parts) - 1]);
- }
- }
- return $this->getHardwareName($ua);
- }
- private function getHardwareFamily($hardwareName)
- {
- if (strpos($hardwareName, 'iPhone') !== false) {
- return 'iPhone';
- }
- if (strpos($hardwareName, 'iPad') !== false) {
- return 'iPad';
- }
- if (strpos($hardwareName, 'iPod') !== false) {
- return 'iPod';
- }
- if (strpos($hardwareName, 'SM-') !== false) {
- return 'Samsung Galaxy';
- }
- if (strpos($hardwareName, 'Desktop') !== false) {
- return 'Desktop PC';
- }
- return 'Mobile';
- }
- private function getHardwareVendor($ua)
- {
- if (preg_match('/iPhone|iPad|iPod|Macintosh/', $ua)) {
- return 'Apple';
- }
- if (preg_match('/Samsung|SM-/', $ua)) {
- return 'Samsung';
- }
- if (preg_match('/Huawei|HW-|HUAWEI/', $ua)) {
- return 'Huawei';
- }
- if (preg_match('/Xiaomi|MI |Redmi/', $ua)) {
- return 'Xiaomi';
- }
- if (preg_match('/OPPO/', $ua)) {
- return 'OPPO';
- }
- if (preg_match('/vivo/', $ua)) {
- return 'Vivo';
- }
- if (preg_match('/OnePlus/', $ua)) {
- return 'OnePlus';
- }
- if (preg_match('/LG-/', $ua)) {
- return 'LG';
- }
- if (preg_match('/Sony/', $ua)) {
- return 'Sony';
- }
- if (preg_match('/Pixel/', $ua)) {
- return 'Google';
- }
- return 'Unknown';
- }
- private function getScreenWidth($ua)
- {
- if (preg_match('/iPhone/', $ua)) {
- return '750';
- }
- if (preg_match('/iPad/', $ua)) {
- return '2048';
- }
- if (preg_match('/Android.*Mobile/', $ua)) {
- return '1080';
- }
- if (preg_match('/Android/', $ua) && !preg_match('/Mobile/', $ua)) {
- return '1280';
- }
- return '1920';
- }
- private function getScreenHeight($ua)
- {
- if (preg_match('/iPhone/', $ua)) {
- return '1334';
- }
- if (preg_match('/iPad/', $ua)) {
- return '2732';
- }
- if (preg_match('/Android.*Mobile/', $ua)) {
- return '1920';
- }
- if (preg_match('/Android/', $ua) && !preg_match('/Mobile/', $ua)) {
- return '800';
- }
- return '1080';
- }
- private function getScreenDiagonal($ua)
- {
- if (preg_match('/iPhone/', $ua)) {
- return '4.7';
- }
- if (preg_match('/iPad/', $ua)) {
- return '10.2';
- }
- if (preg_match('/Android.*Mobile/', $ua)) {
- return '6.0';
- }
- if (preg_match('/Android/', $ua) && !preg_match('/Mobile/', $ua)) {
- return '10.0';
- }
- return '24.0';
- }
- private function getPopularity($ua)
- {
- if (preg_match('/iPhone/', $ua)) {
- return '9';
- }
- if (preg_match('/iPad/', $ua)) {
- return '8';
- }
- if (preg_match('/Samsung/', $ua)) {
- return '8';
- }
- if (preg_match('/Chrome/', $ua)) {
- return '9';
- }
- if (preg_match('/Safari/', $ua)) {
- return '7';
- }
- return '5';
- }
- public function getUserAgent()
- {
- return $this->userAgent;
- }
- public function get($field)
- {
- return $this->parsed[$field] ?? null;
- }
- public function getAll()
- {
- return $this->parsed;
- }
- }
|