[ define_tag:'lp_client_browser', -description='Returns a map of the browswer name, browser version, browser type, and browser OS', -priority='replace', -optional='user_agent'; // http://www.quirksmode.org/js/detect.html // http://en.wikipedia.org/wiki/User_agent // http://browsers.garykeith.com/downloads.asp // http://www.pgts.com.au/pgtsj/pgtsj0212d.html // http://www.pgts.com.au/download/data/robots_list.txt // http://www.user-agents.org/index.shtml // http://www.robotstxt.org/wc/active/html/contact.html // http://www.jafsoft.com/searchengines/webbots.html // http://www.useragentstring.com/pages/useragentstring.php /* Browser types: B = Browser C = Link/Bookmark/Server Checker D = Download/FTP tool E = Email Reader F = Feed Reader L = Library O = Offline Browsing P = Proxy, Web filter R = Robot/Crawler/Spider S = Spam Harvester, Bad Bot U = Unknown V = HTML/CSS/JS Validator X = Suspected Robot/Crawler/Spider */ if: local_defined:'user_agent'; local:'client_browser' = #user_agent; else; local:'client_browser' = client_browser; /if; #client_browser->trim; if: #client_browser->size == 0; return: (map: 'browser' = 'No User Agent Provided', 'version' = '', 'os' = '', 'type' = 'Suspected Robot/Crawler/Spider', 'typecode' = 'X'); /if; local:'return' = (map: 'browser' = '', 'version' = '', 'os' = '', 'type' = '', 'typecode' = ''); //------------------------------------------------------------------- // browser //------------------------------------------------------------------- if: #client_browser->(beginswith:'mozilla/'); iterate: $_lp_client_browser_mozilla, local:'browser'; if: #client_browser->(contains:#browser->name); #return->(insert:'browser' = #browser->value->(get:1)); #return->(insert:'typecode' = #browser->value->(get:2)); // browser version local:'version' = #client_browser->(substring: #client_browser->(find: #browser->name) + #browser->name->size, 255); #version = (string_findregexp: #version, -find='\\d[^\\s;()\\]]*'); if: #version->size; #return->(insert: 'version' = #version->(get:1)); /if; // Safari version info for newer versions of Safari if: #return->(find:'browser') == 'Safari'; local:'version' = #client_browser->(find: 'Version/'); if: #version != 0; #version = #client_browser->(substring: #version + 7, 255); #version = (string_findregexp: #version, -find='\\d[^\\s;()\\]]*'); if: #version->size; #return->(insert: 'version' = #version->(get:1)); /if; /if; /if; loop_abort; /if; /iterate; if: #return->(find:'browser')->size == 0; /// keep trying // handle mozilla and old netscape versions, the problem children if: !#client_browser->(contains:'compatible') && !#client_browser->(contains:'http') && !#client_browser->(contains:'@') && !#client_browser->(contains:'www'); local:'mozver' = (string_findregexp: #client_browser, -find='\\d'); if: #mozver->size; #mozver = (integer: #mozver->(get:1)); if: #mozver < 5 && #client_browser->(contains:'['); // old Netscape #return->(insert: 'browser' = 'Netscape'); #return->(insert:'typecode' = 'B'); // browser version local:'version' = #client_browser; #version = (string_findregexp: #version, -find='\\d[^\\s;()\\]]*'); if: #version->size; #return->(insert: 'version' = #version->(get:1)); /if; else: #mozver == 5 && #client_browser->(contains:'gecko/') && #client_browser->(contains:'rv:'); if: #client_browser->(split:'gecko/')->last->(split:' ')->size == 1; // mozilla #return->(insert: 'browser' = 'Mozilla'); #return->(insert:'typecode' = 'B'); // browser version local:'version' = #client_browser->(substring: #client_browser->(find: 'rv:') + 'rv:'->size, 255);; #version = (string_findregexp: #version, -find='\\d[^\\s;()\\]]*'); if: #version->size; #return->(insert: 'version' = #version->(get:1)); /if; /if; /if; /if; /if; // handle msie if: #client_browser->(contains:'compatible; MSIE') && !#client_browser->(contains:'http') && !#client_browser->(contains:'@') && !#client_browser->(contains:'www') && !#client_browser->(contains:'.com'); if: #client_browser->(split:')')->last->size == 0; #return->(insert: 'browser' = 'Internet Explorer'); #return->(insert:'typecode' = 'B'); // browser version local:'version' = #client_browser->(substring: #client_browser->(find: 'MSIE') + 'MSIE'->size, 255);; #version = (string_findregexp: #version, -find='\\d[^\\s;()\\]]*'); if: #version->size; #return->(insert: 'version' = #version->(get:1)); /if; /if; /if; /if; else; // lots of possibilities iterate: $_lp_client_browser_other->(find:#client_browser->(get:1)), local:'browser'; if: #client_browser->(beginswith:#browser->name); #return->(insert: 'browser' = #browser->value->(get:1)); #return->(insert:'typecode' = #browser->value->(get:2)); // browser version local:'version' = #client_browser->(substring: #client_browser->(find: #browser->name) + #browser->name->size, 255); #version = (string_findregexp: #version, -find='\\d[^\\s;()\\]]*'); if: #version->size; #return->(insert: 'version' = #version->(get:1)); /if; loop_abort; /if; /iterate; /if; //------------------------------------------------------------------- // os //------------------------------------------------------------------- local:'os' = (array: 'windows' = 'Windows', 'win16' = 'Windows', 'win32' = 'Windows', 'win64' = 'Windows', 'win95' = 'Windows', 'win98' = 'Windows', 'winNT' = 'Windows', 'macintosh' = 'Macintosh', 'darwin' = 'Macintosh', 'panther' = 'Macintosh', 'leopard' = 'Macintosh', 'osx' = 'Macintosh', 'os x' = 'Macintosh', 'powerpc' = 'Macintosh', 'linux' = 'Linux', 'kanotix' = 'Linux', 'ubuntu' = 'Linux', 'mepis' = 'Linux', 'debian' = 'Linux', 'suse' = 'Linux', 'redhat' = 'Linux', 'red hat' = 'Linux', 'slackware' = 'Linux', 'mandrake' = 'Linux', 'gentoo' = 'Linux', 'fedora' = 'Linux', 'solaris' = 'Unix', 'unix' = 'Unix', 'bsd' = 'Unix', 'sun' = 'Unix', 'irix' = 'Unix', 'irix' = 'Unix', 'hpux' = 'Unix', 'hp-ux' = 'Unix', 'aix' = 'Unix', 'sco' = 'Unix', 'mpras' = 'Unix', 'reliant' = 'Unix', 'dec' = 'Unix', 'sinix' = 'Unix', 'palm' = 'PalmOS', 'nintendo' = 'Nintendo', 'wii' = 'Nintendo', 'playstation' = 'PlayStation', 'risc' = 'RISC OS', 'amiga' = 'Amiga', 'beos' = 'BeOS', 'os2' = 'OS/2', 'os/2' = 'OS/2', 'webtv' = 'WebTV', 'xbox' = 'Xbox', ); iterate: #os, local:'o'; if: #client_browser->(contains:#o->name); #return->(insert: 'os' = #o->value); loop_abort; /if; /iterate; //------------------------------------------------------------------- // if still unknown, see if it has a bot keyword //------------------------------------------------------------------- if: #return->(find:'typecode') == 'U' || #return->(find:'typecode') == ''; local: 'bots' = (array: 'agent', 'archive', 'bot', 'check', 'crawl', 'creep', 'feed', 'fetch', 'find', 'get', 'grub', 'index', 'info', 'leech', 'libwww', 'link', 'manage', 'proxy', 'robo', 'search', 'scrub', 'seek', 'siphon', 'site', 'slurp', 'spider', 'url', 'valid', 'worm', ); iterate: #bots, (local: 'bot'); if: #client_browser->(contains:#bot); #return->(insert:'browser' = 'Suspected Bot "'+#bot+'"'); #return->(insert:'typecode' = 'X'); loop_abort; /if; /iterate; /if; //------------------------------------------------------------------- // assign the type based on the typecode //------------------------------------------------------------------- select: #return->(find:'typecode'); case:'B'; #return->(insert:'type' = 'Browser'); case:'C'; #return->(insert:'type' = 'Link/Bookmark/Server Checker'); case:'D'; #return->(insert:'type' = 'Download/FTP tool'); case:'E'; #return->(insert:'type' = 'Email Reader'); case:'F'; #return->(insert:'type' = 'Feed Reader'); case:'L'; #return->(insert:'type' = 'Library'); case:'O'; #return->(insert:'type' = 'Offline Browsing'); case:'P'; #return->(insert:'type' = 'Proxy, Web filter'); case:'R'; #return->(insert:'type' = 'Robot/Crawler/Spider'); case:'S'; #return->(insert:'type' = 'Spam Harvester, Bad Bot'); case:'U'; #return->(insert:'type' = 'Unknown'); case:'V'; #return->(insert:'type' = 'HTML/CSS/JS Validator'); case:'X'; #return->(insert:'type' = 'Suspected Robot/Crawler/Spider'); case; #return->(insert:'type' = 'Unknown'); #return->(insert:'typecode' = 'U'); /select; return: #return; /define_tag; // browsers with user agents that begin with "mozilla/" !(global_defined:'_lp_client_browser_mozilla') ? (global:'_lp_client_browser_mozilla') = (array: // Gecko browsers 'iceweasel' = (:'Iceweasel','B'), 'flock' = (:'Flock','B'), 'epiphany' = (:'Epiphany','B'), 'beonex' = (:'Beonex','B'), 'camino' = (:'Camino','B'), 'chimera' = (:'Chimera','B'), 'galeon' = (:'Galeon','B'), 'k-meleon' = (:'K-Meleon','B'), 'k-ninja' = (:'K-Ninja','B'), 'kazehakase' = (:'Kazehakase','B'), 'kapiko' = (:'Kapiko','B'), 'iceape' = (:'Iceape','B'), 'multizilla' = (:'MultiZilla','B'), 'netscape' = (:'Netscape','B'), 'seamonkey' = (:'SeaMonkey','B'), 'bonecho' = (:'Firefox','B'), 'firebird' = (:'Firefox','B'), 'phoenix' = (:'Firefox','B'), 'granparadiso' = (:'Firefox','B'), 'minefield' = (:'Firefox','B'), 'firefox' = (:'Firefox','B'), // netscape and mozilla handled below // MSIE browsers 'america online' = (:'AOL','B'), 'aol' = (:'AOL','B'), 'opera' = (:'Opera','B'), 'avant' = (:'Avant','B'), 'crazy browser' = (:'Crazy Browser','B'), 'maxthon' = (:'Maxthon','B'), 'netcaptor' = (:'NetCaptor','B'), 'myie2' = (:'MyIE2','B'), // msie handled below // KHTML browsers 'konqueror' = (:'Konqueror','B'), 'shiira' = (:'Shiira','B'), 'omniweb' = (:'OmniWeb','B'), 'cheshire' = (:'Cheshire','B'), 'netnewswire' = (:'NetNewsWire','B'), 'sunrise' = (:'Sunrise','B'), 'chrome' = (:'Chrome','B'), 'safari' = (:'Safari','B'), // Other browsers 'icab' = (:'iCab','B'), 'oregano' = (:'Oregano','B'), 'amigavoyager' = (:'AmigaVoyager','B'), 'ibrowse' = (:'IBrowse','B'), // email readers 'thunderbird' = (:'Thunderbird','E'), 'Mnenhy' = (:'Mnenhy Thunderbird Plug-in','E'), // proxies 'BorderManager' = (:'Novell BorderManager','P'), // link checkers 'LinksManager.com' = (:'LinksManager.com','C'), 'www.euro-directory.com' = (:'www.euro-directory.com','C'), 'ZyBorg' = (:'ZyBorg','C'), // offline 'MSIECrawler' = (:'MSIE Offline Favorites','O'), // robots 'AbiLogicBot' = (:'AbiLogicBot','R'), 'AnyApexBot' = (:'AnyApexBot','R'), 'Arachmo' = (:'Arachmo','R'), 'Ask Jeeves' = (:'Ask Jeeves','R'), 'BecomeBot' = (:'BecomeBot','R'), 'B-l-i-t-z-B-O-T' = (:'BlitzBOT','R'), 'BlitzBOT' = (:'BlitzBOT','R'), 'B_L_I_T_Z_B_O_T' = (:'BlitzBOT','R'), 'Cerberian Drtrs' = (:'Cerberian Drtrs','R'), 'FDSE robot' = (:'FDSE robot','R'), 'Fluffy the spider' = (:'www.searchhippo.com','R'), 'FurlBot' = (:'FurlBot','R'), 'Girafabot' = (:'Girafabot','R'), 'Googlebot' = (:'Googlebot','R'), 'grub-client' = (:'grub.org','R'), 'HTTrack' = (:'HTTrack offline browser utility','O'), 'Larbin' = (:'Larbin','R'), 'MojeekBot' = (:'MojeekBot','R'), 'MuscatFerret' = (:'MuscatFerret','R'), 'scan4mail' = (:'scan4mail anti-spam tool','C'), 'Scrubby' = (:'Scrubby','R'), 'SEOChat::Bot' = (:'SEOChat::Bot','R'), 'Shoula robot' = (:'Shoula robot','R'), 'slurp@inktomi' = (:'inktomi.com','R'), 'Teoma' = (:'Ask Jeeves','R'), 'VoilaBot' = (:'VoilaBot','R'), 'Vonna.com' = (:'Vonna.com','R'), 'www.galaxy.com' = (:'Galaxy.com','R'), 'Yahoo! Slurp' = (:'Yahoo!','R'), 'YahooSeeker' = (:'Yahoo!','R'), 'Zealbot' = (:'Zealbot','R'), // spam bots 'Indy Library' = (:'Delphi/C++ library used mostly by Asian spammers','S'), ); // browsers with user agents that don't begin with "mozilla/" !(global_defined:'_lp_client_browser_other') ? (global:'_lp_client_browser_other') = (map: '!' = (array: '!Susie' = (:'!Susie','C'), ), '&' = (array: ' UnChaosBot' = (:'UnCHAOS search robot','R'), '