Detekce prohlížeče 4.1
Rubrika: PHP
Tato procedura je založena na rozboru řetězce obsaženém v proměnné $HTTP_USER_AGENT. Výsledkem procedury je naplnění třech globálních proměnných $BName, $BVersion, $BPlatform, které obsahují název prohlížeče, verzi prohlížeče a operační systém na kterém prohlížeč běží. V poslední verzi 4.1 byla přidána ještě globální proměnná $FceVersion která obsahuje číslo verze detekční procedury/funkce.
Využití této procedur je rozličné. Buď potřebujete generovat pro různé prohlížeče rozdílné kusy zdrojových kódů nebo jen chcete mít k dispozici nějakou menší statistiku.
Proti původní verzi jsem úpravy provedl hlavně v detekci nových verzí FireFoxu. Do této verze se navíc dostali i další změny, které se u mě nahromadili v průběhu doby. Nově byla přidána např. detekce browseru Google CHROME, FLOCK, opravena detekce verze prohlížeče Safari a přidán detekce OS MS Windows Vista i několika dalších OS založených na Linuxovém jádře (Ubuntu, Debian, atd.). Protože nový iPhon 3G bude zajista populární, neopomněl jsem ani na detekci OS iPhone. Celkem umí tato procedura rozpoznat již 12 downloaderů, 28 prohlížečů a 36 operačních systémů. Tento výsledek je mimo jiné postaven na datech získaných v posledních dvou letech. Díky poměrně vysoké návštěvnosti některých mých webových projektů, jsem nasbíral více jak 30tisíc hlaviček HTTP_USER_AGENT. Samozřejmě že procedura nedokáže rozluštit všechny možnosti, ale již zmiňované počty detekovaných prohlížečů a OS jsou podle mě dostačující.
Pro ty šťouravější doporučuji zkontrolovat výsledky této procedury nad libovolným zadaným řetězcem z HTTP_USER_AGENT na stránce http://www.provaz.cz/sector02/statistika_test.php.
V současné době tedy umí tato procedura detekovat následující:
Seznam detekovaných downloaderů, crawlerů a robotů:
- Offline Explorer
- Web Downloader
- Mass Downloader
- Web Copier
- Ask Jeeves/Teoma
- Googlebot
- Nuk
- Openbot
- Slurp
- IA Archiver
- MSNBot
- Yammybot
Seznam detekovaných browserů nebo programů umožňujících zobrazovat webové stránky:
- Amay
- Camino (www)
- Epiphany (www)
- Chimera (www-unix)
- Chrone (www)
- FireFox (2.x; 3.x; www)
- Galeon
- Flock (www)
- Maxthon
- iCab
- K-Meleon (www)
- Konqueror
- Links
- Lunascape (4.7.3;www)
- Lotus
- Lynx (2.8.4)
- Mosaic
- Mozilla
- MSIE
- Netscape
- NetCaptor (7.0.2)
- Opera (7.0)
- Safari
- Songbird (0.5)
- Sylera (2.2.13)
- SeaMonkey (www)
- Sleipnir (www)
- W3M
- SunOS
- BeOS
- CentOS
- Debian Linux
- Fedora
- FreeBSD
- HP-Unix
- IRIX
- iPhone OS
- Mac OS
- Mandriva
- NetBSD
- OpenBSD
- OSF
- OS/2
- Plan9
- Red Hat
- SunOS
- Symbian OS
- SUSE Linux
- Ubuntu Linux
- Unix
- Linux
- Windows 3.11
- Windows XP
- Windows 3.11
- Windows 95
- Windows 98
- Windows 2000
- Windows XP
- Windows Server 2003
- Windows Vista
- Windows 7
- Windows NT
- Windows ME
- Windows CE
A jak tedy vypadá zdrojový kód této procedury?
Nejdříve kratší kód, který tuto proceduru zavolá se správným parametrem a vypíše výsledek.
$user_agent=$HTTP_USER_AGENT;
detect_browser($user_agent);
echo "
";
echo 'Browser name: '.$BName."
";
echo "Browser version: ".$BVersion."
";
echo "Platform name: ".$BPlatform."
";
echo "Function version: ".$FceVersion."
";
echo "
";
A teď již výpis procedury/funkce.
function detect_browser($user_agent)
{
global $BName, $BVersion, $BPlatform, $FceVersion;
//--- Verze procedury/funkce
$FceVersion = '4.1';
//--- Browser, Robot, crawler, spider & Download Managers ---
if(eregi("(Offline Explorer)/([0-9]{1}.[0-9]{1})",$user_agent,$match))
{
$BName = "Offline Explorer"; $BVersion=$match[2];
}
if(eregi("(WebCopier v)([0-9]{1}.[0-9]{1}.{0,1}[0-9]{0,1})",$user_agent,$match))
{
$BName = "WebCopier"; $BVersion=$match[2];
}
elseif(eregi("(Web Downloader)/([0-9]{1}.[0-9]{1})",$user_agent,$match))
{
$BName = "Web Downloader"; $BVersion=$match[2];
}
elseif(eregi("(Mass Downloader)/([0-9]{1}.[0-9]{1})",$user_agent,$match))
{
$BName = "Mass Downloader"; $BVersion=$match[2];
}
elseif(eregi("(Ask Jeeves/Teoma)",$user_agent))
{
$BName = 'Search Bot Ask Jeeves/Teoma';
}
elseif(eregi("(Googlebot)",$user_agent))
{
$BName = 'Search Bot Googlebot';
}
elseif(eregi("(nuhk)",$user_agent))
{
$BName = 'Search Bot NUHK';
}
elseif(eregi("(Openbot)",$user_agent))
{
$BName = 'Search Bot Openbot';
}
elseif(eregi("(Slurp)",$user_agent))
{
$BName = 'Search Bot Slurp';
}
elseif(eregi("(ia_archiver)",$user_agent))
{
$BName = 'Search Bot ia_archiver';
}
elseif(eregi("(MSNBot)",$user_agent))
{
$BName = 'Search Bot MSNBot';
}
elseif(eregi("(Yammybot)",$user_agent))
{
$BName = 'Search Bot Yammybot';
}
elseif(eregi("(Opera Mini)/([0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Opera Mini"; $BVersion=$match[2];
}
elseif(eregi("(opera) ([0-9]{1,2}.[0-9]{1,3}){0,1}",$user_agent,$match)
|| eregi("(opera/)([0-9]{1,2}.[0-9]{1,3}){0,1}",$user_agent,$match))
{
$BName = "Opera"; $BVersion=$match[2];
}
elseif( eregi("(NetCaptor) ([0-9]{1,2}.[0-9]{1,3}.[0-9]{1,3})",$user_agent,$match)
|| eregi("(NetCaptor) ([0-9]{1,2}.[0-9]{1,3})",$user_agent,$match))
{
$BName = "NetCaptor"; $BVersion=$match[2];
}
elseif(eregi("(amaya)",$user_agent,$match))
{
$BName = "Amaya"; $BVersion="Unknown";
}
elseif(eregi("(Camino)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Camino"; $BVersion=$match[2];
}
elseif(eregi("(Epiphany)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match)
|| eregi("(Epiphany)/([0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Epiphany"; $BVersion=$match[2];
}
elseif(eregi("(Flock)/([0-9]{1,2}.[0-9]{1,2}.{0,1}[0-9]{0,3}.{0,1}[0-9]{0,3})",$user_agent,$match))
{
$BName = "Flock"; $BVersion=$match[2];
}
elseif(eregi("(Galeon)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Galeon"; $BVersion=$match[2];
}
elseif(eregi("(Chimera)/([0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Chimera"; $BVersion=$match[2];
}
elseif(eregi("(Chrome)/([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})",$user_agent,$match))
{
$BName = "Chrome"; $BVersion=$match[2];
}
elseif(eregi("(icab)",$user_agent,$match))
{
$BName = "iCab"; $BVersion="Unknown";
}
elseif(eregi("(K-Meleon)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "K-Meleon"; $BVersion=$match[2];
}
elseif(eregi("(konqueror)/([0-9]{1,2}.[0-9]{1,3})",$user_agent,$match))
{
$BName = "Konqueror"; $BVersion=$match[2];
}
elseif(eregi("(Lunascape) ([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Lunascape"; $BVersion=$match[2];
}
elseif(eregi("(links) (([0-9]{1,2}.[0-9]{1,3})",$user_agent,$match))
{
$BName = "Links"; $BVersion=$match[2];
}
elseif(eregi("(lotus)",$user_agent,$match))
{
$BName = "Lotus "; $BVersion="Unknown";
}
elseif(eregi("(lynx)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Lynx"; $BVersion=$match[2];
}
elseif(eregi("(Maxthon)",$user_agent,$match))
{
$BName = "Maxthon"; $BVersion="Unknown";
}
elseif(eregi("(mosaic)",$user_agent,$match))
{
$BName = "Mosaic "; $BVersion="Unknown";
}
elseif( eregi("(Safari)/([0-9]{1,3})",$user_agent,$match) )
{
$BName = "Safari";
if ( eregi("(Version)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match)
|| eregi("(Version)/([0-9]{1,2}.[0-9]{1,2})",$user_agent,$match)
) $BVersion=$match[2];
}
elseif(eregi("(SeaMonkey)/([0-9]{1,2}.[0-9]{1,2}.{0,1}[0-9]{0,3}.{0,1}[0-9]{0,3})",$user_agent,$match))
{
$BName = "SeaMonkey"; $BVersion=$match[2];
}
elseif(eregi("(Sleipnir)/([0-9]{1,2}.[0-9]{1,2}.{0,1}[0-9]{0,3}.{0,1}[0-9]{0,3})",$user_agent,$match))
{
$BName = "Sleipnir"; $BVersion=$match[2];
}
elseif(eregi("(Songbird)/([0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Songbird"; $BVersion=$match[2];
}
elseif(eregi("(Sylera)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Sylera"; $BVersion=$match[2];
}
elseif(eregi("(Firefox)/([0-9]{1,2}.[0-9]{1,2}.{0,1}[0-9]{0,3}.{0,1}[0-9]{0,3})",$user_agent,$match))
{
$BName = "Firefox"; $BVersion=$match[2];
}
elseif(eregi("(msie) ([0-9]{1,2}.[0-9]{1,3})",$user_agent,$match))
{
$BName = "MSIE"; $BVersion=$match[2];
}
elseif(eregi("(netscape6)/(6.[0-9]{1,3})",$user_agent,$match))
{
$BName = "Netscape"; $BVersion=$match[2];
}
elseif(eregi("(netscape)/(7.[0-9]{1,2})",$user_agent,$match))
{
$BName = "Netscape"; $BVersion=$match[2];
}
elseif(eregi("(Gecko)/([0-9]{1,8})",$user_agent,$match))
{
$BName = "Mozilla";
$BVersion=$match[2];
if (eregi("(rv):([0-9]{1,2}.[0-9]{1,3}.[0-9]{1,3})",$user_agent,$match))
{
$BVersion=$match[2];
};
if (eregi("(rv):([0-9]{1,2}.[0-9]{1,3})",$user_agent,$match))
{
$BVersion=$match[2];
};
}
elseif(eregi("mozilla/5",$user_agent))
{
$BName = "Netscape"; $BVersion="Unknown";
}
elseif(eregi("(mozilla)/([0-9]{1,2}.[0-9]{1,3})",$user_agent,$match))
{
$BName = "Netscape "; $BVersion=$match[2];
}
elseif(eregi("w3m",$user_agent))
{
$BName = "w3m"; $BVersion="Unknown";
}
else{$BName = "Unknown"; $BVersion="Unknown";}
//--- Detekce Systému ------------------------------------------------
if((eregi("Windows XP",$user_agent))
|| (eregi("(Windows NT 5.1)",$user_agent,$match)))
{
$BPlatform = "Windows XP";
}
elseif(eregi("win16",$user_agent))
{
$BPlatform = "Windows 3.11";
}
elseif((eregi("(Windows 2000)",$user_agent,$match))
|| (eregi("(Windows NT 5.0)",$user_agent,$match)))
{
$BPlatform = "Windows 2000";
}
elseif(eregi("(Windows NT 5.2)|(windows 2003)",$user_agent))
{
$BPlatform = "Windows Server 2003";
}
elseif(eregi("(Windows NT 6.0)|(Windows Vista)",$user_agent))
{
$BPlatform = "Windows Vista";
}
elseif(eregi("(Windows NT 7.0)",$user_agent))
{
$BPlatform = "Windows 7";
}
elseif(eregi("Windows.ME",$user_agent))
{
$BPlatform = "Windows ME";
}
elseif(eregi("windows.ce",$user_agent))
{
$BPlatform = "Windows CE";
}
elseif(eregi("win32",$user_agent))
{
$BPlatform = "Windows";
}
elseif((eregi("(win)([0-9]{4})",$user_agent,$match))
|| (eregi("(windows) ([0-9]{4})",$user_agent,$match)))
{
$BPlatform = "Windows $match[2]";
}
elseif((eregi("(win)([0-9]{2})",$user_agent,$match))
|| (eregi("(windows) ([0-9]{2})",$user_agent,$match)))
{
$BPlatform = "Windows $match[2]";
}
elseif(eregi("(winnt)([0-9]{1,2}.[0-9]{1,2}){0,1}",$user_agent,$match))
{
$BPlatform = "Windows NT $match[2]";
}
elseif(eregi("(windows nt)( ){0,1}([0-9]{1,2}.[0-9]{1,2}){0,1}",$user_agent,$match))
{
$BPlatform = "Windows NT $match[3]";
}
elseif(eregi("(sunos) ([0-9]{1,2}.[0-9]{1,2}){0,1}",$user_agent,$match))
{
$BPlatform = "SunOS $match[2]";
}
elseif(eregi("(beos) r([0-9]{1,2}.[0-9]{1,2}){0,1}",$user_agent,$match))
{
$BPlatform = "BeOS $match[2]";
}
elseif(eregi("(CentOS)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent))
{
$BPlatform = "CentOS";
}
elseif(eregi("freebsd",$user_agent))
{
$BPlatform = "FreeBSD";
}
elseif(eregi("(Fedora)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BPlatform = "Fedora $match[2]";
}
elseif(eregi("hp-ux",$user_agent))
{
$BPlatform = "HP-Unix";
}
elseif(eregi("(iPhone OS)",$user_agent))
{
$BPlatform = "iPhone OS";
}
elseif(eregi("irix",$user_agent))
{
$BPlatform = "IRIX";
}
elseif(eregi("netbsd",$user_agent))
{
$BPlatform = "NetBSD";
}
elseif(eregi("(Mandriva)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent))
{
$BPlatform = "Mandriva";
}
elseif(eregi("openbsd",$user_agent))
{
$BPlatform = "OpenBSD";
}
elseif(eregi("osf",$user_agent))
{
$BPlatform = "OSF";
}
elseif(eregi("os/2",$user_agent))
{
$BPlatform = "OS/2";
}
elseif(eregi("plan9",$user_agent))
{
$BPlatform = "Plan9";
}
elseif(eregi("(Red Hat)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent,$match))
{
$BPlatform = "Red Hat";
}
elseif(eregi("(SUSE)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})",$user_agent))
{
$BPlatform = "SUSE Linux";
}
elseif(eregi("sunos",$user_agent))
{
$BPlatform = "SunOS";
}
elseif(eregi("symbian",$user_agent))
{
$BPlatform = "Symbian OS";
}
elseif(eregi("ubuntu",$user_agent))
{
$BPlatform = "Ubuntu Linux";
}
elseif(eregi("(debian)",$user_agent))
{
$BPlatform = "Debian Linux";
}
elseif(eregi("unix",$user_agent))
{
$BPlatform = "Unix";
}
elseif(eregi("linux",$user_agent))
{
$BPlatform = "Linux";
}
elseif(eregi("(Mac_PowerPC)|(Mac_PPC)|(Macintosh)|(Mac_68000)|(Mac OS X)",$user_agent))
{
$BPlatform = "Mac OS";
}
else{$BPlatform = "Unknown";}
}
Pokud je tato procedura pro vás přínosná nebo jiným způsobem vám pomohla, budu rád, když mě o tom dáte vědět. A budu samozřejmě rád i za jakékoli náměty nebo připomínky k této proceduře.
Pokud najdete lehce detekovatelnou HTTP_USER_AGENT hlavičku, kterou ještě nemám ve svém seznamu, budu rád, pokud ji pošlete. V tomto případě prosím pošlete celý text, který byl obsažen v HTTP_USER_AGENT a připojte samozřejmě i název OS, název prohlížeče a verzi prohlížeče.
Autor:pepa
Autor:provaznik
Autor:Martin Zvarík
Autor:Martin Zvarík
Autor:Martin
Autor:Provaznik
Autor:Honza
Autor:Petr
Autor:marcus33cz
Autor:Rostik
Autor:martin
Autor:Lukáš Churý
Autor:Lukáš Churý
Autor:Lukáš Churý
Autor:kubik256
Autor:Karel Došek
Autor:Mara
Autor:Jirka
Autor:Mauricehix