Detekce prohlížeče 4.1

Klíčová slova: HTTP_USER_AGENT, eregi, FIREFOX, FLOCK , MS Windows Vista, iPhon 3G
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
Seznam detekovaných operačních systémů:
  • 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: 
Datum vydání: 03.09.2008 | Zobrazeno: 67124
Permanentní odkaz: Detekce prohlížeče 4.1

Komentáře (18)
Zrovna jsem hledal, jestli uz nekoho neco podobneho napadlo.. :-D Takze vidim, ze kod nemusim delat. Supr prace!
Autor:pepa
Změna funkce detect_browser na novou verzi. Verze 4.1 nyní přináší detekci nového prohlížeče GOOGLE CHROME a globální proměnnou $FceVersion, která obsahuje číslo verze detekční procedury/funkce.
Autor:provaznik
Po hodině hledání konečně skvělá funkce pro detekci prohlížečů a OS. Jednoduchá a dostačující, akorát bych doplnil o vyhledání botů a hlavně místo eregi => strtolower() na začátku a pak všechno malým + preg() funkce. Díky za sdílení. Btw. Funkce od PHP get_browser() je poměrně náročná (0.09s ve srovnání s tímto, které bylo provedeno za 0.02s).
Autor:Martin Zvarík
jo a u detekce OS raději strpos()... eregi() stejně nepoužíváte ke zjištění verze OS
Autor:Martin Zvarík
Aha, boti tam jsou... .)
Autor:Martin
Díky za připomínky. Pokusím se zapracovat v právě připravované verzi.
Autor:Provaznik
Zdravím, rád bych se zeptal, zda jde nějakým způsobem takto detekovat prohlížeč IE8 v režimu Compatibility View (výsledkem totiž je: "Browser version: 7.0"). Nejde mi o to, jakým jádrem se stránka generuje, ale o skutečnou verzi prohlížeče. Díky :)
Autor:Honza
Ahoj Jirko. U reguláru pro Links máš přebytečnou otevírací závorku. Regulár pro OS ti chybně vyhodnocuje MSIE 8/Vista jako MSIE 8/XP. (Výstup z $user_agent je: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30618; OfficeLiveConnector.1.3; OfficeLivePatch.0.0) A měl bys používat $_SERVER["HTTP_USER_AGENT"], místo $HTTP_USER_AGENT. Servery už jej neposkytují. (Ale jinak chválím píli.) Honzovi: Nelze. MSIE 8 se v režimu zpětné kompatibility fyzicky přepne do parseru MSIE 7, takže to prostě JE MSIE7.
Autor:Petr
Diky za skript, je to uzitecny. A nevim jak ostatnim, ale me na zacatku nefunguje $HTTP_USER_AGENT, tak jsem to nahradil $_SERVER['HTTP_USER_AGENT'] :-)
Autor:marcus33cz
Super:Díky zas trochu ušetřené práce.
Autor:Rostik
Ahoj Jiří, hledal jsem nějakou jednoduchou pomůcku a našel tvůj propracovaný script. Klobouk dolů. Doladil jsem si ho (potom jsem si přečetl, že návod k doladění píše kousek výše Petr :-) ) a budu používat, abych podle gusta návštěvníka a jeho výběru prohlížeče upravil svoje stránky (doufám, že snad někdy v budoucnu se sjednotí alespoň ty základní prohlížeče, aby zobrazovaly stránky stejně a tohle odpadlo :-(). Díky moc.
Autor:martin
iPad: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10
Autor:Lukáš Churý
Windows 7 vrací NT 6.1: http://blogs.msdn.com/ie/archive/2009/01/09/the-internet-explorer-8-user-agent-string-updated-edition.aspx
Autor:Lukáš Churý
Skript nefunguje pro korektní detekci Opery 10 a větší a také pro Windows 7, který vrací NT 6.1. Opravu najdete zde: http://lukaschury.cz/temp/oprava_detekce.phps (zde se mi to nepodařilo odeslat)
Autor:Lukáš Churý
Od PHP 5.3 nefunguje funkce "ereg()"! ... staci zamenit za "preg_match()" (to same "ereg_replace()" --> "preg_replace()", to jen pro info, kdyby nekdo hledal)
Autor:kubik256
Script detekoval webový prohlížeč (My Internet Browser 5) jako Netscape. User agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Whistler/20110021 myibrow/5.0.0.0
Autor:Karel Došek
Dobrý předem chci pochválit užitečný script a zároveň se zeptat komu funguje v první řádku detekce User agenta tedy "$user_agent=$HTTP_USER_AGENT;" -> Já to udělal takto "$user_agent=$_SERVER['HTTP_USER_AGENT'];", dokud jsem to tak neudělal tak mi nefungoval.
Autor:Mara
Měl bych dotaz: Jak výše píše "kubík256" o té záměně ereg.., mělo by se to týkat hlášky:"Warning: eregi(): REG_EPAREN in ...", co se mi ukazuje na stránce? Ještě bych doplnil, že se mi to objevuje jen v IE. Děkuji
Autor:Jirka
Přidej vlastní komentář:
Následující (běžně neviditelná) pole slouží pro vnitřní identifikaci systému. Pokud je vyplníte nebude možné váš požadavek na straně serveru zpracovat:
URL:
contents:
Website:
Pro odeslání vašeho komentáře použijte tlačítko "Odeslat". Toto tlačítko nepoužívejte:

Následující položky je vhodné vyplnit:
Jméno :
Email :
Web :
Místo :
Hodnocení:
Hodnocení jako pomocí hvězdiček
1/5= nejhorší, 5/5=nejlepší