diff --git a/.gitignore b/.gitignore index 5cff269..ea93a8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules/ npm-debug.log +test-results/ .vscode diff --git a/index.html b/index.html index 8bba6bc..5e5c433 100644 --- a/index.html +++ b/index.html @@ -107,18 +107,6 @@ detected browser icon -
-
- - Engine -
-
-
-
-
- detected engine icon -
-
@@ -131,12 +119,24 @@ detected os icon
+
+
+ + CPU Architecture +
+
+
+
+
+ detected cpu icon +
+
- Device + Device Type
detected device type icon @@ -148,7 +148,7 @@
- Series + Vendor & Model
detected device vendor icon @@ -157,15 +157,53 @@
+
+
- - CPU + + Category
- detected cpu icon
-
+
+
+
+
+
+
+
+ + Engine +
+
+
+
+ +
+
+
+ + Bot +
+
+
+
+
+
+
+
+
+
+ + AI Crawler +
+
+
+
+
@@ -1382,13 +1420,13 @@ $ npx ua-parser-js "Flock/2.16 (Zenwalk 7.3; es_PR;)" >> log.txt
$29 (one-time)
-
1 License Per Project
+
1 End-Product per 1 License
  • Full detection features
  • npm & downloadable
  • Commercial usage rights
  • -
  • Limited deployment
  • +
  • 1 TLD per 1 license
  • 1 year support
  • Lifetime updates
@@ -1594,11 +1632,11 @@ $ npx ua-parser-js "Flock/2.16 (Zenwalk 7.3; es_PR;)" >> log.txt - Unlimited projects + Unlimited end-products - + @@ -1606,7 +1644,7 @@ $ npx ua-parser-js "Flock/2.16 (Zenwalk 7.3; es_PR;)" >> log.txt - + diff --git a/js/script.js b/js/script.js index 0f97b42..89d6238 100644 --- a/js/script.js +++ b/js/script.js @@ -11,7 +11,7 @@ $(document) $('#demo-result').transition('zoom', function () { if (result.browser.name) { var version = result.browser.version!==undefined?result.browser.version:'-'; - $('#browser-txt').html('' + result.browser.name + '' + version + ''); + $('#browser-txt').html('' + result.browser.name + '' + version + ''); $('#browser-img').attr('src', 'images/browsers/' + result.browser.name.toLowerCase() + '.png').on('error', function () { $(this).attr('src', 'images/browsers/default.png'); }); @@ -21,17 +21,17 @@ $(document) } if (result.engine.name) { var version = result.engine.version!==undefined?result.engine.version:'-'; - $('#engine-txt').html('' + result.engine.name + '' + version + ''); + $('#engine-txt').html('' + result.engine.name + '' + version + '');/* $('#engine-img').attr('src', 'images/engines/' + result.engine.name.toLowerCase() + '.png').on('error', function () { $(this).attr('src', 'images/engines/default.png'); - }); + });*/ } else { $('#engine-txt').text('-'); - $('#engine-img').attr('src', 'images/engines/default.png'); + //$('#engine-img').attr('src', 'images/engines/default.png'); } if (result.os.name) { var version = result.os.version!==undefined?result.os.version:'-'; - $('#os-txt').html('' + result.os.name + '' + version + ''); + $('#os-txt').html('' + result.os.name + '' + version + ''); $('#os-img').attr('src', 'images/os/' + result.os.name.toLowerCase() + '.png').on('error', function () { $(this).attr('src', 'images/os/default.png'); }); @@ -40,7 +40,7 @@ $(document) $('#os-img').attr('src', 'images/os/default.png'); } if (result.cpu.architecture) { - $('#cpu-txt').html('' + result.cpu.architecture + ''); + $('#cpu-txt').html('' + result.cpu.architecture + ''); $('#cpu-img').attr('src', 'images/cpu/' + result.cpu.architecture.toLowerCase() + '.png').on('error', function () { $(this).attr('src', 'images/cpu/default.png'); }); @@ -49,7 +49,7 @@ $(document) $('#cpu-img').attr('src', 'images/cpu/default.png'); } if (result.device.type) { - $('#type-txt').html('' + result.device.type + ''); + $('#type-txt').html('' + result.device.type + ''); $('#type-img').attr('src', 'images/types/' + result.device.type.toLowerCase() + '.png').on('error', function () { $(this).attr('src', 'images/types/default.png'); }); @@ -60,7 +60,7 @@ $(document) if (result.device.vendor || result.device.model) { var vendor = result.device.vendor!=undefined?result.device.vendor:'-'; var model = result.device.model!==undefined?result.device.model:'-'; - $('#device-txt').html('' + vendor + '' + model + ''); + $('#device-txt').html('' + vendor + '' + model + ''); if (result.device.vendor) { $('#device-img').attr('src', 'images/companies/' + result.device.vendor.toLowerCase() + '.png').on('error', function () { $(this).attr('src', 'images/companies/default.png'); @@ -72,10 +72,29 @@ $(document) $('#device-txt').text('-'); $('#device-img').attr('src', 'images/companies/default.png'); } + if(result.browser.type) { + $('#category-txt').html('' + result.browser.type + ''); + } else { + if (result.engine.name) { + $('#category-txt').html('browser'); + } else { + $('#category-txt').text('-'); + } + } + if (isBot(result)) { + $('#isbot-txt').text('✅'); + } else { + $('#isbot-txt').text('-') + } + if (isAIBot(result)) { + $('#isaibot-txt').text('✅'); + } else { + $('#isaibot-txt').text('-'); + } /* if (result.gpu.vendor) { var vendor = result.gpu.vendor!=undefined?result.gpu.vendor:'-'; var model = result.gpu.model!==undefined?result.gpu.model:'-'; - $('#gpu-txt').html('' + vendor + '' + model + ''); + $('#gpu-txt').html('' + vendor + '' + model + ''); $('#gpu-img').attr('src', 'images/companies/' + result.gpu.vendor.toLowerCase() + '.png').on('error', function () { $(this).attr('src', 'images/companies/default.png'); }); @@ -97,9 +116,9 @@ $(document) if (qs) { $('#ua-txt-info').html('What your browser tells you = 😵‍💫💢 😭💸 Complex Costly Expensive'); $('#demo-result').get(0).scrollIntoView(); - updateDemo(UAParser(qs)); + updateDemo(UAParser(qs, [CLIs, Crawlers, Fetchers, Libraries, InApps])); } else { - (UAParser().withFeatureCheck()).withClientHints().then(function(result) { + (UAParser([CLIs, Crawlers, Fetchers, Libraries, InApps]).withFeatureCheck()).withClientHints().then(function(result) { updateDemo(result); }); } diff --git a/js/ua-parser.js b/js/ua-parser.js index 94f5cc5..8f682e4 100644 --- a/js/ua-parser.js +++ b/js/ua-parser.js @@ -1,4 +1,12 @@ -/* UAParser.js v2.0.4 +// Helpers + +(function(){window.isBot=function(o){return/(cli|library|crawler|fetcher)/.exec(o.browser.type)};var o=["ai2bot","amazonbot","anthropic-ai","claude-web","claude-searchbot","claudebot","applebot","applebot-extended","bravebot","bytespider","tiktokspider","cohere-training-data-crawler","ccbot","coveobot","dataforseobot","deepseekbot","diffbot","googleother","googleother-image","googleother-video","google-cloudvertexbot","google-extended","imagesiftbot","petalbot","pangubot","huggingface-bot","kangaroo bot","firecrawlagent","facebookbot","meta-externalagent","gptbot","oai-searchbot","perplexitybot","replicate-bot","runpod-bot","sbintuitionsbot","semrushbot-ocob","timpibot","together-bot","velenpublicwebcrawler","v0bot","omgili","omgilibot","webzio-extended","xai-bot","youbot","chatglm-spider"];window.isAIBot=function(e){return-1!==o.indexOf(String(e.browser.name).toLowerCase())}})(); + +// Extension + +(function(){var MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",MOBILE="mobile",TABLET="tablet",CRAWLER="crawler",CLI="cli",EMAIL="email",FETCHER="fetcher",INAPP="inapp",MEDIAPLAYER="mediaplayer",LIBRARY="library";window.CLIs={browser:[[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i],[NAME,VERSION,[TYPE,CLI]]]};window.Crawlers={browser:[[/((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|yep)bot)\/([\w\.-]+)/i,/(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,/(applebot(?:-extended)?)\/?([\w\.]*)/i,/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,/(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,/(coccocbot-(?:image|web))\/([\w\.]+)/i,/(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,/(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\/?([\w\.]*)/i,/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,/(oncrawl) mobile\/([\w\.]+)/i,/(qwantbot)[-\w]*\/?([\w\.]*)/i,/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,/(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,/(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i,/(yeti)\/([\w\.]+)/i,/((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i],[NAME,VERSION,[TYPE,CRAWLER]],[/(yandexbot\/([\w\.]+); mirrordetector)/i],[[NAME,/\/.+;/gi,""],VERSION,[TYPE,CRAWLER]],[/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,/\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i],[NAME,[TYPE,CRAWLER]]]};window.ExtraDevices={device:[[/(nook)[\w ]+build\/(\w+)/i,/(dell) (strea[kpr\d ]*[\dko])/i,/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,/(trinity)[- ]*(t\d{3}) bui/i,/(gigaset)[- ]+(q\w{1,9}) bui/i,/(vodafone) ([\w ]+)(?:\)| bui)/i],[VENDOR,MODEL,[TYPE,TABLET]],[/(u304aa)/i],[MODEL,[VENDOR,"AT&T"],[TYPE,MOBILE]],[/\bsie-(\w*)/i],[MODEL,[VENDOR,"Siemens"],[TYPE,MOBILE]],[/\b(rct\w+) b/i],[MODEL,[VENDOR,"RCA"],[TYPE,TABLET]],[/\b(venue[\d ]{2,7}) b/i],[MODEL,[VENDOR,"Dell"],[TYPE,TABLET]],[/\b(q(?:mv|ta)\w+) b/i],[MODEL,[VENDOR,"Verizon"],[TYPE,TABLET]],[/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i],[MODEL,[VENDOR,"Barnes & Noble"],[TYPE,TABLET]],[/\b(tm\d{3}\w+) b/i],[MODEL,[VENDOR,"NuVision"],[TYPE,TABLET]],[/\b(k88) b/i],[MODEL,[VENDOR,"ZTE"],[TYPE,TABLET]],[/\b(nx\d{3}j) b/i],[MODEL,[VENDOR,"ZTE"],[TYPE,MOBILE]],[/\b(gen\d{3}) b.+49h/i],[MODEL,[VENDOR,"Swiss"],[TYPE,MOBILE]],[/\b(zur\d{3}) b/i],[MODEL,[VENDOR,"Swiss"],[TYPE,TABLET]],[/^((zeki)?tb.*\b) b/i],[MODEL,[VENDOR,"Zeki"],[TYPE,TABLET]],[/\b([yr]\d{2}) b/i,/\b(?:dragon[- ]+touch |dt)(\w{5}) b/i],[MODEL,[VENDOR,"Dragon Touch"],[TYPE,TABLET]],[/\b(ns-?\w{0,9}) b/i],[MODEL,[VENDOR,"Insignia"],[TYPE,TABLET]],[/\b((nxa|next)-?\w{0,9}) b/i],[MODEL,[VENDOR,"NextBook"],[TYPE,TABLET]],[/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i],[[VENDOR,"Voice"],MODEL,[TYPE,MOBILE]],[/\b(lvtel\-)?(v1[12]) b/i],[[VENDOR,"LvTel"],MODEL,[TYPE,MOBILE]],[/\b(ph-1) /i],[MODEL,[VENDOR,"Essential"],[TYPE,MOBILE]],[/\b(v(100md|700na|7011|917g).*\b) b/i],[MODEL,[VENDOR,"Envizen"],[TYPE,TABLET]],[/\b(trio[-\w\. ]+) b/i],[MODEL,[VENDOR,"MachSpeed"],[TYPE,TABLET]],[/\btu_(1491) b/i],[MODEL,[VENDOR,"Rotor"],[TYPE,TABLET]]]};window.Emails={browser:[[/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,/(mail)\/([\w\.]+) cf/i],[NAME,VERSION,[TYPE,EMAIL]],[/zdesktop\/([\w\.]+)/i],[VERSION,[NAME,"Zimbra"],[TYPE,EMAIL]]]};window.Fetchers={browser:[[/(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i,/(bluesky) cardyb\/([\w\.]+)/i,/(skypeuripreview) preview\/([\w\.]+)/i,/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,/(whatsapp)\/([\w\.]+)/i],[NAME,VERSION,[TYPE,FETCHER]],[/((?:better uptime |telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i],[NAME,[TYPE,FETCHER]]]};window.InApps={browser:[[/\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,/(flipboard)\/([\w\.]+)/i],[NAME,VERSION,[TYPE,INAPP]],[/(evernote) win/i,/(teams)mobile-(ios|and)/i],[NAME,[TYPE,INAPP]],[/chatlyio\/([\d\.]+)/i],[VERSION,[NAME,"Slack"],[TYPE,INAPP]],[/ultralite app_version\/([\w\.]+)/i],[VERSION,[NAME,"TikTok Lite"],[TYPE,INAPP]],[/\) code\/([\d\.]+).+electron\//i],[VERSION,[NAME,"VS Code"],[TYPE,INAPP]],[/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i],[VERSION,[NAME,"Yahoo! Japan"],[TYPE,INAPP]]]};window.MediaPlayers={browser:[[/(apple(?:coremedia|tv))\/([\w\._]+)/i,/(coremedia) v([\w\._]+)/i,/(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,/^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\/([\w\.-]+)/i,/(lg player|nexplayer) ([\d\.]+)/i,/player\/(nexplayer|lg player) ([\w\.-]+)/i,/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i,/(htc streaming player) [\w_]+ \/ ([\d\.]+)/i,/(lavf)([\d\.]+)/i,/(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,/ (songbird)\/([\w\.-]+)/i,/(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i,/(vlc)(?:\/| media player - version )([\w\.-]+)/i,/^(foobar2000|itunes|smp)\/([\d\.]+)/i,/com\.(riseupradioalarm)\/([\d\.]*)/i,/(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i,/(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i],[NAME,VERSION,[TYPE,MEDIAPLAYER]],[/(flrp)\/([\w\.-]+)/i],[[NAME,"Flip Player"],VERSION,[TYPE,MEDIAPLAYER]],[/(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i],[NAME,[TYPE,MEDIAPLAYER]],[/(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i],[[NAME,/[_-]/g," "],VERSION,[TYPE,MEDIAPLAYER]],[/(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i],[[NAME,"rad.io"],VERSION,[TYPE,MEDIAPLAYER]]]};window.Libraries={browser:[[/^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i,/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,/(nutch)-([\w\.-]+)(\(|$)/i,/\((java)\/([\w\.]+)/i],[NAME,VERSION,[TYPE,LIBRARY]]]};window.Vehicles={device:[[/aftlbt962e2/i],[[VENDOR,"BMW"]],[/dilink.+(byd) auto/i],[VENDOR],[/aftlft962x3/i],[[VENDOR,"Jeep"],[MODEL,"Wagooner"]],[/(rivian) (r1t)/i],[VENDOR,MODEL],[/vcc.+netfront/i],[[VENDOR,"Volvo"]]]};})(); + +/* UAParser.js v2.0.5 Copyright © 2012-2025 Faisal Salman AGPLv3 License */ -((i,l)=>{function I(i){for(var e={},t=0;t{var t,o={},r=e;if(!Ti(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(Pi,e):Pi,M.call(this,[["getBrowser",(n=function(i){return i==g?function(){return new Gi(i,r,s,a).set("ua",r).set(u,this.getBrowser()).set(h,this.getCPU()).set(p,this.getDevice()).set(m,this.getEngine()).set(f,this.getOS()).get()}:function(){return new Gi(i,r,s[i],a).parseUA().get()}})(u)],["getCPU",n(h)],["getDevice",n(p)],["getEngine",n(m)],["getOS",n(f)],["getResult",n(g)],["getUA",function(){return r}],["setUA",function(i){return O(i)&&(r=i.length>U?Mi(i,U):i),this}]]).setUA(r),this):new V(i,e,t).getResult()}V.VERSION="2.0.4",V.BROWSER=I([v,y,G,k]),V.CPU=I([C]),V.DEVICE=I([S,x,k,W,_,e,r,t,F]),V.ENGINE=V.OS=I([v,y]),typeof exports!==n?(exports=typeof module!==n&&module.exports?module.exports=V:exports).UAParser=V:typeof define===R&&define.amd?define(function(){return V}):qi&&(i.UAParser=V);var Wi,Ni=qi&&(i.jQuery||i.Zepto);Ni&&!Ni.ua&&(Wi=new V,Ni.ua=Wi.getResult(),Ni.ua.get=function(){return Wi.getUA()},Ni.ua.set=function(i){Wi.setUA(i);var e,t=Wi.getResult();for(e in t)Ni.ua[e]=t[e]})})("object"==typeof window?window:this); \ No newline at end of file +(function(i,c){function V(i){for(var e={},t=0;tI?Mi(i,I):i),this}]]).setUA(s),this):new P(i,e,t).getResult()}P.VERSION="2.0.5",P.BROWSER=V([v,y,G,k]),P.CPU=V([C]),P.DEVICE=V([S,x,k,W,_,e,r,t,F]),P.ENGINE=P.OS=V([v,y]),typeof exports!==n?(exports=typeof module!==n&&module.exports?module.exports=P:exports).UAParser=P:typeof define===L&&define.amd?define(function(){return P}):_i&&(i.UAParser=P);var Wi,Ni=_i&&(i.jQuery||i.Zepto);Ni&&!Ni.ua&&(Wi=new P,Ni.ua=Wi.getResult(),Ni.ua.get=function(){return Wi.getUA()},Ni.ua.set=function(i){Wi.setUA(i);var e,t=Wi.getResult();for(e in t)Ni.ua[e]=t[e]})})("object"==typeof window?window:this); \ No newline at end of file