diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..706fd07 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +.vscode diff --git a/README.md b/README.md index 0ea136d..ee47574 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Installation The recommended way to install device detector ``` -go get github.com/gamebtc/devicedetector +go get -u github.com/slipros/devicedetector ``` Examples @@ -25,10 +25,13 @@ import ( "fmt" "log" - . "github.com/gamebtc/devicedetector" + . "github.com/slipros/devicedetector" ) func main() { + // switch to use embedded regexes + // parser.ReadFile = devicedetector.EmbeddedRegexes.ReadFile + dd, err := NewDeviceDetector("regexes") if err != nil { log.Fatal(err) @@ -65,26 +68,6 @@ func main() { } ``` -## Tests - -go test - -### Running tests - -``` -cd devicedetector -go test - -cd devicedetector/parser -go test - -cd devicedetector/parser/client -go test - -cd devicedetector/parser/device -go test -``` - ## Device Detector for other languages There are already a few ports of this tool to other languages: @@ -96,51 +79,49 @@ There are already a few ports of this tool to other languages: - **Crystal** https://github.com/creadone/device_detector - **Elixir** https://github.com/elixir-inspector/ua_inspector - **Java** https://github.com/mngsk/device-detector -- **Go** https://github.com/gamebtc/devicedetector - ## What Device Detector is able to detect The lists below are auto generated and updated from time to time. Some of them might not be complete. -*Last update: 2020/05/10* +*Last update: 2024/11/17* ### List of detected operating systems: -AIX, Android, AmigaOS, Apple TV, Arch Linux, BackTrack, Bada, BeOS, BlackBerry OS, BlackBerry Tablet OS, Brew, CentOS, Chrome OS, CyanogenMod, Debian, DragonFly, Fedora, Firefox OS, Fire OS, FreeBSD, Gentoo, Google TV, HP-UX, Haiku OS, IRIX, Inferno, KaiOS, Knoppix, Kubuntu, GNU/Linux, Lubuntu, VectorLinux, Mac, Maemo, Mandriva, MeeGo, MocorDroid, Mint, MildWild, MorphOS, NetBSD, MTK / Nucleus, Nintendo, Nintendo Mobile, OS/2, OSF1, OpenBSD, Ordissimo, PlayStation Portable, PlayStation, Red Hat, RISC OS, Remix OS, RazoDroiD, Sabayon, SUSE, Sailfish OS, Slackware, Solaris, Syllable, Symbian, Symbian OS, Symbian OS Series 40, Symbian OS Series 60, Symbian^3, ThreadX, Tizen, TmaxOS, Ubuntu, WebTV, Windows, Windows CE, Windows IoT, Windows Mobile, Windows Phone, Windows RT, Xbox, Xubuntu, YunOs, iOS, palmOS, webOS +AIX, Android, Android TV, Alpine Linux, Amazon Linux, AmigaOS, Armadillo OS, AROS, tvOS, Arch Linux, AOSC OS, ASPLinux, Azure Linux, BackTrack, Bada, Baidu Yi, BeOS, BlackBerry OS, BlackBerry Tablet OS, blackPanther OS, Bliss OS, Brew, BrightSignOS, Caixa Mágica, CentOS, CentOS Stream, Clear Linux OS, ClearOS Mobile, Chrome OS, Chromium OS, China OS, CyanogenMod, Debian, Deepin, DragonFly, DVKBuntu, ElectroBSD, EulerOS, Fedora, Fenix, Firefox OS, Fire OS, Foresight Linux, Freebox, FreeBSD, FRITZ!OS, FydeOS, Fuchsia, Gentoo, GENIX, GEOS, gNewSense, GridOS, Google TV, HP-UX, Haiku OS, iPadOS, HarmonyOS, HasCodingOS, HELIX OS, IRIX, Inferno, Java ME, Joli OS, KaiOS, Kali, Kanotix, KIN OS, Knoppix, KreaTV, Kubuntu, GNU/Linux, LeafOS, LindowsOS, Linspire, Lineage OS, Liri OS, Loongnix, Lubuntu, Lumin OS, LuneOS, VectorLinux, Mac, Maemo, Mageia, Mandriva, MeeGo, MocorDroid, moonOS, Motorola EZX, Mint, MildWild, MorphOS, NetBSD, MTK / Nucleus, MRE, NeXTSTEP, NEWS-OS, Nintendo, Nintendo Mobile, Nova, OS/2, OSF1, OpenBSD, OpenVMS, OpenVZ, OpenWrt, Opera TV, Oracle Linux, Ordissimo, Pardus, PCLinuxOS, PICO OS, Plasma Mobile, PlayStation Portable, PlayStation, Proxmox VE, Puffin OS, PureOS, Qtopia, Raspberry Pi OS, Raspbian, Red Hat, Red Star, RedOS, Revenge OS, risingOS, RISC OS, Rocky Linux, Roku OS, Rosa, RouterOS, Remix OS, Resurrection Remix OS, REX, RazoDroiD, Sabayon, SUSE, Sailfish OS, Scientific Linux, SeewoOS, SerenityOS, Sirin OS, Slackware, Solaris, Star-Blade OS, Syllable, Symbian, Symbian OS, Symbian OS Series 40, Symbian OS Series 60, Symbian^3, TencentOS, ThreadX, Tizen, TiVo OS, TmaxOS, Turbolinux, Ubuntu, ULTRIX, UOS, VIDAA, ViziOS, watchOS, Wear OS, WebTV, Whale OS, Windows, Windows CE, Windows IoT, Windows Mobile, Windows Phone, Windows RT, WoPhone, Xbox, Xubuntu, YunOS, Zenwalk, ZorinOS, iOS, palmOS, Webian, webOS ### List of detected browsers: -115 Browser, 2345 Browser, 360 Phone Browser, 360 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Desktop, AOL Shield, Arora, Arctic Fox, Amiga Voyager, Amiga Aweb, Atom, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Brave, BriskBard, BrowseX, Camino, CCleaner, Centaury, Coc Coc, Colibri, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, ChromePlus, Chromium, Cyberfox, Cheshire, Crusta, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, Delta Browser, Dolphin, Dorado, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, Elements Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Firefox Mobile, Fireweb, Fireweb Navigator, FreeU, Galeon, Glass Browser, Google Earth, Hawk Turbo Browser, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Jasmine, Jig Browser, Jig Browser Plus, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Light, Links, Lovense Browser, LuaKit, Lulumi, Lunascape, Lunascape Lite, Lynx, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, Mypal, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odyssey Web Browser, Off By One, OhHai Browser, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Ordissimo, Oregano, Origin In-Game Overlay, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Polypane, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Phoenix, Polaris, Polarity, Microsoft Edge, QQ Browser Mini, QQ Browser, Qutebrowser, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, SEMC-Browser, Sogou Explorer, Safari, Safe Exam Browser, SalamWeb, Shiira, SimpleBrowser, Sizzy, Skyfire, Seraphic Sraf, Sleipnir, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, surf, START Internet Browser, Steam In-Game Overlay, Streamy, Swiftfox, Seznam Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, Tungsten, ToGate, TweakStyle, TV Bro, UBrowser, UC Browser, UC Browser Mini, UC Browser Turbo, Uzbl, Vivaldi, vivo Browser, Vision Mobile Browser, VMware AirWatch, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yahoo! Japan Browser, Yandex Browser, Yandex Browser Lite, Xiino, Xvast +Via, Pure Mini Browser, Pure Lite Browser, Raise Fast Browser, Rabbit Private Browser, Fast Browser UC Lite, Fast Explorer, Lightning Browser, Cake Browser, IE Browser Fast, Vegas Browser, OH Browser, OH Private Browser, XBrowser Mini, Sharkee Browser, Lark Browser, Pluma, Anka Browser, Azka Browser, Dragon Browser, Easy Browser, Dark Web Browser, Dark Browser, 18+ Privacy Browser, 115 Browser, 1DM Browser, 1DM+ Browser, 2345 Browser, 360 Secure Browser, 360 Phone Browser, 7654 Browser, Avant Browser, ABrowse, Acoo Browser, AdBlock Browser, Adult Browser, Ai Browser, Airfind Secure Browser, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, ALVA, Amaya, Amaze Browser, Amerigo, Amigo, Android Browser, AOL Explorer, AOL Desktop, AOL Shield, AOL Shield Pro, Aplix, AppBrowzer, AppTec Secure Browser, APUS Browser, Arora, Arctic Fox, Amiga Voyager, Amiga Aweb, APN Browser, Arachne, Arc Search, Armorfly Browser, Arvin, Ask.com, Asus Browser, Atom, Atomic Web Browser, Atlas, Avast Secure Browser, AVG Secure Browser, Avira Secure Browser, AwoX, Awesomium, Basic Web Browser, Beaker Browser, Beamrise, BF Browser, BlackBerry Browser, Bluefy, BrowseHere, Browser Hup Pro, Baidu Browser, Baidu Spark, Bang, Bangla Browser, Basilisk, Belva Browser, Beyond Private Browser, Beonex, Berry Browser, Bitchute Browser, BizBrowser, BlackHawk, Bloket, Bunjalloo, B-Line, Black Lion Browser, Blue Browser, Bonsai, Borealis Navigator, Brave, BriskBard, BroKeep Browser, Browspeed Browser, BrowseX, Browzar, Browlser, Browser Mini, BrowsBit, Biyubi, Byffox, BXE Browser, Camino, Catalyst, Catsxp, Cave Browser, CCleaner, CG Browser, ChanjetCloud, Chedot, Cherry Browser, Centaury, Cliqz, Coc Coc, CoolBrowser, Colibri, Columbus Browser, Comodo Dragon, Coast, Charon, CM Browser, CM Mini, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, Chowbo, Classilla, CoolNovo, Colom Browser, CometBird, Comfort Browser, COS Browser, Cornowser, Chim Lac, ChromePlus, Chromium, Chromium GOST, Cyberfox, Cheshire, Cromite, Crow Browser, Crusta, Craving Explorer, Crazy Browser, Cunaguaro, Chrome Webview, CyBrowser, dbrowser, Peeps dBrowser, Dark Web, Dark Web Private, Debuggable Browser, Decentr, Deepnet Explorer, deg-degan, Deledao, Delta Browser, Desi Browser, DeskBrowse, Dezor, Diigo Browser, DoCoMo, Dolphin, Dolphin Zero, Dorado, Dot Browser, Dooble, Dillo, DUC Browser, DuckDuckGo Privacy Browser, East Browser, Ecosia, Edge WebView, Every Browser, Epic, Elinks, EinkBro, Element Browser, Elements Browser, Eolie, Explore Browser, eZ Browser, EudoraWeb, EUI Browser, GNOME Web, G Browser, Espial TV Browser, fGet, Falkon, Faux Browser, Fire Browser, Fiery Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Firefox Klar, Float Browser, Flock, Floorp, Flow, Flow Browser, Firefox Mobile, Fireweb, Fireweb Navigator, Flash Browser, Flast, Flyperlink, FOSS Browser, FreeU, Freedom Browser, Frost, Frost+, Fulldive, Galeon, Gener8, Ghostery Privacy Browser, GinxDroid Browser, Glass Browser, Godzilla Browser, Good Browser, Google Earth, Google Earth Pro, GOG Galaxy, GoBrowser, GoKu, GO Browser, GreenBrowser, Habit Browser, Halo Browser, Harman Browser, HasBrowser, Hawk Turbo Browser, Hawk Quick Browser, Helio, Hexa Web Browser, Hi Browser, hola! Browser, Holla Web Browser, HotBrowser, HotJava, HONOR Browser, HTC Browser, Huawei Browser Mobile, Huawei Browser, HUB Browser, iBrowser, iBrowser Mini, IBrowse, iDesktop PC Browser, iCab, iCab Mobile, iNet Browser, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, IVVI Browser, Iceweasel, Impervious Browser, Incognito Browser, Inspect Browser, Insta Browser, Internet Explorer, Internet Browser Secure, Internet Webbrowser, Intune Managed Browser, Indian UC Mini Browser, InBrowser, Involta Go, IE Mobile, Iron, Japan Browser, Jasmine, JavaFX, Jelly, Jig Browser, Jig Browser Plus, JioSphere, JUZI Browser, K.Browser, Keepsafe Browser, KeepSolid Browser, Kids Safe Browser, Kindle Browser, K-meleon, K-Ninja, Konqueror, Kapiko, Keyboard Browser, Kinza, Kitt, Kiwi, Kode Browser, KUN, KUTO Mini Browser, Kylo, Kazehakase, Cheetah Browser, Ladybird, Lagatos Browser, Legan Browser, Lexi Browser, Lenovo Browser, LieBaoFast, LG Browser, Light, Lightning Browser Plus, Lilo, Links, Liri Browser, LogicUI TV Browser, Lolifox, Lotus, Lovense Browser, LT Browser, LuaKit, LUJO TV Browser, Lulumi, Lunascape, Lunascape Lite, Lynx, Lynket Browser, Mandarin, MarsLab Web Browser, MaxBrowser, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Me Browser, Mobile Safari, Midori, Midori Lite, MixerBox AI, Mobicip, Mi Browser, Mobile Silk, Mogok Browser, Motorola Internet Browser, Minimo, Mint Browser, Maxthon, MaxTube Browser, Maelstrom, Mises, Mmx Browser, MxNitro, Mypal, Monument Browser, MAUI WAP Browser, Naenara Browser, Navigateur Web, Naked Browser, Naked Browser Pro, NFS Browser, Ninetails, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Norton Private Browser, Nox Browser, NOMone VR Browser, NOOK Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NextWord Browser, Ninesky, NTENT Browser, Nuanti Meta, Nuviu, Ocean Browser, Oculus Browser, Odd Browser, Opera Mini iOS, Obigo, Odin, Odin Browser, OceanHero, Odyssey Web Browser, Off By One, Office Browser, OhHai Browser, OnBrowser Lite, ONE Browser, Onion Browser, ONIONBrowser, Opera Crypto, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Orbitum, Orca, Ordissimo, Oregano, Origin In-Game Overlay, Origyn Web Browser, OrNET Browser, Openwave Mobile Browser, OpenFin, Open Browser, Open Browser 4U, Open Browser fast 5G, Open Browser Lite, Open TV Browser, OmniWeb, Otter Browser, Owl Browser, OJR Browser, Palm Blazer, Pale Moon, Polypane, Prism, Oppo Browser, Opus Browser, Palm Pre, Puffin Cloud Browser, Puffin Incognito Browser, Puffin Secure Browser, Puffin Web Browser, Palm WebPro, Palmscape, Pawxy, Peach Browser, Perfect Browser, Perk, Phantom.me, Phantom Browser, Phoenix, Phoenix Browser, Photon, Pintar Browser, PirateBrowser, PICO Browser, PlayFree Browser, PocketBook Browser, Polaris, Polarity, PolyBrowser, Presearch, Privacy Browser, PrivacyWall, Privacy Explorer Fast Safe, Privacy Pioneer Browser, Private Internet Browser, Proxy Browser, Proxyium, Proxynet, ProxyFox, ProxyMax, Pi Browser, PronHub Browser, PSI Secure Browser, Reqwireless WebViewer, Roccat, Microsoft Edge, Qazweb, Qiyu, QJY TV Browser, Qmamu, Quick Search TV, QQ Browser Lite, QQ Browser Mini, QQ Browser, Quick Browser, Qutebrowser, Quark, QupZilla, Qwant Mobile, QtWeb, QtWebEngine, Rakuten Browser, Rakuten Web Search, Raspbian Chromium, RCA Tor Explorer, Realme Browser, Rekonq, RockMelt, Roku Browser, Samsung Browser, Samsung Browser Lite, Sailfish Browser, SberBrowser, Seewo Browser, SEMC-Browser, Sogou Explorer, Sogou Mobile Browser, SOTI Surf, Soul Browser, Soundy Browser, Safari, Safari Technology Preview, Safe Exam Browser, SalamWeb, Savannah Browser, SavySoda, Secure Browser, SFive, Shiira, Sidekick, SimpleBrowser, SilverMob US, Singlebox, Sizzy, Skye, Skyfire, SkyLeap, Seraphic Sraf, SiteKiosk, Sleipnir, SlimBoat, Slimjet, SP Browser, Sony Small Browser, Secure Private Browser, SecureX, Stampy Browser, 7Star, Smart Browser, Smart Search & Web Browser, Smart Lenovo Browser, Smooz, Snowshoe, Spark, Spectre Browser, Splash, Sputnik Browser, Sunrise, Sunflower Browser, SuperBird, Super Fast Browser, SuperFast Browser, Sushi Browser, surf, Surf Browser, Surfy Browser, Stargon, START Internet Browser, Stealth Browser, Steam In-Game Overlay, Streamy, Swiftfox, Swiftweasel, Seznam Browser, Sweet Browser, SX Browser, T+Browser, T-Browser, t-online.de Browser, TalkTo, Tao Browser, tararia, Thor, Tor Browser, TenFourFox, Tenta Browser, Tesla Browser, Tizen Browser, Tint Browser, TrueLocation Browser, TUC Mini Browser, TUSK, Tungsten, ToGate, Total Browser, TQ Browser, TweakStyle, TV Bro, TV-Browser Internet, U Browser, UBrowser, UC Browser, UC Browser HD, UC Browser Mini, UC Browser Turbo, Ui Browser Mini, UPhone Browser, UR Browser, Uzbl, Ume Browser, vBrowser, Vast Browser, VD Browser, Veera, Venus Browser, Vewd Browser, VibeMate, Nova Video Downloader Pro, Viasat Browser, Vivaldi, vivo Browser, Vivid Browser Mini, Vision Mobile Browser, Vertex Surf, VMware AirWatch, VMS Mosaic, Vonkeror, Vuhuv, Wear Internet Browser, Web Explorer, Web Browser & Explorer, Webian Shell, WebDiscover, WebPositive, Weltweitimnetz Browser, Wexond, Waterfox, Wave Browser, Wavebox, Whale Browser, Whale TV Browser, wOSBrowser, w3m, WeTab Browser, World Browser, Wolvic, Wukong Browser, Wyzo, YAGI, Yahoo! Japan Browser, Yandex Browser, Yandex Browser Corp, Yandex Browser Lite, Yaani Browser, Yo Browser, Yolo Browser, YouCare, YouBrowser, Yuzu Browser, xBrowser, MMBOX XBrowser, X Browser Lite, X-VPN, xBrowser Pro Super Fast, XNX Browser, XtremeCast, xStand, Xiino, XnBrowse, Xooloo Internet, Xvast, Zetakey, Zvu, Zirco Browser, Zordo Browser, ZTE Browser ### List of detected browser engines: -WebKit, Blink, Trident, Text-based, Dillo, iCab, Elektra, Presto, Gecko, KHTML, NetFront, Edge, NetSurf, Servo, Goanna +WebKit, Blink, Trident, Text-based, Dillo, iCab, Elektra, Presto, Clecko, Gecko, KHTML, NetFront, Edge, NetSurf, Servo, Goanna, EkiohFlow, Arachne, LibWeb ### List of detected libraries: -aiohttp, curl, Faraday, Go-http-client, Google HTTP Java Client, Guzzle (PHP HTTP Client), HTTPie, HTTP_Request2, Java, libdnf, Mechanize, Node Fetch, OkHttp, Perl, Perl REST::Client, Python Requests, Python urllib, REST Client for Ruby, RestSharp, ScalaJ HTTP, urlgrabber (yum), Wget, WWW-Mechanize +aiohttp, Akka HTTP, Android License Verification Library, AnyEvent HTTP, Apache HTTP Client, Aria2, Artifactory, Axios, Azure Data Factory, Babashka HTTP Client, Boto3, Buildah, BuildKit, C++ REST SDK, CakePHP, CarrierWave, Containerd, containers, cPanel HTTP Client, cpp-httplib, cri-o, curl, Cypress, Dart, Deno, docker, Down, Electron Fetch, Emacs, Embarcadero URI Client, ESP32 HTTP Client, Faraday, fasthttp, ffmpeg, FFUF, FileDownloader, Free Download Manager, GeoIP Update, git-annex, go-container registry, Go-http-client, Google HTTP Java Client, got, GRequests, gRPC-Java, GStreamer, Guzzle (PHP HTTP Client), gvfs, hackney, Harbor registry client, Helm, HTML Parser, http.rb, HTTP:Tiny, HTTPie, httplib2, httprs, HTTPX, HTTP_Request2, ICAP Client, Insomnia REST Client, iOS Application, IPinfo, Jakarta Commons HttpClient, Jaunt, Java, Java HTTP Client, jsdom, KaiOS Downloader, Kiwi TCMS, Kiwi TCMS API, libdnf, libpod, libsoup, Libsyn, LUA OpenResty NGINX, Mandrill PHP, Mechanize, Mikrotik Fetch, Msray-Plus, Node Fetch, OKDownload Library, OkHttp, Open Build Service, Pa11y, Perl, Perl REST::Client, PhantomJS, PHP cURL Class, Podgrab, Postman Desktop, PRDownloader, Python Requests, Python urllib, QbHttp, quic-go, r-curl, Radio Downloader, ReactorNetty, req, request, Requests, reqwest, REST Client for Ruby, RestSharp, Resty, resty-requests, ruby, Safari View Service, ScalaJ HTTP, Skopeo, SlimerJS, Slim Framework, Stealer, superagent, Symfony, Typhoeus, uclient-fetch, Ultimate Sitemap Parser, undici, Unirest for Java, urlgrabber (yum), uTorrent, Wget, Windows HTTP, WinHttp WinHttpRequest, WWW-Mechanize, XML-RPC ### List of detected media players: -Audacious, Banshee, Boxee, Clementine, Deezer, FlyCast, Foobar2000, Google Podcasts, iTunes, Kodi, MediaMonkey, Miro, mpv, Music Player Daemon, NexPlayer, Nightingale, QuickTime, Songbird, Stagefright, SubStream, VLC, Winamp, Windows Media Player, XBMC +Alexa, Amarok, Audacious, Banshee, Boxee, Clementine, Deezer, DIGA, Downcast, FlyCast, Foobar2000, foobar2000, Google Podcasts, HTC Streaming Player, Hubhopper, iTunes, JHelioviewer, JRiver Media Center, Juice, Just Audio, Kasts, Kodi, MediaMonkey, Miro, MixerBox, MPlayer, mpv, MusicBee, Music Player Daemon, NexPlayer, Nightingale, QuickTime, Songbird, SONOS, Sony Media Go, Stagefright, StudioDisplay, SubStream, VLC, Winamp, Windows Media Player, XBMC, Xtream Player, YouView ### List of detected mobile apps: -AndroidDownloadManager, AntennaPod, Apple News, Baidu Box App, BeyondPod, BingWebApp, bPod, CastBox, Castro, Castro 2, CrosswalkApp, DoggCatcher, douban App, Facebook, Facebook Messenger, FeedR, Flipboard App, Google Go, Google Play Newsstand, Google Plus, Google Search App, iCatcher, Instacast, Instagram App, Line, NewsArticle App, Overcast, Pinterest, Player FM, Pocket Casts, Podcast & Radio Addict, Podcast Republic, Podcasts, Podcat, Podcatcher Deluxe, Podkicker, RSSRadio, Sina Weibo, Snapchat, SogouSearch App, tieba, TopBuzz, Twitter, WeChat, WhatsApp, Yahoo! Japan, Yelp Mobile, YouTube and *mobile apps using [AFNetworking](https://github.com/AFNetworking/AFNetworking)* +'sodes, +Simple, 1Password, 2tch, ActionExtension, Adobe Acrobat Reader, Adobe Creative Cloud, Adobe IPM, Adobe NGL, Adobe Synchronizer, Adori, Agora, Aha Radio 2, AIDA64, Airr, Airsonic, AliExpress, Alipay, AllHitMusicRadio, All You Can Books, Amazon Fire, Amazon Music, Amazon Shopping, Ameba, Anchor, AnchorFM, AndroidDownloadManager, Anghami, AntennaPod, AntiBrowserSpy, AN WhatsApp, Anybox, Anytime Podcast Player, APK Downloader, Apollo, Apple iMessage, Apple News, Apple Podcasts, Apple Reminders, Apple TV, Arvocast, ASUS Updater, Audacy, Audials, Audible, Audio, Audiobooks, Audio Now, Autoplius.lt, Avid Link, Awasu, Background Intelligent Transfer Service, Baidu Box App, Baidu Input, Ballz, Bank Millenium, Battle.net, BB2C, BBC News, Bear, Be Focused, BetBull, BeyondPod, Bible, Bible KJV, Binance, Bitcoin Core, Bitsboard, Bitwarden, Blackboard, Blitz, Blue Proxy, BlueStacks, Bolt, BonPrix, Bookmobile, Bookshelf, Boom, Boom360, Boomplay, Bose Music, Bose SoundTouch, bPod, Breez, Bridge, Broadcast, Broadway Podcast Network, Browser-Anonymizer, Browser app, BrowserPlus, Bullhorn, BuzzVideo, CamScanner, Capital, capsule.fm, Castamatic, Castaway, CastBox, Castro, Castro 2, CCleaner, CGN, ChMate, Chrome Update, Ciisaa, Citrix Workspace, Classic FM, Client, Clipbox+, Clovia, COAF SMART Citizen, Coinbase, Cooler, Copied, Cortana, Cosmicast, Covenant Eyes, CPod, CPU-Z, CrosswalkApp, Crypto.com DeFi Wallet, CSDN, Damus, Daum, De Standaard, De Telegraaf, DevCasts, DeviantArt, DingTalk, DIRECTV, Discord, DManager, Dogecoin Core, DoggCatcher, Don't Waste My Time!, douban App, DoubleTwist CloudPlayer, Doughnut, Douyin, Downcast, Downie, Downloader, Dr. Watson, DStream Air, Edge Update, EMAudioPlayer, Emby Theater, Epic Games Launcher, ESET Remote Administrator, eToro, Evolve Podcast, Expedia, Expo, F-Secure SAFE, Facebook, Facebook Audience Network, Facebook Groups, Facebook Lite, Facebook Messenger, Facebook Messenger Lite, faidr, Fathom, FeedR, FeedStation, Fiddler Classic, Files, Flipboard App, Flipp, FM WhatsApp, Focus Keeper, Focus Matrix, Fountain, Freespoke, Gaana, Garmin fenix 5X, Garmin Forerunner, GBWhatsApp, GetPodcast, Git, GitHub Desktop, GlobalProtect, GoEuro, Gold, GoldenPod, GoLoud, GoNative, Goodpods, GoodReader, Google Assistant, Google Drive, Google Fiber TV, Google Go, Google Lens, Google Nest Hub, Google Photos, Google Play Newsstand, Google Plus, Google Podcasts, Google Search App, Google Tag Manager, GroupMe, Guacamole, Hago, Hammel, HandBrake, HardCast, Hark Audio, Heart, HermesPod, HeyTapBrowser, HiCast, HideX, Hik-Connect, Himalaya, HiSearch, HisThumbnail, HistoryHound, Hotels.com, HP Smart, HTTP request maker, Huawei Mobile Services, HyperCatcher, iCatcher, iHeartRadio, IMO HD Video Calls & Chat, IMO International Calls & Chat, Instabridge, Instacast, Instagram, Instapaper, iPlayTV, IPTV, IPTV Pro, iVoox, Jam, JaneStyle, JioSaavn, Jitsi Meet, JJ2GO, Jungle Disk, Just Listen, Kajabi, KakaoTalk, Keeper Password Manager, Kids Listen, KidsPod, Kik, KKBOX, Klarna, KPN Veilig, Kwai, Kwai Pro, L.A. Times, Landis+Gyr AIM Browser, Lark, Laughable, Lazada, LBC, LG Player, Line, LinkedIn, Listen, LiSTNR, Liulo, Logi Options+, LoseIt!, Luminary, Macrium Reflect, MBolsa, Megaphone, MEmpresas, Menucast, Mercantile Bank of Michigan, MessengerX, Meta Business Suite, Metacast, MetaMask, MetaTrader, Microsoft Bing, Microsoft Copilot, Microsoft Lync, Microsoft Office, Microsoft Office Access, Microsoft Office Excel, Microsoft Office Mobile, Microsoft Office OneDrive for Business, Microsoft Office OneNote, Microsoft Office PowerPoint, Microsoft Office Project, Microsoft Office Publisher, Microsoft Office Visio, Microsoft Office Word, Microsoft OneDrive, Microsoft Power Query, Microsoft Start, Microsoft Store, Mimir, mobile.de, MobileSMS, Mojeek, MOMO, MoonFM, mowPod, Moya, MX Player, My Bentley, MyTuner, My Watch Party, My World, nate, Naver, NAVER Dictionary, NET.mede, Netflix, NewsArticle App, Newsly, Nextcloud, NPR, NRC, NRC Audio, NTV Mobil, NuMuKi Browser, Obsidian, OBS Studio, Odnoklassniki, OfferUp, Opal Travel, Opera News, Opera Updater, Orange Radio, Outcast, Overcast, Overhaul FM, Paint by Number, Palco MP3, Pandora, Papers, PeaCast, Perplexity, Petal Search, Pic Collage, Pinterest, Player FM, PLAYit, Plex Media Server, Pocket Casts, Podbay, Podbean, Podcast & Radio Addict, Podcast App, Podcast Guru, Podcastly, Podcast Player, Podcast Republic, Podcat, Podcatcher Deluxe, Podchaser, Podclipper, PodCruncher, Podeo, Podfriend, Podhero, Podimo, PodKast, Podkicker, Podkicker Classic, Podkicker Pro, PodLP, PodMe, PodMN, PodNL, Podopolo, Podplay, Pods, PodTrapper, podU, Podurama, Podverse, Podvine, Podyssey, PowerShell, Procast, PugPig Bolt, Q-municate, qBittorrent, QQ, QQMusic, QuickCast, Quicksilver, Quora, R, radio.at, radio.de, radio.dk, radio.es, radio.fr, radio.it, radio.net, radio.pl, radio.pt, radio.se, RadioApp, Radio Italiane, Radioline, Radio Next, RadioPublic, Rave Social, Razer Synapse, RDDocuments, Reddit, Redditor, rekordbox, Repod, Reuters News, Rhythmbox, RNPS Action Cards, Roblox, RoboForm, Rocket Chat, RSSDemon, RSSRadio, Rutube, SachNoi, Safari Search Helper, SafeIP, Samsung Magician, Samsung Podcasts, SearchCraft, ServeStream, Shadow, Shadowrocket, Shopee, ShowMe, Signal, Sina Weibo, Siri, SiriusXM, Skyeng, Skyeng Teachers, Skype, Skype for Business, Slack, Snapchat, Snipd, SoFi, SogouSearch App, SohuNews, Soldier, Sonnet, Sony PlayStation 5, SOOP, SoundOn, SoundWaves, SPORT1, Spotify, Spreaker, Startsiden, Stitcher, StoryShots, Streamlabs OBS, Stream Master, Strimio, Surfshark, Swinsian, Swoot, Taobao, Teams, Tencent Docs, The Crossword, The Epoch Times, The New York Times, The Wall Street Journal, Theyub, Threads, Thunder, tieba, TikTok, TikTok Lite, TIM, TiviMate, TopBuzz, TopSecret Chat, TownNews Now, TracePal, Trade Me, TradingView, Treble.fm, TRP Retail Locator, TuneIn Radio, TuneIn Radio Pro, Turtlecast, Tuya Smart Life, TVirl, twinkle, Twitch Studio, Twitter, Twitterrific, U-Cursos, Ubook Player, UCast, Uconnect LIVE, Uforia, Unibox, UnityPlayer, Viber, Victor Reader Stream 3, Victor Reader Stream New Generation, Victor Reader Stream Trek, Virgin Radio, Visha, Visual Studio Code, Vodacast, Vuhuv, Vuze, waipu.tv, Walla News, WatchFree+, Wattpad, Wayback Machine, WebDAV, WeChat, WeChat Share Extension, Whatplay, WhatsApp, WhatsApp+2, WhatsApp Business, Whisper, WH Questions, Windows Antivirus, Windows CryptoAPI, Windows Delivery Optimization, Windows Push Notification Services, Windows Update Agent, Wireshark, Wirtschafts Woche, WNYC, Word Cookies!, WPS Office, Wynk Music, Xiao Yu Zhou, XING, XShare, XSplit Broadcaster, Y8 Browser, Yahoo! Japan, Yahoo OneSearch, YakYak, Yandex, Yandex Music, Yapa, Yelp Mobile, YouTube, Youtube Music, Yo WhatsApp, Zalo, ZEIT ONLINE, Zen, ZEPETO, Zoho Chat, Zune and *mobile apps using [AFNetworking](https://github.com/AFNetworking/AFNetworking) or [Electron](https://github.com/electron/electron)* ### List of detected PIMs (personal information manager): -Airmail, Barca, DAVdroid, Lotus Notes, MailBar, Microsoft Outlook, Outlook Express, Postbox, SeaMonkey, The Bat!, Thunderbird +Airmail, Apple Mail, Barca, Basecamp, BathyScaphe, BlueMail, DAVdroid, eM Client, Evernote, Foxmail, Franz, Gmail, JaneView, Live5ch, Lotus Notes, mailapp, MailBar, Mailbird, Mail Master, Mailspring, Microsoft Outlook, NAVER Mail, Notion, Outlook Express, Postbox, Raindrop.io, Rambox Pro, SeaMonkey, Spicebird, The Bat!, Thunderbird, Windows Mail, Yahoo! Mail, Yahoo Mail ### List of detected feed readers: -Akregator, Apple PubSub, BashPodder, Breaker, Downcast, FeedDemon, Feeddler RSS Reader, gPodder, JetBrains Omea Reader, Liferea, NetNewsWire, Newsbeuter, NewsBlur, NewsBlur Mobile App, PritTorrent, Pulp, QuiteRSS, ReadKit, Reeder, RSS Bandit, RSS Junkie, RSSOwl, Stringer +Akregator, Apple PubSub, BashPodder, Breaker, castero, castget, FeedDemon, Feeddler RSS Reader, gPodder, JetBrains Omea Reader, Liferea, NetNewsWire, Newsbeuter, NewsBlur, NewsBlur Mobile App, Newsboat, Playapod, PodPuppy, PritTorrent, Pulp, QuiteRSS, ReadKit, Reeder, RSS Bandit, RSS Junkie, RSSOwl, Stringer ### List of brands with detected devices: -3Q, 4Good, Ace, Acer, Advan, Advance, AGM, Ainol, Airness, Airties, AIS, Aiwa, Akai, Alba, Alcatel, Aligator, AllCall, AllDocube, Allview, Allwinner, Altech UEC, altron, Amazon, AMGOO, Amoi, ANS, Apple, Archos, Arian Space, Ark, ArmPhone, Arnova, ARRIS, Ask, Assistant, Asus, Atom, Audiovox, AVH, Avvio, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BDF, Becker, Beeline, Beetel, BenQ, BenQ-Siemens, Bezkam, BGH, Bird, Bitel, Black Fox, Blackview, Blaupunkt, Blu, Bluboo, Bluegood, Bmobile, bogo, Boway, bq, Bravis, Brondi, Bush, CAGI, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Celkon, Changhong, Cherry Mobile, China Mobile, Chuwi, Clarmin, CnM, Coby Kyros, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Coolpad, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crosscall, Cube, CUBOT, CVTE, Cyrus, Daewoo, Danew, Datang, Datsun, Dbtel, Dell, Denver, Desay, DeWalt, DEXP, Dialog, Dicam, Digi, Digicel, Digiland, Digma, Divisat, DMM, DNS, DoCoMo, Doogee, Doov, Dopod, Doro, Dune HD, E-Boda, E-tel, Easypix, EBEST, Echo Mobiles, ECS, EE, EKO, Eks Mobility, Element, Elenberg, Elephone, Energizer, Energy Sistem, Ergo, Ericsson, Ericy, Essential, Essentielb, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, Explay, Extrem, Ezio, Ezze, Fairphone, Famoco, Fengxiang, FiGO, FinePower, Fly, FNB, Fondi, FORME, Forstar, Foxconn, Freetel, Fujitsu, G-TiDE, Garmin-Asus, Gateway, Gemini, General Mobile, Geotel, Ghia, Ghong, Gigabyte, Gigaset, Ginzzu, Gionee, Globex, GOCLEVER, Goly, Gome, GoMobile, Google, Gradiente, Grape, Grundig, Hafury, Haier, HannSpree, Hasee, Hi-Level, Highscreen, Hisense, Hoffmann, Homtom, Hoozo, Hosin, HP, HTC, Huadoo, Huawei, Humax, Hyrican, Hyundai, i-Joy, i-mate, i-mobile, iBall, iBerry, IconBIT, iGet, iHunt, Ikea, iKoMo, iLA, IMO Mobile, Impression, iNew, Infinix, InFocus, Inkti, InnJoo, Innostream, Inoi, INQ, Insignia, Intek, Intex, Inverto, iOcean, iPro, Irbis, iRola, iRulu, iTel, iVA, iView, iZotron, JAY-Tech, JFone, Jiayu, Jolla, Just5, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Karbonn, KATV1, Kazam, KDDI, Kempler & Strauss, Keneksi, Kiano, Kingsun, Kivi, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, KOPO, Koridy, KRONO, Krüger&Matz, KT-Tech, Kumai, Kyocera, LAIQ, Land Rover, Landvo, Lanix, Lark, Lava, LCT, Leagoo, Ledstar, LeEco, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lexand, Lexibook, LG, Lingwin, Loewe, Logicom, Lumus, Luna, LYF, M.T.T., M4tel, Majestic, Mann, Manta Multimedia, Masstel, Maxcom, Maxwest, Maze, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Memup, Metz, MEU, MicroMax, Microsoft, Mio, Miray, Mitsubishi, MIXC, MLLED, Mobicel, Mobiistar, Mobiola, Mobistel, Modecom, Mofut, Motorola, Movic, Mpman, MSI, MTC, MTN, MYFON, MyPhone, Myria, Mystery, MyWigo, National, Navon, NEC, Neffos, Netgear, NeuImage, Newgen, NewsMy, NEXBOX, Nexian, Nextbit, NextBook, NGM, NG Optics, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, Nokia, Nomi, Nous, NUU Mobile, Nuvo, Nvidia, NYX Mobile, O+, O2, Obi, Odys, Onda, OnePlus, OPPO, Opsson, Orange, Ordissimo, Ouki, Oukitel, OUYA, Overmax, Oysters, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pentagram, Phicomm, Philips, phoneOne, Pioneer, Pixus, Ployer, Plum, Point of View, Polaroid, PolyPad, Polytron, Pomp, Positivo, PPTV, Prestigio, Primepad, Proline, ProScan, Protruly, PULID, Q-Touch, Qilive, QMobile, Qtek, Quantum, Quechua, Qumo, R-TV, Ramos, Razer, RCA Tablets, Readboy, Rikomagic, RIM, Rinno, Ritmix, Ritzviva, Riviera, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RT Project, RugGear, Runbo, Ryte, Safaricom, Sagem, Samsung, Sanei, Santin, Sanyo, Savio, Sega, Selevision, Selfix, Sencor, Sendo, Senseit, Senwa, SFR, Sharp, Shift Phones, Shuttle, Siemens, Sigma, Silent Circle, Simbans, Sky, Skyworth, Smart, Smartfren, Smartisan, Softbank, Sonim, Sony, Sony Ericsson, Soyes, Spectrum, Spice, Star, Starway, STF Mobile, STK, Stonex, Storex, Sumvision, SunVan, Sunvell, SuperSonic, Supra, SWISSMOBILITY, Symphony, Syrox, T-Mobile, TB Touch, TCL, TechniSat, TechnoTrend, TechPad, Teclast, Tecno Mobile, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, teXet, ThL, Thomson, TIANYU, Timovi, TiPhone, Tolino, Tooky, Top House, Toplux, Toshiba, Touchmate, TrekStor, Trevi, True, Tunisie Telecom, Turbo, Turbo-X, TVC, U.S. Cellular, Ugoos, Uhans, Uhappy, Ulefone, Umax, UMIDIGI, Unihertz, Unimax, Uniscope, Unknown, Unnecto, Unonu, Unowhy, UTOK, UTStarcom, Vastking, Venso, Verizon, Vernee, Vertex, Vertu, Verykool, Vesta, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinga, Vinsoc, Vitelcom, Vivax, Vivo, Vizio, VK Mobile, Vodafone, Vonino, Vontar, Vorago, Vorke, Voto, Voxtel, Voyo, Vsun, Vulcan, Walton, Web TV, Weimei, WellcoM, Wexler, Wieppo, Wigor, Wiko, Wileyfox, Wink, Wolder, Wolfgang, Wonu, Woo, Woxter, X-TIGI, X-View, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, Yandex, Yarvik, Yes, Yezz, Yota, Ytone, Yu, Yuandao, Yusun, Yxtel, Zeemi, Zen, Zenek, Zfiner, Zidoo, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn +2E, 3GNET, 3GO, 3Q, 4Good, 4ife, 5IVE, 7 Mobile, 10moons, 360, 8848, A&K, A1, A95X, AAUW, Accent, Accesstyle, Ace, Aceline, Acer, Acteck, actiMirror, Adreamer, Adronix, Advan, Advance, Advantage Air, AEEZO, AFFIX, AfriOne, AGM, AG Mobile, AIDATA, Ainol, Airis, Airness, AIRON, Airpha, Airtel, Airties, AirTouch, AIS, Aiuto, Aiwa, Ajib, Akai, AKIRA, Alba, Alcatel, Alcor, ALDI NORD, ALDI SÜD, Alfawise, Alienware, Aligator, AllCall, AllDocube, ALLINmobile, Allview, Allwinner, Alps, Altech UEC, Altice, Altimo, altron, Altus, AMA, Amazon, Amazon Basics, AMCV, AMGOO, Amigoo, Amino, Amoi, ANBERNIC, ANCEL, Andowl, Angelcare, AngelTech, Anker, Anry, ANS, ANXONIT, AOC, Aocos, Aocwei, AOpen, Aoro, Aoson, AOYODKG, Apple, Aquarius, Archos, Arian Space, Arival, Ark, ArmPhone, Arnova, ARRIS, Artel, Artizlee, ArtLine, Arçelik, Asano, Asanzo, Ask, Aspera, ASSE, Assistant, Astro, Asus, AT&T, Athesi, Atlantic Electrics, Atmaca Elektronik, ATMAN, ATMPC, ATOL, Atom, Atouch, Atozee, Attila, Atvio, Audiovox, AUPO, AURIS, Autan, AUX, Avaya, Avenzo, AVH, Avvio, Awow, AWOX, AXEN, Axioo, AXXA, Axxion, AYA, AYYA, Azeyou, AZOM, Azumi Mobile, Azupik, b2m, Backcell, BAFF, BangOlufsen, Barnes & Noble, BARTEC, BASE, BAUHN, BBK, BB Mobile, BDF, BDQ, BDsharing, Beafon, Becker, Beeline, Beelink, Beetel, Beista, Beko, Bell, Bellphone, Benco, Benesse, BenQ, BenQ-Siemens, BenWee, Benzo, Beyond, Bezkam, BGH, Bigben, BIHEE, BilimLand, Billion, Billow, BioRugged, Bird, Bitel, Bitmore, Bittium, Bkav, Black Bear, Black Box, Black Fox, Blackpcs, Blackview, Blaupunkt, Bleck, BLISS, Blloc, Blow, Blu, Bluboo, Bluebird, Bluedot, Bluegood, BlueSky, Bluewave, BluSlate, BMAX, Bmobile, BMW, BMXC, Bobarry, bogo, Bolva, Bookeen, Boost, Botech, Boway, bq, BrandCode, Brandt, BRAVE, Bravis, BrightSign, Brigmton, Brondi, BROR, BS Mobile, Bubblegum, Bundy, Bush, BuzzTV, BYD, BYJU'S, BYYBUO, C5 Mobile, CADENA, CAGI, Camfone, Canaima, Canal+, Canal Digital, Canguro, Capitel, Captiva, Carbon Mobile, Carrefour, Casio, Casper, Cat, Cavion, CCIT, Cecotec, Ceibal, Celcus, Celkon, Cell-C, Cellacom, CellAllure, Cellution, CENTEK, Centric, CEPTER, CG Mobile, CGV, Chainway, Changhong, CHCNAV, Cherry Mobile, Chico Mobile, ChiliGreen, China Mobile, China Telecom, Chuwi, C Idea, CipherLab, Citycall, CKK Mobile, Claresta, Clarmin, CLAYTON, ClearPHONE, Clementoni, Cloud, Cloudfone, Cloudpad, Clout, Clovertek, CMF, CnM, Cobalt, Coby Kyros, COLORROOM, Colors, Comio, Compal, Compaq, COMPUMAX, ComTrade Tesla, Conceptum, Concord, ConCorde, Condor, Connectce, Connex, Conquest, Continental Edison, Contixo, COOD-E, Coolpad, Coopers, CORN, Cosmote, Covia, Cowon, COYOTE, CPDEVICE, CreNova, Crescent, Cricket, Crius Mea, Crony, Crosscall, Crown, Ctroniq, Cube, CUBOT, Cuiud, Cultraview, CVTE, Cwowdefu, CX, Cyrus, D-Link, D-Tech, Daewoo, Danew, DangcapHD, Dany, Daria, DASS, Datalogic, Datamini, Datang, Datawind, Datsun, Dazen, DbPhone, Dbtel, Dcode, DEALDIG, Dell, Denali, Denver, Desay, DeWalt, DEXP, DEYI, DF, DGTEC, DIALN, Dialog, Dicam, Digi, Digicel, DIGICOM, Digidragon, DIGIFORS, Digihome, Digiland, Digit4G, Digma, DIJITSU, DIKOM, DIMO, Dinalink, Dinax, DING DING, DIORA, DISH, Disney, Ditecma, Diva, DiverMax, Divisat, DIXON, DL, DMM, DMOAO, DNS, DoCoMo, Doffler, Dolamee, Dom.ru, Doogee, Doopro, Doov, Dopod, Doppio, DORLAND, Doro, DPA, DRAGON, Dragon Touch, Dreamgate, DreamStar, DreamTab, Droidlogic, Droxio, DSDevices, DSIC, Dtac, DUDU AUTO, Dune HD, DUNNS Mobile, Durabook, Duubee, Dykemann, Dyon, E-Boda, E-Ceros, E-TACHI, E-tel, Eagle, EagleSoar, EAS Electric, Easypix, EBEN, EBEST, Echo Mobiles, ecom, ECON, ECOO, ECS, Edenwood, EE, EFT, EGL, EGOTEK, Ehlel, Einstein, EKINOX, EKO, Eks Mobility, EKT, ELARI, ELE-GATE, Elecson, Electroneum, ELECTRONIA, Elekta, Elektroland, Element, Elenberg, Elephone, Elevate, Elong Mobile, Eltex, Ematic, Emporia, ENACOM, Energizer, Energy Sistem, Engel, ENIE, Enot, eNOVA, Entity, Envizen, Ephone, Epic, Epik One, Epson, Equator, Ergo, Ericsson, Ericy, Erisson, Essential, Essentielb, eSTAR, ETOE, Eton, eTouch, Etuline, Eurocase, Eurostar, Evercoss, Everest, Everex, Everis, Evertek, Evolio, Evolveo, Evoo, EVPAD, EvroMedia, evvoli, EWIS, EXCEED, Exmart, ExMobile, EXO, Explay, Express LUCK, ExtraLink, Extrem, Eyemoo, EYU, Ezio, Ezze, F&U, F+, F2 Mobile, F150, Facebook, Facetel, Facime, Fairphone, Famoco, Famous, Fantec, FaRao Pro, Farassoo, FarEasTone, Fengxiang, Fenoti, FEONAL, Fero, FFF SmartLife, Figgers, FiGi, FiGO, FiiO, Filimo, FILIX, FinePower, Finlux, FireFly Mobile, FISE, FITCO, Fluo, Fly, FLYCAT, FLYCOAY, FMT, FNB, FNF, Fobem, Fondi, Fonos, FOODO, FORME, Formuler, Forstar, Fortis, FortuneShip, FOSSiBOT, Fourel, Four Mobile, Foxconn, FoxxD, FPT, free, Freetel, FreeYond, Frunsi, Fuego, Fujitsu, Funai, Fusion5, Future Mobile Technology, Fxtec, G-PLUS, G-TiDE, G-Touch, Galactic, Galaxy Innovations, Gamma, Garmin-Asus, Gateway, Gazer, GDL, Geanee, Geant, Gear Mobile, Gemini, General Mobile, Genesis, GEOFOX, Geotel, Geotex, GEOZON, Getnord, GFive, Gfone, Ghia, Ghong, Ghost, Gigabyte, Gigaset, Gini, Ginzzu, Gionee, GIRASOLE, Globex, Globmall, GlocalMe, Glofiish, GLONYX, Glory Star, GLX, GOCLEVER, Gocomma, GoGEN, GOLDBERG, GoldMaster, GoldStar, Gol Mobile, Goly, Gome, GoMobile, GOODTEL, Google, Goophone, Gooweel, GOtv, Gplus, Gradiente, Graetz, Grape, Great Asia, Gree, Green Lion, Green Orange, Greentel, Gresso, Gretel, GroBerwert, Grundig, Gtel, GTMEDIA, GTX, Guophone, GVC Pro, H96, H133, Hafury, Haier, Haipai, Haixu, Hamlet, Hammer, Handheld, HannSpree, Hanseatic, Hanson, HAOQIN, HAOVM, Hardkernel, Harper, Hartens, Hasee, Hathway, HDC, HeadWolf, HEC, Heimat, Helio, Hemilton, HERO, HexaByte, Hezire, Hi, Hi-Level, Hiberg, HiBy, High Q, Highscreen, HiGrace, HiHi, HiKing, HiMax, Hi Nova, HIPER, Hipstreet, Hiremco, Hisense, Hitachi, Hitech, HKC, HKPro, HLLO, HMD, HOFER, Hoffmann, HOLLEBERG, Homatics, Hometech, Homtom, Honeywell, HongTop, HONKUAHG, Hoozo, Hopeland, Horizon, Horizont, Hosin, Hotel, Hot Pepper, HOTREALS, Hotwav, How, HP, HTC, Huadoo, Huagan, Huavi, Huawei, Hugerock, Humanware, Humax, Hurricane, Huskee, Hyatta, Hykker, Hyrican, Hytera, Hyundai, Hyve, i-Cherry, I-INN, i-Joy, i-mate, i-mobile, I-Plus, iBall, iBerry, ibowin, iBrit, IconBIT, iData, iDino, iDroid, iFIT, iGet, iHome Life, iHunt, I KALL, Ikea, IKI Mobile, iKoMo, iKon, iKonia, IKU Mobile, iLA, iLepo, iLife, iMan, Imaq, iMars, iMI, IMO Mobile, Imose, Impression, iMuz, iNavi, INCAR, Inch, Inco, iNew, Infiniton, Infinix, InFocus, InfoKit, Infomir, InFone, Inhon, Inka, Inkti, InnJoo, Innos, Innostream, Inoi, iNo Mobile, iNOVA, inovo, INQ, Insignia, INSYS, Intek, Intel, Intex, Invens, Inverto, Invin, iOcean, IOTWE, iOutdoor, iPEGTOP, iPro, iQ&T, IQM, IRA, Irbis, iReplace, Iris, iRobot, iRola, iRulu, iSafe Mobile, iStar, iSWAG, IT, iTel, iTruck, IUNI, iVA, iView, iVooMi, ivvi, iWaylink, iXTech, iYou, iZotron, Jambo, JAY-Tech, Jedi, Jeep, Jeka, Jesy, JFone, Jiake, Jiayu, Jinga, Jin Tu, Jio, Jivi, JKL, Jolla, Joy, JoySurf, JPay, JREN, Jumper, Juniper Systems, Just5, JVC, JXD, K-Lite, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Kapsys, Karbonn, Kata, KATV1, Kazam, Kazuna, KDDI, Kempler & Strauss, Kenbo, Kendo, Keneksi, KENSHI, KENWOOD, Kenxinda, Khadas, Kiano, kidiby, Kingbox, Kingstar, Kingsun, KINGZONE, Kinstone, Kiowa, Kivi, Klipad, KN Mobile, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, Koolnee, Kooper, KOPO, Korax, Koridy, Koslam, Kraft, KREZ, KRIP, KRONO, Krüger&Matz, KT-Tech, KUBO, KuGou, Kuliao, Kult, Kumai, Kurio, KVADRA, Kvant, Kydos, Kyocera, Kyowon, Kzen, KZG, L-Max, LAIQ, Land Rover, Landvo, Lanin, Lanix, Lark, Laser, Laurus, Lava, LCT, Leader Phone, Leagoo, Leben, LeBest, Lectrus, Ledstar, LeEco, Leelbox, Leff, Legend, Leke, Lemco, LEMFO, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lesia, Lexand, Lexibook, LG, Liberton, Lifemaxx, Lime, Lingbo, Lingwin, Linnex, Linsar, Linsay, Listo, LNMBBS, Loewe, Logic, Logic Instrument, Logicom, Logik, Logitech, LOKMAT, LongTV, Loview, Lovme, LPX-G, LT Mobile, Lumigon, Lumitel, Lumus, Luna, Luxor, Lville, LW, LYF, LYOTECH LABS, M-Horse, M-KOPA, M-Tech, M.T.T., M3 Mobile, M4tel, MAC AUDIO, Macoox, Mafe, MAG, MAGCH, Magicsee, Magnus, Majestic, Malata, Mango, Manhattan, Mann, Manta Multimedia, Mantra, Mara, Marshal, Mascom, Massgo, Masstel, Master-G, Mastertech, Matco Tools, Matrix, Maunfeld, Maxcom, Maxfone, Maximus, Maxtron, MAXVI, Maxwell, Maxwest, MAXX, Maze, Maze Speed, MBI, MBK, MBOX, MDC Store, MDTV, meanIT, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, Megacable, MegaFon, MEGA VISION, Meitu, Meizu, Melrose, MeMobile, Memup, MEO, MESWAO, Meta, Metz, MEU, MicroMax, Microsoft, Microtech, Mightier, Minix, Mint, Mintt, Mio, Mione, mipo, Miray, Mitchell & Brown, Mito, Mitsubishi, Mitsui, MIVO, MIWANG, MIXC, MiXzo, MLAB, MLLED, MLS, MMI, Mobell, Mobicel, MobiIoT, Mobiistar, Mobile Kingdom, Mobiola, Mobistel, MobiWire, Mobo, Mobvoi, Modecom, Mode Mobile, Mofut, Moondrop, Mosimosi, Motiv, Motorola, Motorola Solutions, Movic, MOVISUN, Movitel, Moxee, mPhone, Mpman, MSI, MStar, MTC, MTN, Multilaser, MultiPOS, MwalimuPlus, MYFON, MyGica, MygPad, Mymaga, MyMobile, MyPhone (PH), myPhone (PL), Myria, Myros, Mystery, MyTab, MyWigo, N-one, Nabi, NABO, Nanho, Naomi Phone, NASCO, National, Navcity, Navitech, Navitel, Navon, NavRoad, NEC, Necnot, Nedaphone, Neffos, NEKO, Neo, neoCore, Neolix, Neomi, Neon IQ, Neoregent, NetBox, Netgear, Netmak, NETWIT, NeuImage, NeuTab, NEVIR, Newal, New Balance, New Bridge, Newgen, Newland, Newman, Newsday, NewsMy, Nexa, NEXBOX, Nexian, NEXON, NEXT, Next & NextStar, Nextbit, NextBook, NextTab, NGM, NG Optics, NGpon, Nikon, NINETEC, NINETOLOGY, Nintendo, nJoy, NOA, Noain, Nobby, Noblex, NOBUX, noDROPOUT, NOGA, Nokia, Nomi, Nomu, Noontec, Nordfrost, Nordmende, NORMANDE, NorthTech, Nos, Nothing, Nous, Novacom, Novex, Novey, NoviSea, NOVO, NTT West, NuAns, Nubia, NUU Mobile, NuVision, Nuvo, Nvidia, NYX Mobile, O+, O2, Oale, Oangcc, OASYS, Obabox, Ober, Obi, OCEANIC, Odotpad, Odys, Oilsky, OINOM, Ok, Okapi, Okapia, Oking, OKSI, OKWU, Olax, Olkya, Ollee, OLTO, Olympia, OMIX, Onda, OneClick, OneLern, OnePlus, Onida, Onix, Onkyo, ONN, ONVO, ONYX BOOX, Ookee, Ooredoo, OpelMobile, Openbox, Ophone, OPPO, Opsson, Optoma, Orange, Orange Pi, Orava, Orbic, Orbita, Orbsmart, Ordissimo, Orion, OSCAL, OTTO, OUJIA, Ouki, Oukitel, OUYA, Overmax, Ovvi, Owwo, OX TAB, OYSIN, Oysters, Oyyu, OzoneHD, P-UP, Pacific Research Alliance, Packard Bell, Padpro, PAGRAER, Paladin, Palm, Panacom, Panasonic, Panavox, Pano, Panodic, Panoramic, Pantech, PAPYRE, Parrot Mobile, Partner Mobile, PCBOX, PCD, PCD Argentina, PC Smart, PEAQ, Pelitt, Pendoo, Penta, Pentagram, Perfeo, Phicomm, Philco, Philips, Phonemax, phoneOne, Pico, PINE, Pioneer, Pioneer Computers, PiPO, PIRANHA, Pixela, Pixelphone, PIXPRO, Pixus, Planet Computers, Platoon, Play Now, Ployer, Plum, PlusStyle, Pluzz, PocketBook, POCO, Point Mobile, Point of View, Polar, PolarLine, Polaroid, Polestar, PolyPad, Polytron, Pomp, Poppox, POPTEL, Porsche, Portfolio, Positivo, Positivo BGH, PPTV, Premier, Premio, Prestigio, PRIME, Primepad, Primux, Pritom, Prixton, PROFiLO, Proline, Prology, ProScan, PROSONIC, Protruly, ProVision, PULID, Punos, Purism, PVBox, Q-Box, Q-Touch, Q.Bell, QFX, Qilive, QIN, QLink, QMobile, Qnet Mobile, QTECH, Qtek, Quantum, Quatro, Qubo, Quechua, Quest, Quipus, Qumo, Qware, QWATT, R-TV, Rakuten, Ramos, Raspberry, Ravoz, Raylandz, Razer, RCA Tablets, RCT, Reach, Readboy, Realix, Realme, RED, Redbean, Redfox, RedLine, Redway, Reeder, REGAL, RelNAT, Relndoo, Remdun, Renova, RENSO, rephone, Retroid Pocket, Revo, Revomovil, Rhino, Ricoh, Rikomagic, RIM, Ringing Bells, Rinno, Ritmix, Ritzviva, Riviera, Rivo, Rizzen, ROADMAX, Roadrover, Roam Cat, ROCH, Rocket, ROiK, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, Royole, RoyQueen, RTK, RT Project, RugGear, RuggeTech, Ruggex, Ruio, Runbo, Rupa, Ryte, S-Color, S-TELL, S2Tel, Saba, Safaricom, Sagem, Sagemcom, Saiet, SAILF, Salora, Samsung, Samtech, Samtron, Sanei, Sankey, Sansui, Santin, SANY, Sanyo, Savio, Sber, Schneider, Schok, Scoole, Scosmos, Seatel, SEBBE, Seeken, SEEWO, SEG, Sega, SEHMAX, Selecline, Selenga, Selevision, Selfix, SEMP TCL, Sencor, Sendo, Senkatel, SENNA, Senseit, Senwa, SERVO, Seuic, Sewoo, SFR, SGIN, Shanling, Sharp, Shift Phones, Shivaki, Shtrikh-M, Shuttle, Sico, Siemens, Sigma, Silelis, Silent Circle, Silva Schneider, Simbans, simfer, Simply, Singtech, Siragon, Sirin Labs, Siswoo, SK Broadband, SKG, SKK Mobile, Sky, Skyline, SkyStream, Skytech, Skyworth, Smadl, Smailo, Smart, Smartab, SmartBook, SMARTEC, Smart Electronic, Smartex, Smartfren, Smartisan, Smart Kassel, Smarty, Smooth Mobile, Smotreshka, SMT Telecom, SMUX, SNAMI, SobieTech, Soda, Softbank, Soho Style, Solas, SOLE, SOLO, Solone, Sonim, SONOS, Sony, Sony Ericsson, SOSH, SoulLink, Soundmax, Soyes, Spark, Sparx, SPC, Spectralink, Spectrum, Spice, Sprint, SPURT, SQOOL, SSKY, Star, Starlight, Starmobile, Starway, Starwind, STF Mobile, STG Telecom, STK, Stonex, Storex, StrawBerry, Stream, STRONG, Stylo, Subor, Sugar, Sumvision, Sunmax, Sunmi, Sunny, Sunstech, SunVan, Sunvell, SUNWIND, SuperBOX, Super General, SuperSonic, SuperTab, Supra, Supraim, Surfans, Surge, Suzuki, Sveon, Swipe, SWISSMOBILITY, Swisstone, Switel, SWOFY, Syco, SYH, Sylvania, Symphony, Syrox, System76, T-Mobile, T96, TADAAM, TAG Tech, Taiga System, Takara, Talius, Tambo, Tanix, TAUBE, TB Touch, TCL, TCL SCBC, TD Systems, TD Tech, TeachTouch, Technicolor, Technika, TechniSat, Technopc, TECHNOSAT, TechnoTrend, TechPad, TechSmart, Techstorm, Techwood, Teclast, Tecno Mobile, TecToy, TEENO, Teknosa, Tele2, Telefunken, Telego, Telenor, Telia, Telit, Telkom, Telly, Telma, TeloSystems, Telpo, TENPLUS, Teracube, Tesco, Tesla, TETC, Tetratab, teXet, ThL, Thomson, Thuraya, TIANYU, Tibuta, Tigers, Time2, Timovi, TIMvision, Tinai, Tinmo, TiPhone, Tivax, TiVo, TJC, TJD, TOKYO, Tolino, Tone, TOOGO, Tooky, Top-Tech, TopDevice, TOPDON, Topelotek, Top House, Toplux, TOPSHOWS, Topsion, Topway, Torex, Torque, TOSCIDO, Toshiba, Touchmate, Touch Plus, TOX, TPS, Transpeed, TrekStor, Trevi, TriaPlay, Trident, Trifone, Trimble, Trio, Tronsmart, True, True Slim, Tsinghua Tongfang, TTEC, TTfone, TTK-TV, TuCEL, Tunisie Telecom, Turbo, Turbo-X, TurboKids, TurboPad, Turkcell, Tuvio, TVC, TwinMOS, TWM, Twoe, TWZ, TYD, Tymes, Türk Telekom, U-Magic, U.S. Cellular, UD, UE, UGINE, Ugoos, Uhans, Uhappy, Ulefone, Umax, UMIDIGI, Umiio, Unblock Tech, Uniden, Unihertz, Unimax, Uniqcell, Uniscope, Unistrong, Unitech, United Group, UNIWA, Unknown, Unnecto, Unnion Technologies, UNNO, Unonu, Unowhy, UOOGOU, Urovo, UTime, UTOK, UTStarcom, UZ Mobile, V-Gen, V-HOME, V-HOPE, v-mobile, VAIO, VALE, VALEM, VALTECH, VANGUARD, Vankyo, VANWIN, Vargo, Vastking, VAVA, VC, VDVD, Vega, Veidoo, Vekta, Venso, Venstar, Venturer, VEON, Verico, Verizon, Vernee, Verssed, Versus, Vertex, Vertu, Verykool, Vesta, Vestel, VETAS, Vexia, VGO TEL, ViBox, Victurio, VIDA, Videocon, Videoweb, ViewSonic, VIIPOO, VIKUSHA, VILLAON, VIMOQ, Vinabox, Vinga, Vinsoc, Vios, Viper, Vipro, Virzo, Vision Technology, Vision Touch, Visual Land, Vitelcom, Vityaz, Viumee, Vivax, VIVIBright, VIVIMAGE, Vivo, VIWA, Vizio, Vizmo, VK Mobile, VKworld, VNPT Technology, VOCAL, Vodacom, Vodafone, VOGA, VOLIA, VOLKANO, Volla, Volt, Vonino, Vontar, Vorago, Vorcom, Vorke, Vormor, Vortex, Voto, VOX, Voxtel, Voyo, Vsmart, Vsun, VUCATIMES, Vue Micro, Vulcan, VVETIME, Völfen, W&O, WAF, Wainyok, Walker, Walton, Waltter, Wanmukang, WANSA, WE, We. by Loewe., Webfleet, Web TV, WeChip, Wecool, Weelikeit, Weiimi, Weimei, WellcoM, WELLINGTON, Western Digital, Westpoint, Wexler, White Mobile, Whoop, Wieppo, Wigor, Wiko, Wileyfox, Winds, Wink, Winmax, Winnovo, Winstar, Wintouch, Wiseasy, WIWA, WizarPos, Wizz, Wolder, Wolfgang, Wolki, WONDER, Wonu, Woo, Wortmann, Woxter, WOZIFAN, WS, X-AGE, X-BO, X-Mobile, X-TIGI, X-View, X.Vision, X88, X96, X96Q, Xcell, XCOM, Xcruiser, XElectron, XGEM, XGIMI, Xgody, Xiaodu, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, XPPen, XREAL, Xshitou, Xsmart, Xtouch, Xtratech, Xwave, XY Auto, Yandex, Yarvik, YASIN, YELLYOUTH, YEPEN, Yes, Yestel, Yezz, Yoka TV, Yooz, Yota, YOTOPT, Youin, Youwei, Ytone, Yu, Yuandao, YU Fly, YUHO, YUMKEM, YUNDOO, Yuno, YunSong, Yusun, Yxtel, Z-Kai, Zaith, Zamolxe, Zatec, Zealot, Zeblaze, Zebra, Zeeker, Zeemi, Zen, Zenek, Zentality, Zfiner, ZH&K, Zidoo, ZIFRO, Zigo, ZIK, Zinox, Ziox, Zonda, Zonko, Zoom, ZoomSmart, Zopo, ZTE, Zuum, Zync, ZYQ, Zyrex, ZZB, öwn ### List of detected bots: -360Spider, Aboundexbot, Acoon, AddThis.com, ADMantX, aHrefs Bot, Alexa Crawler, Alexa Site Audit, Amazon Route53 Health Check, Amorank Spider, Analytics SEO Crawler, ApacheBench, Applebot, Arachni, archive.org bot, Ask Jeeves, AspiegelBot, Awario, Awario, Backlink-Check.de, BacklinkCrawler, Baidu Spider, BazQux Reader, BingBot, BitlyBot, Blekkobot, BLEXBot Crawler, Bloglovin, Blogtrottr, BoardReader, BoardReader Blog Indexer, Bountii Bot, BrandVerity, Browsershots, BUbiNG, Buck, Butterfly Robot, Bytespider, CareerBot, Castro 2, Catchpoint, CATExplorador, ccBot crawler, Charlotte, Cliqzbot, CloudFlare Always Online, CloudFlare AMP Fetcher, Collectd, CommaFeed, CSS Certificate Spider, Cốc Cốc Bot, Datadog Agent, Datanyze, Dataprovider, Daum, Dazoobot, Discobot, Domain Re-Animator Bot, DotBot, DuckDuckGo Bot, Easou Spider, eCairn-Grabber, EMail Exractor, EmailWolf, Embedly, evc-batch, ExaBot, ExactSeek Crawler, Ezooms, eZ Publish Link Validator, Facebook External Hit, Feedbin, FeedBurner, Feedly, Feedspot, Feed Wrangler, Fever, Findxbot, Flipboard, FreshRSS, Generic Bot, Generic Bot, Genieo Web filter, Gigablast, Gigabot, Gluten Free Crawler, Gmail Image Proxy, Goo, Googlebot, Google Cloud Scheduler, Google Favicon, Google PageSpeed Insights, Google Partner Monitoring, Google Search Console, Google Stackdriver Monitoring, Google Structured Data Testing Tool, Grapeshot, GTmetrix, Heritrix, Heureka Feed, HTTPMon, HubPages, HubSpot, ICC-Crawler, ichiro, IDG/IT, IIS Site Analysis, Inktomi Slurp, inoreader, IP-Guide Crawler, IPS Agent, Kaspersky, Kouio, Larbin web crawler, LCC, Let's Encrypt Validation, Lighthouse, Linkdex Bot, LinkedIn Bot, LTX71, Lycos, Magpie-Crawler, MagpieRSS, Mail.Ru Bot, masscan, Mastodon Bot, Meanpath Bot, MetaInspector, MetaJobBot, Mixrank Bot, MJ12 Bot, Mnogosearch, MojeekBot, Monitor.Us, Munin, Nagios check_http, NalezenCzBot, nbertaupete95, Netcraft Survey Bot, netEstate, NetLyzer FastProbe, NetResearchServer, Netvibes, NewsBlur, NewsGator, NLCrawler, Nmap, Nutch-based Bot, Nuzzel, oBot, Octopus, Omgili bot, Openindex Spider, OpenLinkProfiler, OpenWebSpider, Orange Bot, Outbrain, PagePeeker, PaperLiBot, Phantomas, PHP Server Monitor, Picsearch bot, Pingdom Bot, Pinterest, PocketParser, Pompos, PritTorrent, QuerySeekerSpider, Quora Link Preview, Qwantify, Rainmeter, RamblerMail Image Proxy, Reddit Bot, Riddler, Rogerbot, ROI Hunter, RSSRadio Bot, SafeDNSBot, Scooter, ScoutJet, Scrapy, Screaming Frog SEO Spider, ScreenerBot, Semrush Bot, Sensika Bot, Sentry Bot, SEOENGBot, SEOkicks-Robot, Seoscanners.net, Server Density, Seznam Bot, Seznam Email Proxy, Seznam Zbozi.cz, ShopAlike, Shopify Partner, ShopWiki, SilverReader, SimplePie, SISTRIX Crawler, SISTRIX Optimizer, Site24x7 Website Monitoring, Siteimprove, SiteSucker, Sixy.ch, Skype URI Preview, Slackbot, SMTBot, Snapchat Proxy, Sogou Spider, Soso Spider, Sparkler, Speedy, Spinn3r, Spotify, Sputnik Bot, sqlmap, SSL Labs, Startpagina Linkchecker, StatusCake, Superfeedr Bot, Survey Bot, Tarmot Gezgin, TelegramBot, The Knowledge AI, theoldreader, TinEye Crawler, Tiny Tiny RSS, TLSProbe, TraceMyFile, Trendiction Bot, TurnitinBot, TweetedTimes Bot, Tweetmeme Bot, Twingly Recon, Twitterbot, UkrNet Mail Proxy, UniversalFeedParser, Uptimebot, Uptime Robot, URLAppendBot, Vagabondo, Visual Site Mapper Crawler, VK Share Button, W3C CSS Validator, W3C I18N Checker, W3C Link Checker, W3C Markup Validation Service, W3C MobileOK Checker, W3C Unified Validator, Wappalyzer, WebbCrawler, Weborama, WebPageTest, WebSitePulse, WebThumbnail, WeSEE:Search, WikiDo, Willow Internet Crawler, WooRank, WordPress, Wotbox, XenForo, YaCy, Yahoo! Cache System, Yahoo! Japan BRW, Yahoo! Link Preview, Yahoo! Slurp, Yahoo Gemini, Yandex Bot, Yeti/Naverbot, Yottaa Site Monitor, Youdao Bot, Yourls, Yunyun Bot, Zao, Ze List, zgrab, Zookabot, ZumBot \ No newline at end of file +2GDPR, 2ip, 360 Monitoring, 360JK, 360Spider, 1001FirmsBot, Abonti, Aboundexbot, AccompanyBot, Acoon, AdAuth, Adbeat, AddThis.com, ADMantX, ADmantX Service Fetcher, Adsbot, Adscanner, AdsTxtCrawler, AdsTxtCrawlerTP, adstxtlab.com, Aegis, aHrefs Bot, AhrefsSiteAudit, aiHitBot, Alexa Crawler, Alexa Site Audit, Allloadin Favicon Bot, AlltheWeb, Amazon AdBot, Amazon Bot, Amazon ELB, Amazon Route53 Health Check, Amorank Spider, Analytics SEO Crawler, Ant, Anthropic AI, ApacheBench, Applebot, AppSignalBot, Arachni, archive.org bot, ArchiveBot, ArchiveBox, Arquivo.pt, ARSNova Filter System, Asana, Ask Jeeves, AspiegelBot, Automattic Analytics, Awario, Backlink-Check.de, BacklinkCrawler, BackupLand, Baidu Spider, Barkrowler, Barracuda Sentinel, BazQux Reader, BBC Forge URL Monitor, BBC Page Monitor, BDCbot, BDFetch, Better Uptime Bot, BingBot, Birdcrawlerbot, BitlyBot, BitSight, Blackbox Exporter, Blekkobot, BLEXBot Crawler, Bloglines, Bloglovin, Blogtrottr, BoardReader, BoardReader Blog Indexer, Botify, Bountii Bot, BrandVerity, Bravebot, BrightBot, BrightEdge, Browsershots, BUbiNG, Buck, BuiltWith, Butterfly Robot, Bytespider, CareerBot, Castopod, Castro 2, Catchpoint, CATExplorador, ccBot crawler, CensysInspect, Charlotte, Chartable, ChatGPT-User, CheckHost, CheckMark Network, Choosito, Chrome Privacy Preserving Prefetch Proxy, Cincraw, CISPA Web Analyzer, CLASSLA-web, ClaudeBot, Clickagy, Cliqzbot, CloudFlare Always Online, CloudFlare AMP Fetcher, Cloudflare Custom Hostname Verification, Cloudflare Diagnostics, Cloudflare Health Checks, Cloudflare Observatory, Cloudflare Security Insights, Cloudflare Smart Transit, Cloudflare SSL Detector, Cloudflare Traffic Manager, CloudServerMarketSpider, Cocolyzebot, Cohere AI, Collectd, colly, CommaFeed, COMODO DCV, Comscore, ContentKing, Convertify, Cookiebot, Crawldad, Crawlson, Crawly Project, CriteoBot, CrowdTangle, CSS Certificate Spider, CSSCheck, CyberFind Crawler, Cyberscan, Cốc Cốc Bot, DaspeedBot, Datadog Agent, DataForSeoBot, datagnionbot, Datanyze, Dataprovider, DataXu, Daum, Dazoobot, Deepfield Genome, deepnoc, Deep SEARCH 9, DepSpid, Detectify, Diffbot, Discobot, Discord Bot, Disqus, DNSResearchBot, DomainAppender, Domain Codex, DomainCrawler, Domain Re-Animator Bot, Domain Research Project, Domains Project, DomainStatsBot, DomCop Bot, DotBot, Dotcom Monitor, Dubbotbot, DuckAssistBot, DuckDuckBot, ducks.party, DuplexWeb-Google, DynatraceSynthetic, Easou Spider, eCairn-Grabber, EFF Do Not Track Verifier, Elastic Synthetics, EMail Exractor, EmailWolf, Embedly, Entfer, evc-batch, Everyfeed, ExaBot, ExactSeek Crawler, Example3, Exchange check, Expanse, EyeMonit, Ezgif, Ezooms, eZ Publish Link Validator, FacebookBot, Facebook Crawler, Faveeo, Feedbin, FeedBurner, Feedly, Feedspot, Feed Wrangler, Femtosearch, Fever, Findxbot, Flipboard, FontRadar, fragFINN, FreeWebMonitoring, FreshRSS, Functionize, Gaisbot, GDNP, GeedoBot, GeedoProductSearch, Generic Bot, Genieo Web filter, Ghost Inspector, Gigablast, Gigabot, GitCrawlerBot, GitHubCopilotChat, Gluten Free Crawler, Gmail Image Proxy, Gobuster, Golfe, Goo, Google-CloudVertexBot, Google-Document-Conversion, Google-Safety, Google Apps Script, Google Area 120 Privacy Policy Fetcher, Googlebot, Googlebot News, Google Cloud Scheduler, Google Docs, Google Favicon, Google PageSpeed Insights, Google Partner Monitoring, Google Search Console, Google Sheets, Google Slides, Google Stackdriver Monitoring, Google StoreBot, Google Structured Data Testing Tool, Google Transparency Report, Gowikibot, Gozle, GPTBot, Grammarly, Grapeshot, Gregarius, GTmetrix, GumGum Verity, hackermention, Hatena Bookmark, Hatena Favicon, Headline, Heart Rails Capture, Heritrix, Heureka Feed, htmlyse, HTTPMon, httpx, HuaweiWebCatBot, HubPages, HubSpot, ICC-Crawler, ichiro, IDG/IT, Iframely, IIS Site Analysis, ImageSift, Inetdex Bot, Infegy, InfoTigerBot, Inktomi Slurp, inoreader, Inspici, InsytfulBot, Intelligence X, Interactsh, InternetMeasurement, IONOS Crawler, IP-Guide Crawler, IPIP, IPS Agent, IsItWP, iTMS, JobboerseBot, JungleKeyThumbnail, K6, KadoBot, Kaspersky, KeyCDN Tools, Keys.so, Kiwi TCMS GitOps, KlarnaBot, KomodiaBot, Konturbot, Kouio, Kozmonavt, KStandBot, l9explore, l9tcpid, LAC IA Harvester, Larbin web crawler, LastMod Bot, LCC, leak.info, LeakIX, Let's Encrypt Validation, LetSearch, Lighthouse, Linespider, Linkdex Bot, LinkedIn Bot, LinkpadBot, LinkPreview, LinkWalker, LiveJournal, LTX71, Lumar, LumtelBot, Lycos, MaCoCu, MADBbot, Magpie-Crawler, MagpieRSS, Mail.Ru Bot, MakeMerryBot, Marginalia, MariaDB/MySQL Knowledge Base, masscan, masscan-ng, Mastodon Bot, Matomo, Meanpath Bot, Mediatoolkit Bot, MegaIndex, MeltwaterNews, Meta-ExternalAgent, Meta-ExternalFetcher, MetaInspector, MetaJobBot, MicroAdBot, Microsoft Preview, Miniature.io, Mixnode, Mixrank Bot, MJ12 Bot, Mnogosearch, MojeekBot, Monitor.Us, Monitor Backlinks, Monsidobot, Montastic Monitor, MoodleBot Linkchecker, Morningscore Bot, MTRobot, MuckRack, Munin, MuscatFerret, Nagios check_http, NalezenCzBot, NameProtectBot, nbertaupete95, Neevabot, Netcraft Survey Bot, netEstate, NetLyzer FastProbe, Netpeak Checker, NetResearchServer, NetSystemsResearch, NetTrack, Netvibes, NETZZAPPEN, NewsBlur, NewsGator, Newslitbot, NiceCrawler, Nimbostratus Bot, NLCrawler, Nmap, NodePing, Notify Ninja, Nutch-based Bot, Nuzzel, OAI-SearchBot, oBot, Octopus, Odin, Odnoklassniki Bot, Oh Dear, Omgili bot, OmtrBot, Onalytica, OnlineOrNot Bot, Openindex Spider, OpenLinkProfiler, OpenWebSpider, Orange Bot, OSZKbot, Outbrain, Overcast Podcast Sync, OWLer, Pageburst, Page Modified Pinger, PagePeeker, PageThing, Pandalytics, Panscient, PaperLiBot, Paqlebot, parse.ly, PATHspider, PayPal IPN, PDR Labs, Peer39, PerplexityBot, Petal Bot, Phantomas, phpMyAdmin, PHP Server Monitor, Picsearch bot, PingAdmin.Ru, Pingdom Bot, Pinterest, PiplBot, Plesk Screenshot Service, Plukkie, Pocket, Podroll Analyzer, PodUptime, Pompos, Prerender, PritTorrent, Probely, Project Patchwatch, Project Resonance, Prometheus, PRTG Network Monitor, Punk Map, Quantcast, QuerySeekerSpider, Quora Bot, Quora Link Preview, Qwantbot, Rainmeter, RamblerMail Image Proxy, RavenCrawler, Reddit Bot, RedekenBot, RenovateBot, Repo Lookout, ReqBin, Research Scan, Riddler, Robozilla, RocketMonitorBot, Rogerbot, ROI Hunter, RSSRadio Bot, RuxitSynthetic, Ryowl, SabsimBot, SafeDNSBot, Sandoba//Crawler, Scamadviser External Hit, Scooter, ScoutJet, Scraping Robot, Scrapy, Screaming Frog SEO Spider, ScreenerBot, Sectigo DCV, security.txt scanserver, Seekport, Sellers.Guide, semaltbot, Semantic Scholar Bot, SemrushBot, Semrush Reputation Management, Sensika Bot, Sentry Bot, Senuto, Seobility, SEOENGBot, SEOkicks, SEOkicks-Robot, seolyt, Seolyt Bot, Seoscanners.net, Serendeputy Bot, Serenety, serpstatbot, Server Density, Seznam Bot, Seznam Email Proxy, Seznam Zbozi.cz, sfFeedReader, ShopAlike, Shopify Partner, ShopWiki, SilverReader, SimplePie, Sirdata, SISTRIX Crawler, SISTRIX Optimizer, Site24x7 Defacement Monitor, Site24x7 Website Monitoring, SiteAuditBot, Sitebulb, Siteimprove, SitemapParser-VIPnytt, SiteOne Crawler, SiteScore, SiteSucker, Sixy.ch, Skype URI Preview, Slackbot, SMTBot, Snapchat Ads, Snapchat Proxy, Snap URL Preview Service, Sogou Spider, Soso Spider, Sparkler, Spawning AI, SpazioDati, Speedy, SpiderLing, Spinn3r, SplitSignalBot, Spotify, Sprinklr, Sputnik Bot, Sputnik Favicon Bot, Sputnik Image Bot, sqlmap, SSL Labs, start.me, Startpagina Linkchecker, Statista, StatOnline.ru, StatusCake, Steam Chat URL Lookup, Steve Bot, Stract, Sublinq, Substack Content Fetch, Superfeedr Bot, SurdotlyBot, Survey Bot, Swiftbot, Swisscows Favicons, Synapse, t3versions, Taboolabot, TactiScout, Tag Inspector, Tarmot Gezgin, tchelebi, TelegramBot, Tenable.asm, TestCrawler, The British Library Legal Deposit Bot, The Knowledge AI, theoldreader, The Trade Desk Content, ThinkChaos, ThousandEyes, TigerBot, Timpibot, TinEye, TinEye Crawler, Tiny Tiny RSS, TLSProbe, TraceMyFile, Trendiction Bot, Trendsmap, Turnitin, TurnitinBot, TweetedTimes Bot, Tweetmeme Bot, Twingly Recon, Twitterbot, Twurly, UCSB Network Measurement, UkrNet Mail Proxy, uMBot, UniversalFeedParser, Uptime-Kuma, Uptimebot, UptimeRobot, Uptimia, URLAppendBot, URLinspector, URLSuMaBot, Vagabondo, ValidBot, Velen Public Web Crawler, Vercel Bot, VeryHip, Viber Url Downloader, VirusTotal Cloud, Visual Site Mapper Crawler, VK Robot, VK Share Button, vuhuvBot, VU Server Health Scanner, W3C CSS Validator, W3C I18N Checker, W3C Link Checker, W3C Markup Validation Service, W3C MobileOK Checker, W3C P3P Validator, W3C Unified Validator, Wappalyzer, WDG HTML Validator, WebbCrawler, WebCEO, WebDataStats, WebMon, Weborama, WebPageTest, WebPros, Website-info, WebSitePulse, WebThumbnail, webtru, Webwiki, WellKnownBot, WeSEE:Search, WeViKaBot, WhatCMS, WhatsMyIP.org, WhereGoes, Who.is Bot, Wibybot, WikiDo, Willow Internet Crawler, WireReaderBot, WooRank, WordPress, WordPress.com mShots, Workona, Wotbox, wp.com feedbot, XenForo, XoviBot, YaCy, Yahoo! Cache System, Yahoo! Japan, Yahoo! Japan ASR, Yahoo! Japan BRW, Yahoo! Japan WSC, Yahoo! Link Preview, Yahoo! Mail Proxy, Yahoo! Slurp, Yahoo Gemini, YaK, Yandex Bot, Yeti/Naverbot, Yottaa Site Monitor, YouBot, Youdao Bot, Yourls, Yunyun Bot, Zaldamo, Zao, Ze List, Zeno, zgrab, Zookabot, ZoomBot, ZoominfoBot, Zotero Translation Server, ZumBot \ No newline at end of file diff --git a/device_detector.go b/device_detector.go index 11372bc..3ec35c1 100644 --- a/device_detector.go +++ b/device_detector.go @@ -1,97 +1,97 @@ package devicedetector import ( - "path/filepath" + "embed" + "path" "strings" regexp "github.com/dlclark/regexp2" gover "github.com/mcuadros/go-version" - . "github.com/gamebtc/devicedetector/parser" - "github.com/gamebtc/devicedetector/parser/client" - "github.com/gamebtc/devicedetector/parser/device" + "github.com/slipros/devicedetector/parser" + "github.com/slipros/devicedetector/parser/client" + "github.com/slipros/devicedetector/parser/device" ) +//go:embed regexes/* +var EmbeddedRegexes embed.FS + const UNKNOWN = "UNK" -const VERSION = `3.12.5` +const VERSION = `6.4.7` var desktopOsArray = []string{ - `AmigaOS`, - `IBM`, - `GNU/Linux`, - `Mac`, - `Unix`, - `Windows`, - `BeOS`, - `Chrome OS`, + `AmigaOS`, `IBM`, `GNU/Linux`, `Mac`, `Unix`, `Windows`, `BeOS`, `Chrome OS`, `Chromium OS`, } -var( +var ( chrMobReg = regexp.MustCompile(fixUserAgentRegEx(`Chrome/[\.0-9]* Mobile`), regexp.IgnoreCase) chrTabReg = regexp.MustCompile(fixUserAgentRegEx(`Chrome/[\.0-9]* (?!Mobile)`), regexp.IgnoreCase) opaTabReg = regexp.MustCompile(fixUserAgentRegEx(`Opera Tablet`), regexp.IgnoreCase) - opaTvReg = regexp.MustCompile(fixUserAgentRegEx(`Opera TV Store`), regexp.IgnoreCase) + opaTvReg = regexp.MustCompile(fixUserAgentRegEx(`Opera TV Store`), regexp.IgnoreCase) ) func fixUserAgentRegEx(regex string) string { reg := strings.ReplaceAll(regex, `/`, `\/`) reg = strings.ReplaceAll(reg, `++`, `+`) + return `(?:^|[^A-Z_-])(?:` + reg + `)` } type DeviceDetector struct { deviceParsers []device.DeviceParser clientParsers []client.ClientParser - botParsers []BotParser - osParsers []OsParser - vendorParser *VendorFragments + botParsers []parser.BotParser + osParsers []parser.OsParser + vendorParser *parser.VendorFragments DiscardBotInformation bool SkipBotDetection bool } -func NewDeviceDetector(dir string) (*DeviceDetector, error) { - vp, err := NewVendor(filepath.Join(dir, FixtureFileVendor)) +func NewDeviceDetector() (*DeviceDetector, error) { + parser.ReadFile = EmbeddedRegexes.ReadFile + + return newDeviceDetector("./regexes") +} + +func newDeviceDetector(dir string) (*DeviceDetector, error) { + vp, err := parser.NewVendor(path.Join(dir, parser.FixtureFileVendor)) if err != nil { return nil, err } - osp, err := NewOss(filepath.Join(dir, FixtureFileOs)) + osp, err := parser.NewOss(path.Join(dir, parser.FixtureFileOs)) if err != nil { return nil, err } - d := &DeviceDetector{ + return &DeviceDetector{ vendorParser: vp, - osParsers: []OsParser{osp}, - } - - clientDir := filepath.Join(dir, "client") - d.clientParsers = client.NewClientParsers(clientDir, - []string{ - client.ParserNameFeedReader, - client.ParserNameMobileApp, - client.ParserNameMediaPlayer, - client.ParserNamePim, - client.ParserNameBrowser, - client.ParserNameLibrary, - }) - - deviceDir := filepath.Join(dir, "device") - d.deviceParsers = device.NewDeviceParsers(deviceDir, - []string{ - device.ParserNameHbbTv, - device.ParserNameConsole, - device.ParserNameCar, - device.ParserNameCamera, - device.ParserNamePortableMediaPlayer, - device.ParserNameMobile, - }) - - d.botParsers = []BotParser{ - NewBot(filepath.Join(dir, FixtureFileBot)), - } - - - return d, nil + osParsers: []parser.OsParser{osp}, + clientParsers: client.NewClientParsers( + path.Join(dir, "client"), + []string{ + client.ParserNameFeedReader, + client.ParserNameMobileApp, + client.ParserNameMediaPlayer, + client.ParserNamePim, + client.ParserNameBrowser, + client.ParserNameLibrary, + }, + ), + deviceParsers: device.NewDeviceParsers( + path.Join(dir, "device"), + []string{ + device.ParserNameHbbTv, + device.ParserNameConsole, + device.ParserNameCar, + device.ParserNameCamera, + device.ParserNamePortableMediaPlayer, + device.ParserNameMobile, + }, + ), + botParsers: []parser.BotParser{ + parser.NewBot(path.Join(dir, parser.FixtureFileBot)), + }, + }, nil } func (d *DeviceDetector) AddClientParser(cp client.ClientParser) { @@ -110,19 +110,19 @@ func (d *DeviceDetector) GetDeviceParsers() []device.DeviceParser { return d.deviceParsers } -func (d *DeviceDetector) AddBotParser(op BotParser) { +func (d *DeviceDetector) AddBotParser(op parser.BotParser) { d.botParsers = append(d.botParsers, op) } -func (d *DeviceDetector) GetBotParsers() []BotParser { +func (d *DeviceDetector) GetBotParsers() []parser.BotParser { return d.botParsers } -func (d *DeviceDetector) ParseBot(ua string) *BotMatchResult { +func (d *DeviceDetector) ParseBot(ua string) *parser.BotMatchResult { if !d.SkipBotDetection { - for _, parser := range d.botParsers { - parser.DiscardDetails(d.DiscardBotInformation) - if r := parser.Parse(ua); r != nil { + for _, p := range d.botParsers { + p.DiscardDetails(d.DiscardBotInformation) + if r := p.Parse(ua); r != nil { return r } } @@ -130,7 +130,7 @@ func (d *DeviceDetector) ParseBot(ua string) *BotMatchResult { return nil } -func (d *DeviceDetector) ParseOs(ua string) *OsMatchResult { +func (d *DeviceDetector) ParseOs(ua string) *parser.OsMatchResult { for _, p := range d.osParsers { if r := p.Parse(ua); r != nil { return r @@ -140,8 +140,8 @@ func (d *DeviceDetector) ParseOs(ua string) *OsMatchResult { } func (d *DeviceDetector) ParseClient(ua string) *client.ClientMatchResult { - for _, parser := range d.clientParsers { - if r := parser.Parse(ua); r != nil { + for _, p := range d.clientParsers { + if r := p.Parse(ua); r != nil { return r } } @@ -149,8 +149,8 @@ func (d *DeviceDetector) ParseClient(ua string) *client.ClientMatchResult { } func (d *DeviceDetector) ParseDevice(ua string) *device.DeviceMatchResult { - for _, parser := range d.deviceParsers { - if r := parser.Parse(ua); r != nil { + for _, p := range d.deviceParsers { + if r := p.Parse(ua); r != nil { return r } } @@ -171,7 +171,7 @@ func (d *DeviceDetector) parseInfo(info *DeviceInfo) { os := info.GetOs() osShortName := os.ShortName - osFamily := GetOsFamily(osShortName) + osFamily := parser.GetOsFamily(osShortName) osVersion := os.Version cmr := info.GetClient() @@ -179,72 +179,72 @@ func (d *DeviceDetector) parseInfo(info *DeviceInfo) { info.Brand = `AP` } - deviceType := GetDeviceType(info.Type) + deviceType := parser.GetDeviceType(info.Type) // Chrome on Android passes the device type based on the keyword 'Mobile' // If it is present the device should be a smartphone, otherwise it's a tablet // See https://developer.chrome.com/multidevice/user-agent#chrome_for_android_user_agent - if deviceType == DEVICE_TYPE_INVALID && osFamily == `Android` { - if browserName,ok:=client.GetBrowserFamily(cmr.ShortName); ok&&browserName== `Chrome` { + if deviceType == parser.DEVICE_TYPE_INVALID && osFamily == `Android` { + if browserName, ok := client.GetBrowserFamily(cmr.ShortName); ok && browserName == `Chrome` { if ok, _ := chrMobReg.MatchString(ua); ok { - deviceType = DEVICE_TYPE_SMARTPHONE + deviceType = parser.DEVICE_TYPE_SMARTPHONE } else if ok, _ = chrTabReg.MatchString(ua); ok { - deviceType = DEVICE_TYPE_TABLET + deviceType = parser.DEVICE_TYPE_TABLET } } } - if deviceType == DEVICE_TYPE_INVALID { + if deviceType == parser.DEVICE_TYPE_INVALID { if info.HasAndroidMobileFragment() { - deviceType = DEVICE_TYPE_TABLET + deviceType = parser.DEVICE_TYPE_TABLET } else if ok, _ := opaTabReg.MatchString(ua); ok { - deviceType = DEVICE_TYPE_TABLET + deviceType = parser.DEVICE_TYPE_TABLET } else if info.HasAndroidMobileFragment() { - deviceType = DEVICE_TYPE_SMARTPHONE + deviceType = parser.DEVICE_TYPE_SMARTPHONE } else if osShortName == "AND" && osVersion != "" { if gover.CompareSimple(osVersion, `2.0`) == -1 { - deviceType = DEVICE_TYPE_SMARTPHONE + deviceType = parser.DEVICE_TYPE_SMARTPHONE } else if gover.CompareSimple(osVersion, `3.0`) >= 0 && gover.CompareSimple(osVersion, `4.0`) == -1 { - deviceType = DEVICE_TYPE_TABLET + deviceType = parser.DEVICE_TYPE_TABLET } } } // All detected feature phones running android are more likely a smartphone - if deviceType == DEVICE_TYPE_FEATURE_PHONE && osFamily == `Android` { - deviceType = DEVICE_TYPE_SMARTPHONE + if deviceType == parser.DEVICE_TYPE_FEATURE_PHONE && osFamily == `Android` { + deviceType = parser.DEVICE_TYPE_SMARTPHONE } // According to http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx - if deviceType == DEVICE_TYPE_INVALID && + if deviceType == parser.DEVICE_TYPE_INVALID && (osShortName == `WRT` || (osShortName == `WIN` && gover.CompareSimple(osVersion, `8`) >= 0)) && info.IsTouchEnabled() { - deviceType = DEVICE_TYPE_TABLET + deviceType = parser.DEVICE_TYPE_TABLET } // All devices running Opera TV Store are assumed to be a tv if ok, _ := opaTvReg.MatchString(ua); ok { - deviceType = DEVICE_TYPE_TV + deviceType = parser.DEVICE_TYPE_TV } // Devices running Kylo or Espital TV Browsers are assumed to be a TV - if deviceType == DEVICE_TYPE_INVALID { + if deviceType == parser.DEVICE_TYPE_INVALID { if cmr.Name == `Kylo` || cmr.Name == `Espial TV Browser` { - deviceType = DEVICE_TYPE_TV + deviceType = parser.DEVICE_TYPE_TV } else if info.IsDesktop() { - deviceType = DEVICE_TYPE_DESKTOP + deviceType = parser.DEVICE_TYPE_DESKTOP } } - if deviceType != DEVICE_TYPE_INVALID { - info.Type = GetDeviceName(deviceType) + if deviceType != parser.DEVICE_TYPE_INVALID { + info.Type = parser.GetDeviceName(deviceType) } return } func (d *DeviceDetector) Parse(ua string) *DeviceInfo { // skip parsing for empty useragents or those not containing any letter - if !StringContainsLetter(ua) { + if !parser.StringContainsLetter(ua) { return nil } @@ -268,4 +268,3 @@ func (d *DeviceDetector) Parse(ua string) *DeviceInfo { return info } - diff --git a/device_info.go b/device_info.go index 4d09caf..4ac829e 100644 --- a/device_info.go +++ b/device_info.go @@ -3,9 +3,9 @@ package devicedetector import ( regexp "github.com/dlclark/regexp2" - . "github.com/gamebtc/devicedetector/parser" - "github.com/gamebtc/devicedetector/parser/client" - "github.com/gamebtc/devicedetector/parser/device" + . "github.com/slipros/devicedetector/parser" + "github.com/slipros/devicedetector/parser/client" + "github.com/slipros/devicedetector/parser/device" ) var ( @@ -17,9 +17,9 @@ var ( type DeviceInfo struct { userAgent string device.DeviceMatchResult - client *client.ClientMatchResult - os *OsMatchResult - bot *BotMatchResult + client *client.ClientMatchResult + os *OsMatchResult + bot *BotMatchResult } func (d *DeviceInfo) GetDeviceType() int { diff --git a/device_test.go b/device_test.go index 4d76548..7586822 100644 --- a/device_test.go +++ b/device_test.go @@ -8,12 +8,12 @@ import ( "gotest.tools/assert" regexp "github.com/dlclark/regexp2" - . "github.com/gamebtc/devicedetector/parser" - "github.com/gamebtc/devicedetector/parser/client" - "github.com/gamebtc/devicedetector/parser/device" + . "github.com/slipros/devicedetector/parser" + "github.com/slipros/devicedetector/parser/client" + "github.com/slipros/devicedetector/parser/device" ) -var dd, _ = NewDeviceDetector("regexes") +var dd, _ = newDeviceDetector("regexes") func TestParseInvalidUA(t *testing.T) { info := dd.Parse(`12345`) @@ -24,17 +24,17 @@ func TestParseInvalidUA(t *testing.T) { func TestInstanceReusage(t *testing.T) { userAgents := [][]string{ - []string{ + { `Sraf/3.0 (Linux i686 ; U; HbbTV/1.1.1 (+PVR+DL;NEXtUS; TV44; sw1.0) CE-HTML/1.0 Config(L:eng,CC:DEU); en/de)`, ``, ``, }, - []string{ + { `Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `Archos`, `101 PLATINUM`, }, - []string{ + { `Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Vestel; MB95; 1.0; 1.0; ); en) Presto/2.10.287 Version/12.00`, `Vestel`, `MB95`, @@ -50,11 +50,11 @@ func TestInstanceReusage(t *testing.T) { func TestVersionTruncation(t *testing.T) { data := map[int][]string{ - VERSION_TRUNCATION_NONE: []string{`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4.2.2`, `34.0.1847.114`}, - VERSION_TRUNCATION_BUILD: []string{`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4.2.2`, `34.0.1847.114`}, - VERSION_TRUNCATION_PATCH: []string{`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4.2.2`, `34.0.1847`}, - VERSION_TRUNCATION_MINOR: []string{`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4.2`, `34.0`}, - VERSION_TRUNCATION_MAJOR: []string{`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4`, `34`}, + VERSION_TRUNCATION_NONE: {`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4.2.2`, `34.0.1847.114`}, + VERSION_TRUNCATION_BUILD: {`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4.2.2`, `34.0.1847.114`}, + VERSION_TRUNCATION_PATCH: {`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4.2.2`, `34.0.1847`}, + VERSION_TRUNCATION_MINOR: {`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4.2`, `34.0`}, + VERSION_TRUNCATION_MAJOR: {`Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 PLATINUM Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36`, `4`, `34`}, } for k, v := range data { SetVersionTruncation(k) @@ -205,4 +205,4 @@ func TestRegThread(t *testing.T) { } } wg.Wait() -} \ No newline at end of file +} diff --git a/go.mod b/go.mod index 05f4819..0133ad6 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,15 @@ -module github.com/gamebtc/devicedetector +module github.com/slipros/devicedetector -go 1.13 +go 1.23 require ( - github.com/dlclark/regexp2 v1.2.0 - github.com/google/go-cmp v0.3.1 + github.com/dlclark/regexp2 v1.11.5 github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 - github.com/pkg/errors v0.8.1 // indirect - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v2 v2.4.0 gotest.tools v2.2.0+incompatible ) + +require ( + github.com/google/go-cmp v0.6.0 // indirect + github.com/pkg/errors v0.9.1 // indirect +) diff --git a/go.sum b/go.sum index de34c5e..9e91f54 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,16 @@ -github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= +github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= +github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 h1:YocNLcTBdEdvY3iDK6jfWXvEaM5OCKkjxPKoJRdB3Gg= github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= diff --git a/parser/bot.go b/parser/bot.go index ded2b89..46f99c8 100644 --- a/parser/bot.go +++ b/parser/bot.go @@ -1,6 +1,8 @@ package parser -import "path/filepath" +import ( + "path" +) var botFactory = make(map[string]func(string) BotParser) @@ -26,7 +28,7 @@ const FixtureFileBot = `bots.yml` func init() { RegBotParser(ParserNameBot, func(dir string) BotParser { - return NewBot(filepath.Join(dir, FixtureFileBot)) + return NewBot(path.Join(dir, FixtureFileBot)) }) } diff --git a/parser/bot_test.go b/parser/bot_test.go index e96ec45..3561292 100644 --- a/parser/bot_test.go +++ b/parser/bot_test.go @@ -1,12 +1,13 @@ package parser import ( - "gotest.tools/assert" - "path/filepath" + "path" "testing" + + "gotest.tools/assert" ) -var botParser = NewBot(filepath.Join(dir, FixtureFileBot)) +var botParser = NewBot(path.Join(dir, FixtureFileBot)) func TestGetInfoFromUABot(t *testing.T) { ua := `Googlebot/2.1 (http://www.googlebot.com/bot.html)` diff --git a/parser/client/browser.go b/parser/client/browser.go index d2d9484..e5d1916 100644 --- a/parser/client/browser.go +++ b/parser/client/browser.go @@ -1,95 +1,223 @@ package client import ( - "path/filepath" - + "path" + gover "github.com/mcuadros/go-version" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" ) // Known browsers mapped to their internal short codes var availableBrowsers = map[string]string{ + `V1`: `Via`, + `1P`: `Pure Mini Browser`, + `4P`: `Pure Lite Browser`, + `1R`: `Raise Fast Browser`, + `R1`: `Rabbit Private Browser`, + `FQ`: `Fast Browser UC Lite`, + `FJ`: `Fast Explorer`, + `1L`: `Lightning Browser`, + `1C`: `Cake Browser`, + `1I`: `IE Browser Fast`, + `1V`: `Vegas Browser`, + `1O`: `OH Browser`, + `3O`: `OH Private Browser`, + `1X`: `XBrowser Mini`, + `1S`: `Sharkee Browser`, + `2L`: `Lark Browser`, + `3P`: `Pluma`, + `1A`: `Anka Browser`, + `AZ`: `Azka Browser`, + `1D`: `Dragon Browser`, + `1E`: `Easy Browser`, + `DW`: `Dark Web Browser`, + `D6`: `Dark Browser`, + `18`: `18+ Privacy Browser`, `1B`: `115 Browser`, + `DM`: `1DM Browser`, + `1M`: `1DM+ Browser`, `2B`: `2345 Browser`, + `3B`: `360 Secure Browser`, `36`: `360 Phone Browser`, - `3B`: `360 Browser`, + `7B`: `7654 Browser`, `AA`: `Avant Browser`, `AB`: `ABrowse`, + `4A`: `Acoo Browser`, + `BW`: `AdBlock Browser`, + `A7`: `Adult Browser`, + `8A`: `Ai Browser`, + `A9`: `Airfind Secure Browser`, `AF`: `ANT Fresco`, `AG`: `ANTGalio`, `AL`: `Aloha Browser`, `AH`: `Aloha Browser Lite`, + `A8`: `ALVA`, + `9A`: `AltiBrowser`, `AM`: `Amaya`, + `A3`: `Amaze Browser`, + `A5`: `Amerigo`, `AO`: `Amigo`, `AN`: `Android Browser`, + `3A`: `AOL Explorer`, `AE`: `AOL Desktop`, `AD`: `AOL Shield`, + `A4`: `AOL Shield Pro`, + `2A`: `Aplix`, + `A6`: `AppBrowzer`, + `0A`: `AppTec Secure Browser`, + `AP`: `APUS Browser`, `AR`: `Arora`, `AX`: `Arctic Fox`, `AV`: `Amiga Voyager`, `AW`: `Amiga Aweb`, + `PN`: `APN Browser`, + `6A`: `Arachne`, + `RA`: `Arc Search`, + `R5`: `Armorfly Browser`, + `AI`: `Arvin`, + `AK`: `Ask.com`, + `AU`: `Asus Browser`, `A0`: `Atom`, `AT`: `Atomic Web Browser`, + `A2`: `Atlas`, `AS`: `Avast Secure Browser`, `VG`: `AVG Secure Browser`, + `AC`: `Avira Secure Browser`, + `A1`: `AwoX`, + `7A`: `Awesomium`, + `5B`: `Basic Web Browser`, `BA`: `Beaker Browser`, `BM`: `Beamrise`, + `F7`: `BF Browser`, `BB`: `BlackBerry Browser`, + `6B`: `Bluefy`, + `H1`: `BrowseHere`, + `B8`: `Browser Hup Pro`, `BD`: `Baidu Browser`, `BS`: `Baidu Spark`, + `BG`: `Bang`, + `B9`: `Bangla Browser`, `BI`: `Basilisk`, + `BV`: `Belva Browser`, + `B5`: `Beyond Private Browser`, `BE`: `Beonex`, + `B2`: `Berry Browser`, + `BT`: `Bitchute Browser`, + `9B`: `BizBrowser`, `BH`: `BlackHawk`, + `B0`: `Bloket`, `BJ`: `Bunjalloo`, `BL`: `B-Line`, + `B6`: `Black Lion Browser`, + `BU`: `Blue Browser`, + `BO`: `Bonsai`, + `BN`: `Borealis Navigator`, `BR`: `Brave`, `BK`: `BriskBard`, + `K2`: `BroKeep Browser`, + `B3`: `Browspeed Browser`, `BX`: `BrowseX`, + `BZ`: `Browzar`, + `B7`: `Browlser`, + `M9`: `Browser Mini`, + `4B`: `BrowsBit`, + `BY`: `Biyubi`, + `BF`: `Byffox`, + `B4`: `BXE Browser`, `CA`: `Camino`, + `5C`: `Catalyst`, + `XP`: `Catsxp`, + `0C`: `Cave Browser`, `CL`: `CCleaner`, + `C8`: `CG Browser`, + `CJ`: `ChanjetCloud`, + `C6`: `Chedot`, + `C9`: `Cherry Browser`, `C0`: `Centaury`, + `CQ`: `Cliqz`, `CC`: `Coc Coc`, + `C4`: `CoolBrowser`, `C2`: `Colibri`, + `6C`: `Columbus Browser`, `CD`: `Comodo Dragon`, `C1`: `Coast`, `CX`: `Charon`, `CE`: `CM Browser`, + `C7`: `CM Mini`, `CF`: `Chrome Frame`, `HC`: `Headless Chrome`, `CH`: `Chrome`, `CI`: `Chrome Mobile iOS`, `CK`: `Conkeror`, `CM`: `Chrome Mobile`, + `3C`: `Chowbo`, + `7C`: `Classilla`, `CN`: `CoolNovo`, + `4C`: `Colom Browser`, `CO`: `CometBird`, + `2C`: `Comfort Browser`, `CB`: `COS Browser`, + `CW`: `Cornowser`, + `C3`: `Chim Lac`, `CP`: `ChromePlus`, `CR`: `Chromium`, + `C5`: `Chromium GOST`, `CY`: `Cyberfox`, `CS`: `Cheshire`, + `8C`: `Cromite`, + `RC`: `Crow Browser`, `CT`: `Crusta`, + `CG`: `Craving Explorer`, + `CZ`: `Crazy Browser`, `CU`: `Cunaguaro`, `CV`: `Chrome Webview`, + `YC`: `CyBrowser`, `DB`: `dbrowser`, + `PD`: `Peeps dBrowser`, + `DK`: `Dark Web`, + `DP`: `Dark Web Private`, + `D1`: `Debuggable Browser`, + `DC`: `Decentr`, `DE`: `Deepnet Explorer`, + `DG`: `deg-degan`, + `DA`: `Deledao`, `DT`: `Delta Browser`, + `D0`: `Desi Browser`, + `DS`: `DeskBrowse`, + `D3`: `Dezor`, + `II`: `Diigo Browser`, + `D2`: `DoCoMo`, `DF`: `Dolphin`, + `DZ`: `Dolphin Zero`, `DO`: `Dorado`, + `DR`: `Dot Browser`, `DL`: `Dooble`, `DI`: `Dillo`, + `DU`: `DUC Browser`, `DD`: `DuckDuckGo Privacy Browser`, + `E1`: `East Browser`, `EC`: `Ecosia`, + `EW`: `Edge WebView`, + `EV`: `Every Browser`, `EI`: `Epic`, `EL`: `Elinks`, + `EN`: `EinkBro`, `EB`: `Element Browser`, `EE`: `Elements Browser`, + `EO`: `Eolie`, + `EX`: `Explore Browser`, `EZ`: `eZ Browser`, + `E2`: `EudoraWeb`, `EU`: `EUI Browser`, `EP`: `GNOME Web`, + `G1`: `G Browser`, `ES`: `Espial TV Browser`, + `FG`: `fGet`, `FA`: `Falkon`, `FX`: `Faux Browser`, + `F8`: `Fire Browser`, + `F4`: `Fiery Browser`, `F1`: `Firefox Mobile iOS`, `FB`: `Firebird`, `FD`: `Fluid`, @@ -98,85 +226,206 @@ var availableBrowsers = map[string]string{ `FK`: `Firefox Focus`, `FY`: `Firefox Reality`, `FR`: `Firefox Rocket`, + `1F`: `Firefox Klar`, + `F0`: `Float Browser`, `FL`: `Flock`, + `FP`: `Floorp`, + `FO`: `Flow`, + `F2`: `Flow Browser`, `FM`: `Firefox Mobile`, `FW`: `Fireweb`, `FN`: `Fireweb Navigator`, + `FH`: `Flash Browser`, + `FS`: `Flast`, + `F5`: `Flyperlink`, + `F9`: `FOSS Browser`, `FU`: `FreeU`, + `F6`: `Freedom Browser`, + `FT`: `Frost`, + `F3`: `Frost+`, + `FI`: `Fulldive`, `GA`: `Galeon`, + `G8`: `Gener8`, + `GH`: `Ghostery Privacy Browser`, + `GI`: `GinxDroid Browser`, `GB`: `Glass Browser`, + `GD`: `Godzilla Browser`, + `G3`: `Good Browser`, `GE`: `Google Earth`, + `GP`: `Google Earth Pro`, + `GO`: `GOG Galaxy`, + `GR`: `GoBrowser`, + `GK`: `GoKu`, + `G2`: `GO Browser`, + `RN`: `GreenBrowser`, + `HW`: `Habit Browser`, + `H7`: `Halo Browser`, + `HB`: `Harman Browser`, + `HS`: `HasBrowser`, `HA`: `Hawk Turbo Browser`, + `HQ`: `Hawk Quick Browser`, + `HE`: `Helio`, + `HN`: `Herond Browser`, + `HX`: `Hexa Web Browser`, + `H8`: `HeyTapBrowser`, + `HI`: `Hi Browser`, `HO`: `hola! Browser`, + `H4`: `Holla Web Browser`, + `H5`: `HotBrowser`, `HJ`: `HotJava`, - `HU`: `Huawei Browser`, + `H6`: `HONOR Browser`, + `HT`: `HTC Browser`, + `HU`: `Huawei Browser Mobile`, + `HP`: `Huawei Browser`, + `H3`: `HUB Browser`, + `IO`: `iBrowser`, + `IS`: `iBrowser Mini`, `IB`: `IBrowse`, + `I6`: `iDesktop PC Browser`, `IC`: `iCab`, `I2`: `iCab Mobile`, + `4I`: `iNet Browser`, `I1`: `Iridium`, `I3`: `Iron Mobile`, `I4`: `IceCat`, `ID`: `IceDragon`, `IV`: `Isivioo`, + `I8`: `IVVI Browser`, `IW`: `Iceweasel`, + `2I`: `Impervious Browser`, + `N3`: `Incognito Browser`, + `IN`: `Inspect Browser`, + `I9`: `Insta Browser`, `IE`: `Internet Explorer`, + `I7`: `Internet Browser Secure`, + `5I`: `Internet Webbrowser`, + `3I`: `Intune Managed Browser`, + `I5`: `Indian UC Mini Browser`, + `Z0`: `InBrowser`, + `IG`: `Involta Go`, `IM`: `IE Mobile`, `IR`: `Iron`, + `JB`: `Japan Browser`, `JS`: `Jasmine`, + `JA`: `JavaFX`, + `JL`: `Jelly`, `JI`: `Jig Browser`, `JP`: `Jig Browser Plus`, - `JO`: `Jio Browser`, + `JO`: `JioSphere`, + `JZ`: `JUZI Browser`, `KB`: `K.Browser`, + `KF`: `Keepsafe Browser`, + `K7`: `KeepSolid Browser`, + `KS`: `Kids Safe Browser`, `KI`: `Kindle Browser`, `KM`: `K-meleon`, + `KJ`: `K-Ninja`, `KO`: `Konqueror`, `KP`: `Kapiko`, + `KE`: `Keyboard Browser`, `KN`: `Kinza`, + `K4`: `Kitt`, `KW`: `Kiwi`, + `KD`: `Kode Browser`, + `KU`: `KUN`, + `KT`: `KUTO Mini Browser`, `KY`: `Kylo`, `KZ`: `Kazehakase`, `LB`: `Cheetah Browser`, + `LD`: `Ladybird`, + `LA`: `Lagatos Browser`, + `GN`: `Legan Browser`, + `LR`: `Lexi Browser`, + `LV`: `Lenovo Browser`, `LF`: `LieBaoFast`, `LG`: `LG Browser`, `LH`: `Light`, + `L4`: `Lightning Browser Plus`, + `L1`: `Lilo`, `LI`: `Links`, + `RI`: `Liri Browser`, + `LC`: `LogicUI TV Browser`, + `IF`: `Lolifox`, + `L3`: `Lotus`, `LO`: `Lovense Browser`, + `LT`: `LT Browser`, `LU`: `LuaKit`, + `LJ`: `LUJO TV Browser`, `LL`: `Lulumi`, `LS`: `Lunascape`, `LN`: `Lunascape Lite`, `LX`: `Lynx`, + `L2`: `Lynket Browser`, + `MD`: `Mandarin`, + `MP`: `Maple`, + `M5`: `MarsLab Web Browser`, + `M7`: `MaxBrowser`, `M1`: `mCent`, `MB`: `MicroB`, `MC`: `NCSA Mosaic`, `MZ`: `Meizu Browser`, `ME`: `Mercury`, + `M2`: `Me Browser`, `MF`: `Mobile Safari`, `MI`: `Midori`, + `M3`: `Midori Lite`, + `M6`: `MixerBox AI`, `MO`: `Mobicip`, - `MU`: `MIUI Browser`, + `MU`: `Mi Browser`, `MS`: `Mobile Silk`, + `MK`: `Mogok Browser`, + `M8`: `Motorola Internet Browser`, `MN`: `Minimo`, `MT`: `Mint Browser`, `MX`: `Maxthon`, + `M4`: `MaxTube Browser`, + `MA`: `Maelstrom`, + `3M`: `Mises`, + `MM`: `Mmx Browser`, + `NM`: `MxNitro`, `MY`: `Mypal`, + `MR`: `Monument Browser`, + `MW`: `MAUI WAP Browser`, + `N7`: `Naenara Browser`, + `NW`: `Navigateur Web`, + `NK`: `Naked Browser`, + `NA`: `Naked Browser Pro`, + `NR`: `NFS Browser`, + `N5`: `Ninetails`, `NB`: `Nokia Browser`, `NO`: `Nokia OSS Browser`, `NV`: `Nokia Ovi Browser`, + `N2`: `Norton Private Browser`, `NX`: `Nox Browser`, + `N1`: `NOMone VR Browser`, + `N6`: `NOOK Browser`, `NE`: `NetSurf`, `NF`: `NetFront`, `NL`: `NetFront Life`, `NP`: `NetPositive`, `NS`: `Netscape`, + `WR`: `NextWord Browser`, + `N8`: `Ninesky`, `NT`: `NTENT Browser`, + `NU`: `Nuanti Meta`, + `NI`: `Nuviu`, + `O9`: `Ocean Browser`, `OC`: `Oculus Browser`, + `O6`: `Odd Browser`, `O1`: `Opera Mini iOS`, `OB`: `Obigo`, + `O2`: `Odin`, + `2O`: `Odin Browser`, + `H2`: `OceanHero`, `OD`: `Odyssey Web Browser`, `OF`: `Off By One`, + `O5`: `Office Browser`, `HH`: `OhHai Browser`, + `OL`: `OnBrowser Lite`, `OE`: `ONE Browser`, + `N4`: `Onion Browser`, + `1N`: `ONIONBrowser`, + `Y1`: `Opera Crypto`, `OX`: `Opera GX`, `OG`: `Opera Neon`, `OH`: `Opera Devices`, @@ -185,117 +434,366 @@ var availableBrowsers = map[string]string{ `OP`: `Opera`, `ON`: `Opera Next`, `OO`: `Opera Touch`, + `OU`: `Orbitum`, + `OA`: `Orca`, `OS`: `Ordissimo`, `OR`: `Oregano`, `O0`: `Origin In-Game Overlay`, `OY`: `Origyn Web Browser`, + `O8`: `OrNET Browser`, `OV`: `Openwave Mobile Browser`, + `O3`: `OpenFin`, + `O4`: `Open Browser`, + `4U`: `Open Browser 4U`, + `5G`: `Open Browser fast 5G`, + `5O`: `Open Browser Lite`, + `O7`: `Open TV Browser`, `OW`: `OmniWeb`, `OT`: `Otter Browser`, + `4O`: `Owl Browser`, + `JR`: `OJR Browser`, `PL`: `Palm Blazer`, `PM`: `Pale Moon`, `PY`: `Polypane`, + `8P`: `Prism`, `PP`: `Oppo Browser`, + `P6`: `Opus Browser`, `PR`: `Palm Pre`, - `PU`: `Puffin`, + `2E`: `Pocket Internet Explorer`, + `7I`: `Puffin Cloud Browser`, + `6I`: `Puffin Incognito Browser`, + `PU`: `Puffin Secure Browser`, + `2P`: `Puffin Web Browser`, `PW`: `Palm WebPro`, `PA`: `Palmscape`, + `P7`: `Pawxy`, + `0P`: `Peach Browser`, + `PE`: `Perfect Browser`, + `K6`: `Perk`, + `P1`: `Phantom.me`, + `PH`: `Phantom Browser`, `PX`: `Phoenix`, + `PB`: `Phoenix Browser`, + `5P`: `Photon`, + `N9`: `Pintar Browser`, + `P9`: `PirateBrowser`, + `P8`: `PICO Browser`, + `PF`: `PlayFree Browser`, + `PK`: `PocketBook Browser`, `PO`: `Polaris`, `PT`: `Polarity`, + `LY`: `PolyBrowser`, + `9P`: `Presearch`, + `BP`: `Privacy Browser`, + `PI`: `PrivacyWall`, + `P4`: `Privacy Explorer Fast Safe`, + `X5`: `Privacy Pioneer Browser`, + `P3`: `Private Internet Browser`, + `P5`: `Proxy Browser`, + `7P`: `Proxyium`, + `6P`: `Proxynet`, + `2F`: `ProxyFox`, + `2M`: `ProxyMax`, + `P2`: `Pi Browser`, + `P0`: `PronHub Browser`, + `PC`: `PSI Secure Browser`, + `RW`: `Reqwireless WebViewer`, + `RO`: `Roccat`, `PS`: `Microsoft Edge`, + `QA`: `Qazweb`, + `QI`: `Qiyu`, + `QJ`: `QJY TV Browser`, + `Q3`: `Qmamu`, + `Q4`: `Quick Search TV`, + `Q2`: `QQ Browser Lite`, `Q1`: `QQ Browser Mini`, `QQ`: `QQ Browser`, + `QS`: `Quick Browser`, `QT`: `Qutebrowser`, + `QU`: `Quark`, + `Q6`: `QuarkPC`, + `Q7`: `Quetta`, `QZ`: `QupZilla`, `QM`: `Qwant Mobile`, + `Q5`: `QtWeb`, `QW`: `QtWebEngine`, + `R3`: `Rakuten Browser`, + `R4`: `Rakuten Web Search`, + `R2`: `Raspbian Chromium`, + `RT`: `RCA Tor Explorer`, `RE`: `Realme Browser`, `RK`: `Rekonq`, `RM`: `RockMelt`, + `RB`: `Roku Browser`, `SB`: `Samsung Browser`, + `3L`: `Samsung Browser Lite`, `SA`: `Sailfish Browser`, + `R0`: `SberBrowser`, + `S8`: `Seewo Browser`, `SC`: `SEMC-Browser`, `SE`: `Sogou Explorer`, + `SO`: `Sogou Mobile Browser`, + `RF`: `SOTI Surf`, + `2S`: `Soul Browser`, + `T0`: `Soundy Browser`, `SF`: `Safari`, + `PV`: `Safari Technology Preview`, `S5`: `Safe Exam Browser`, `SW`: `SalamWeb`, + `VN`: `Savannah Browser`, + `SD`: `SavySoda`, + `S9`: `Secure Browser`, + `SV`: `SFive`, `SH`: `Shiira`, + `K1`: `Sidekick`, `S1`: `SimpleBrowser`, + `3S`: `SilverMob US`, + `ZB`: `Singlebox`, `SY`: `Sizzy`, + `K3`: `Skye`, `SK`: `Skyfire`, + `KL`: `SkyLeap`, `SS`: `Seraphic Sraf`, + `KK`: `SiteKiosk`, `SL`: `Sleipnir`, + `8B`: `SlimBoat`, + `S6`: `Slimjet`, + `S7`: `SP Browser`, + `9S`: `Sony Small Browser`, + `8S`: `Secure Private Browser`, + `X2`: `SecureX`, + `T1`: `Stampy Browser`, + `7S`: `7Star`, + `SQ`: `Smart Browser`, + `6S`: `Smart Search & Web Browser`, + `LE`: `Smart Lenovo Browser`, + `OZ`: `Smooz`, `SN`: `Snowshoe`, - `SO`: `Sogou Mobile Browser`, + `K5`: `Spark`, + `B1`: `Spectre Browser`, `S2`: `Splash`, `SI`: `Sputnik Browser`, `SR`: `Sunrise`, + `0S`: `Sunflower Browser`, `SP`: `SuperBird`, `SU`: `Super Fast Browser`, + `5S`: `SuperFast Browser`, + `HR`: `Sushi Browser`, `S3`: `surf`, + `4S`: `Surf Browser`, + `RY`: `Surfy Browser`, + `SG`: `Stargon`, `S0`: `START Internet Browser`, + `5A`: `Stealth Browser`, `S4`: `Steam In-Game Overlay`, `ST`: `Streamy`, `SX`: `Swiftfox`, + `W7`: `Swiftweasel`, `SZ`: `Seznam Browser`, + `W1`: `Sweet Browser`, + `2X`: `SX Browser`, + `TP`: `T+Browser`, + `TR`: `T-Browser`, `TO`: `t-online.de Browser`, + `TT`: `TalkTo`, `TA`: `Tao Browser`, + `T2`: `tararia`, + `TH`: `Thor`, + `1T`: `Tor Browser`, `TF`: `TenFourFox`, `TB`: `Tenta Browser`, + `TE`: `Tesla Browser`, `TZ`: `Tizen Browser`, + `TI`: `Tint Browser`, + `TL`: `TrueLocation Browser`, + `TC`: `TUC Mini Browser`, + `TK`: `TUSK`, `TU`: `Tungsten`, `TG`: `ToGate`, + `T3`: `Total Browser`, + `TQ`: `TQ Browser`, `TS`: `TweakStyle`, `TV`: `TV Bro`, + `T4`: `TV-Browser Internet`, + `U0`: `U Browser`, `UB`: `UBrowser`, `UC`: `UC Browser`, + `UH`: `UC Browser HD`, `UM`: `UC Browser Mini`, `UT`: `UC Browser Turbo`, + `UI`: `Ui Browser Mini`, + `UP`: `UPhone Browser`, + `UR`: `UR Browser`, `UZ`: `Uzbl`, + `UE`: `Ume Browser`, + `V0`: `vBrowser`, + `VA`: `Vast Browser`, + `V3`: `VD Browser`, + `VR`: `Veera`, + `VE`: `Venus Browser`, + `WD`: `Vewd Browser`, + `V5`: `VibeMate`, + `N0`: `Nova Video Downloader Pro`, + `VS`: `Viasat Browser`, `VI`: `Vivaldi`, `VV`: `vivo Browser`, + `V2`: `Vivid Browser Mini`, `VB`: `Vision Mobile Browser`, + `V4`: `Vertex Surf`, `VM`: `VMware AirWatch`, + `V6`: `VMS Mosaic`, + `VK`: `Vonkeror`, + `VU`: `Vuhuv`, `WI`: `Wear Internet Browser`, `WP`: `Web Explorer`, + `W3`: `Web Browser & Explorer`, + `W5`: `Webian Shell`, + `W4`: `WebDiscover`, `WE`: `WebPositive`, + `W6`: `Weltweitimnetz Browser`, + `WX`: `Wexond`, `WF`: `Waterfox`, + `WB`: `Wave Browser`, + `WA`: `Wavebox`, `WH`: `Whale Browser`, + `W2`: `Whale TV Browser`, `WO`: `wOSBrowser`, + `3W`: `w3m`, `WT`: `WeTab Browser`, + `1W`: `World Browser`, + `WL`: `Wolvic`, + `WK`: `Wukong Browser`, + `WY`: `Wyzo`, + `YG`: `YAGI`, `YJ`: `Yahoo! Japan Browser`, `YA`: `Yandex Browser`, + `Y4`: `Yandex Browser Corp`, `YL`: `Yandex Browser Lite`, + `YN`: `Yaani Browser`, + `Y2`: `Yo Browser`, + `YB`: `Yolo Browser`, + `YO`: `YouCare`, + `Y3`: `YouBrowser`, + `YZ`: `Yuzu Browser`, + `XR`: `xBrowser`, + `X3`: `MMBOX XBrowser`, + `XB`: `X Browser Lite`, + `X0`: `X-VPN`, + `X1`: `xBrowser Pro Super Fast`, + `XN`: `XNX Browser`, + `XT`: `XtremeCast`, + `XS`: `xStand`, `XI`: `Xiino`, + `X4`: `XnBrowse`, + `XO`: `Xooloo Internet`, `XV`: `Xvast`, + `ZE`: `Zetakey`, + `ZV`: `Zvu`, + `ZI`: `Zirco Browser`, + `ZR`: `Zordo Browser`, + `ZT`: `ZTE Browser`, // detected browsers in older versions - // `IA` : `Iceape`, : pim - // `SM` : `SeaMonkey`, : pim + // `IA`: `Iceape`, => pim + // `SM`: `SeaMonkey`, => pim } // Browser families mapped to the short codes of the associated browsers var browserFamilies = map[string][]string{ - `Android Browser` : []string{`AN`, `MU`}, - `BlackBerry Browser` : []string{`BB`}, - `Baidu` : []string{`BD`, `BS`}, - `Amiga` : []string{`AV`, `AW`}, - `Chrome` : []string{`CH`, `BA`, `BR`, `CC`, `CD`, `CM`, `CI`, `CF`, `CN`, `CR`, `CP`, `DD`, `IR`, `RM`, `AO`, `TS`, `VI`, `PT`, `AS`, `TB`, `AD`, `SB`, `WP`, `I3`, `CV`, `WH`, `SZ`, `QW`, `LF`, `KW`, `2B`, `CE`, `EC`, `MT`, `MS`, `HA`, `OC`, `MZ`, `BM`, `KN`, `SW`, `M1`, `FA`, `TA`, `AH`, `CL`, `SU`, `EU`, `UB`, `LO`, `VG`, `TV`, `A0`, `1B`, `S4`, `EE`, `AE`, `VM`, `O0`, `TG`, `GB`, `SY`, `HH`, `YJ`, `LL`, `TU`, `XV`, `C2`}, - `Firefox` : []string{`FF`, `FE`, `FM`, `SX`, `FB`, `PX`, `MB`, `EI`, `WF`, `CU`, `TF`, `QM`, `FR`, `I4`, `GZ`, `MO`, `F1`, `BI`, `MN`, `BH`, `TO`, `OS`, `MY`, `FY`, `AX`, `C0`, `LH`, `S5`}, - `Internet Explorer` : []string{`IE`, `IM`, `PS`}, - `Konqueror` : []string{`KO`}, - `NetFront` : []string{`NF`}, - `NetSurf` : []string{`NE`}, - `Nokia Browser` : []string{`NB`, `NO`, `NV`, `DO`}, - `Opera` : []string{`OP`, `OM`, `OI`, `ON`, `OO`, `OG`, `OH`, `O1`, `OX`}, - `Safari` : []string{`SF`, `MF`, `SO`}, - `Sailfish Browser` : []string{`SA`}, + `Android Browser`: {`AN`}, + `BlackBerry Browser`: {`BB`}, + `Baidu`: {`BD`, `BS`, `H6`}, + `Amiga`: {`AV`, `AW`}, + `Chrome`: { + `CH`, `2B`, `7S`, `A0`, `AC`, `A4`, `AE`, `AH`, `AI`, + `AO`, `AS`, `BA`, `BM`, `BR`, `C2`, `C3`, `C5`, `C4`, + `C6`, `CC`, `CD`, `CE`, `CF`, `CG`, `1B`, `CI`, `CL`, + `CM`, `CN`, `CP`, `CR`, `CV`, `CW`, `DA`, `DD`, `DG`, + `DR`, `EC`, `EE`, `EU`, `EW`, `FA`, `FS`, `GB`, `GI`, + `H2`, `HA`, `HE`, `HH`, `HS`, `I3`, `IR`, `JB`, `KN`, + `KW`, `LF`, `LL`, `LO`, `M1`, `MA`, `MD`, `MR`, `MS`, + `MT`, `MZ`, `NM`, `NR`, `O0`, `O2`, `O3`, `OC`, `PB`, + `PT`, `QU`, `QW`, `RM`, `S4`, `S6`, `S8`, `S9`, `SB`, + `SG`, `SS`, `SU`, `SV`, `SW`, `SY`, `SZ`, `T1`, `TA`, + `TB`, `TG`, `TR`, `TS`, `TU`, `TV`, `UB`, `UR`, `VE`, + `VG`, `VI`, `VM`, `WP`, `WH`, `XV`, `YJ`, `YN`, `FH`, + `B1`, `BO`, `HB`, `PC`, `LA`, `LT`, `PD`, `HR`, `HU`, + `HP`, `IO`, `TP`, `CJ`, `HQ`, `HI`, `PN`, `BW`, `YO`, + `DC`, `G8`, `DT`, `AP`, `AK`, `UI`, `SD`, `VN`, `4S`, + `2S`, `RF`, `LR`, `SQ`, `BV`, `L1`, `F0`, `KS`, `V0`, + `C8`, `AZ`, `MM`, `BT`, `N0`, `P0`, `F3`, `VS`, `DU`, + `D0`, `P1`, `O4`, `8S`, `H3`, `TE`, `WB`, `K1`, `P2`, + `XO`, `U0`, `B0`, `VA`, `X0`, `NX`, `O5`, `R1`, `I1`, + `HO`, `A5`, `X1`, `18`, `B5`, `B6`, `TC`, `A6`, `2X`, + `F4`, `YG`, `WR`, `NA`, `DM`, `1M`, `A7`, `XN`, `XT`, + `XB`, `W1`, `HT`, `B8`, `F5`, `B9`, `WA`, `T0`, `HC`, + `O6`, `P7`, `LJ`, `LC`, `O7`, `N2`, `A8`, `P8`, `RB`, + `1W`, `EV`, `I9`, `V4`, `H4`, `1T`, `M5`, `0S`, `0C`, + `ZR`, `D6`, `F6`, `RC`, `WD`, `P3`, `FT`, `A9`, `X2`, + `N3`, `GD`, `O9`, `Q3`, `F7`, `K2`, `P5`, `H5`, `V3`, + `K3`, `Q4`, `G2`, `R2`, `WX`, `XP`, `3I`, `BG`, `R0`, + `JO`, `OL`, `GN`, `W4`, `QI`, `E1`, `RI`, `8B`, `5B`, + `K4`, `WK`, `T3`, `K5`, `MU`, `9P`, `K6`, `VR`, `N9`, + `M9`, `F9`, `0P`, `0A`, `JR`, `D3`, `TK`, `BP`, `2F`, + `2M`, `K7`, `1N`, `8A`, `H7`, `X3`, `T4`, `X4`, `5O`, + `8C`, `3M`, `6I`, `2P`, `PU`, `7I`, `X5`, `AL`, `3P`, + `W2`, `ZB`, `HN`, `Q6`, `Q7`, `H8`, + }, + `Firefox`: { + `FF`, `BI`, `BF`, `BH`, `BN`, `C0`, `CU`, `EI`, `F1`, + `FB`, `FE`, `AX`, `FM`, `FR`, `FY`, `I4`, `IF`, `8P`, + `IW`, `LH`, `LY`, `MB`, `MN`, `MO`, `MY`, `OA`, `OS`, + `PI`, `PX`, `QA`, `S5`, `SX`, `TF`, `TO`, `WF`, `ZV`, + `FP`, `AD`, `2I`, `P9`, `KJ`, `WY`, `VK`, `W5`, + `7C`, `N7`, `W7`, + }, + `Internet Explorer`: {`IE`, `CZ`, `BZ`, `IM`, `PS`, `3A`, `4A`, `RN`}, + `Konqueror`: {`KO`}, + `NetFront`: {`NF`}, + `NetSurf`: {`NE`}, + `Nokia Browser`: {`NB`, `DO`, `NO`, `NV`}, + `Opera`: {`OP`, `OG`, `OH`, `OI`, `OM`, `ON`, `OO`, `O1`, `OX`, `Y1`}, + `Safari`: {`SF`, `S7`, `MF`, `SO`, `PV`}, + `Sailfish Browser`: {`SA`}, } // Browsers that are available for mobile devices only var mobileOnlyBrowsers = []string{ - `36`, `OC`, `PU`, `SK`, `MF`, `OI`, `OM`, `DD`, `DB`, `ST`, `BL`, `IV`, `FM`, `C1`, `AL`, `SA`, `SB`, `FR`, `WP`, `HA`, `NX`, `HU`, `VV`, `RE`, `CB`, `MZ`, `UM`, `FK`, `FX`, `WI`, `MN`, `M1`, `AH`, `SU`, `EU`, `EZ`, `UT`, `DT`, `S0`, + `36`, `AH`, `AI`, `BL`, `C1`, `C4`, `CB`, `CW`, `DB`, + `3M`, `DT`, `EU`, `EZ`, `FK`, `FM`, `FR`, `FX`, `GH`, + `GI`, `GR`, `HA`, `HU`, `IV`, `JB`, `KD`, `M1`, `MF`, + `MN`, `MZ`, `NX`, `OC`, `OI`, `OM`, `OZ`, `2P`, `PI`, + `PE`, `QU`, `RE`, `S0`, `S7`, `SA`, `SB`, `SG`, `SK`, + `ST`, `SU`, `T1`, `UH`, `UM`, `UT`, `VE`, `VV`, `WI`, + `WP`, `YN`, `IO`, `IS`, `HQ`, `RW`, `HI`, `PN`, `BW`, + `YO`, `PK`, `MR`, `AP`, `AK`, `UI`, `SD`, `VN`, `4S`, + `RF`, `LR`, `SQ`, `BV`, `L1`, `F0`, `KS`, `V0`, `C8`, + `AZ`, `MM`, `BT`, `N0`, `P0`, `F3`, `DU`, `D0`, `P1`, + `O4`, `XO`, `U0`, `B0`, `VA`, `X0`, `A5`, `X1`, `18`, + `B5`, `B6`, `TC`, `A6`, `2X`, `F4`, `YG`, `WR`, `NA`, + `DM`, `1M`, `A7`, `XN`, `XT`, `XB`, `W1`, `HT`, `B7`, + `B9`, `T0`, `I8`, `O6`, `P7`, `O8`, `4B`, `A8`, `P8`, + `1W`, `EV`, `Z0`, `I9`, `V4`, `H4`, `M5`, `0S`, `0C`, + `ZR`, `D6`, `F6`, `P3`, `FT`, `A9`, `X2`, `NI`, `FG`, + `TH`, `N3`, `GD`, `O9`, `Q3`, `F7`, `K2`, `N4`, `P5`, + `H5`, `V3`, `G2`, `BG`, `OL`, `II`, `TL`, `M6`, `Y3`, + `M7`, `GN`, `JR`, `IG`, `HW`, `4O`, `OU`, `5P`, `KE`, + `5A`, `TT`, `6P`, `G3`, `7P`, `VU`, `F8`, `L4`, `DK`, + `DP`, `KL`, `K4`, `N6`, `KU`, `WK`, `M8`, `UP`, `ZT`, + `9P`, `N8`, `VR`, `N9`, `M9`, `F9`, `0P`, `0A`, `2F`, + `2M`, `K7`, `1N`, `8A`, `H7`, `X3`, `X4`, `5O`, `6I`, + `7I`, `X5`, `3P`, `2E`, +} + +var clientHintMapping = map[string][]string{ + `Chrome`: {`Google Chrome`}, + `Chrome Webview`: {`Android WebView`}, + `DuckDuckGo Privacy Browser`: {`DuckDuckGo`}, + `Edge WebView`: {`Microsoft Edge WebView2`}, + `Mi Browser`: {`Miui Browser`, `XiaoMiBrowser`}, + `Microsoft Edge`: {`Edge`}, + `Norton Private Browser`: {`Norton Secure Browser`}, + `Vewd Browser`: {`Vewd Core`}, } func GetBrowserFamily(browserLabel string) (string, bool) { @@ -334,11 +832,11 @@ type BrowserItem struct { Engine *Engine `yaml:"engine" json:"engine"` } -// Client parser for browser detection +// Client parser for browser detection type Browser struct { - Regexes []*BrowserItem - engine BrowserEngine - verCache map[string]*Version + Regexes []*BrowserItem + engine BrowserEngine + verCache map[string]*Version } const ParserNameBrowser = `browser` @@ -347,7 +845,7 @@ const FixtureFileBrowser = `browsers.yml` func init() { RegClientParser(ParserNameBrowser, func(dir string) ClientParser { - return NewBrowser(filepath.Join(dir, FixtureFileBrowser)) + return NewBrowser(path.Join(dir, FixtureFileBrowser)) }) } @@ -383,7 +881,7 @@ func (b *Browser) PreMatch(ua string) bool { func (b *Browser) Parse(ua string) *BrowserMatchResult { for _, regex := range b.Regexes { matches := regex.MatchUserAgent(ua) - if len(matches) > 0{ + if len(matches) > 0 { name := BuildByMatch(regex.Name, matches) for browserShort, browserName := range availableBrowsers { if StringEqualIgnoreCase(name, browserName) { diff --git a/parser/client/browser_engine.go b/parser/client/browser_engine.go index 0ac7237..673df1d 100644 --- a/parser/client/browser_engine.go +++ b/parser/client/browser_engine.go @@ -1,14 +1,14 @@ package client import ( - "path/filepath" + "path" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" ) // Known browser engines mapped to their internal short codes var availableEngines = []string{ - `WebKit`, + `ebKit`, `Blink`, `Trident`, `Text-based`, @@ -16,6 +16,7 @@ var availableEngines = []string{ `iCab`, `Elektra`, `Presto`, + `Clecko`, `Gecko`, `KHTML`, `NetFront`, @@ -23,6 +24,10 @@ var availableEngines = []string{ `NetSurf`, `Servo`, `Goanna`, + `EkiohFlow`, + `Arachne`, + `LibWeb`, + `Maple`, } const ParserNameBrowserEngine = `browserengine` @@ -31,7 +36,7 @@ const FixtureFileBrowserEngine = `browser_engine.yml` func init() { RegClientParser(ParserNameBrowserEngine, func(dir string) ClientParser { - return NewBrowserEngine(filepath.Join(dir, FixtureFileBrowserEngine)) + return NewBrowserEngine(path.Join(dir, FixtureFileBrowserEngine)) }) } diff --git a/parser/client/browser_test.go b/parser/client/browser_test.go index a6ee5ec..4f48c9d 100644 --- a/parser/client/browser_test.go +++ b/parser/client/browser_test.go @@ -1,15 +1,15 @@ package client import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestBrowserParse(t *testing.T) { - ps := NewBrowser(filepath.Join(dir, FixtureFileBrowser)) + ps := NewBrowser(path.Join(dir, FixtureFileBrowser)) var list []*ClientFixture err := ReadYamlFile(`fixtures/browser.yml`, &list) if err != nil { @@ -21,4 +21,4 @@ func TestBrowserParse(t *testing.T) { r := ps.Parse(ua) assert.DeepEqual(t, item.ClientMatchResult, r) } -} \ No newline at end of file +} diff --git a/parser/client/client_parser.go b/parser/client/client_parser.go index 58df7d3..6c4aa1e 100644 --- a/parser/client/client_parser.go +++ b/parser/client/client_parser.go @@ -4,7 +4,7 @@ import ( "sort" "strings" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" ) type ClientMatchResult struct { diff --git a/parser/client/feed_reader.go b/parser/client/feed_reader.go index 244e0a6..8221997 100644 --- a/parser/client/feed_reader.go +++ b/parser/client/feed_reader.go @@ -1,7 +1,7 @@ package client import ( - "path/filepath" + "path" ) const ParserNameFeedReader = `feed reader` @@ -10,7 +10,7 @@ const FixtureFileFeedReader = `feed_readers.yml` func init() { RegClientParser(ParserNameFeedReader, func(dir string) ClientParser { - return NewFeedReader(filepath.Join(dir, FixtureFileFeedReader)) + return NewFeedReader(path.Join(dir, FixtureFileFeedReader)) }) } diff --git a/parser/client/feed_reader_test.go b/parser/client/feed_reader_test.go index 9a7d333..7fb598e 100644 --- a/parser/client/feed_reader_test.go +++ b/parser/client/feed_reader_test.go @@ -1,15 +1,15 @@ package client import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestFeedReaderParse(t *testing.T) { - ps := NewFeedReader(filepath.Join(dir, FixtureFileFeedReader)) + ps := NewFeedReader(path.Join(dir, FixtureFileFeedReader)) var list []*ClientFixture err := ReadYamlFile(`fixtures/feed_reader.yml`, &list) if err != nil { @@ -21,4 +21,4 @@ func TestFeedReaderParse(t *testing.T) { r := ps.Parse(ua) assert.DeepEqual(t, item.ClientMatchResult, r) } -} \ No newline at end of file +} diff --git a/parser/client/library.go b/parser/client/library.go index 8424e6e..d5c2043 100644 --- a/parser/client/library.go +++ b/parser/client/library.go @@ -1,7 +1,7 @@ package client import ( - "path/filepath" + "path" ) const ParserNameLibrary = `library` @@ -10,7 +10,7 @@ const FixtureFileLibrary = `libraries.yml` func init() { RegClientParser(ParserNameLibrary, func(dir string) ClientParser { - return NewLibrary(filepath.Join(dir, FixtureFileLibrary)) + return NewLibrary(path.Join(dir, FixtureFileLibrary)) }) } diff --git a/parser/client/library_test.go b/parser/client/library_test.go index a3abf06..30b6215 100644 --- a/parser/client/library_test.go +++ b/parser/client/library_test.go @@ -1,15 +1,15 @@ package client import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestLibraryParse(t *testing.T) { - var ps= NewLibrary(filepath.Join(dir, FixtureFileLibrary)) + var ps = NewLibrary(path.Join(dir, FixtureFileLibrary)) var list []*ClientFixture err := ReadYamlFile(`fixtures/library.yml`, &list) if err != nil { diff --git a/parser/client/media_player.go b/parser/client/media_player.go index b6f65d8..32871b6 100644 --- a/parser/client/media_player.go +++ b/parser/client/media_player.go @@ -1,7 +1,7 @@ package client import ( - "path/filepath" + "path" ) const ParserNameMediaPlayer = `mediaplayer` @@ -10,7 +10,7 @@ const FixtureFileMediaPlayer = `mediaplayers.yml` func init() { RegClientParser(ParserNameMediaPlayer, func(dir string) ClientParser { - return NewMediaPlayer(filepath.Join(dir, FixtureFileMediaPlayer)) + return NewMediaPlayer(path.Join(dir, FixtureFileMediaPlayer)) }) } diff --git a/parser/client/media_player_test.go b/parser/client/media_player_test.go index 4334ce0..beab8f6 100644 --- a/parser/client/media_player_test.go +++ b/parser/client/media_player_test.go @@ -1,15 +1,15 @@ package client import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestMediaPlayerParse(t *testing.T) { - ps := NewMediaPlayer(filepath.Join(dir, FixtureFileMediaPlayer)) + ps := NewMediaPlayer(path.Join(dir, FixtureFileMediaPlayer)) var list []*ClientFixture err := ReadYamlFile(`fixtures/mediaplayer.yml`, &list) if err != nil { diff --git a/parser/client/mobile_app.go b/parser/client/mobile_app.go index 94adb94..4f05a65 100644 --- a/parser/client/mobile_app.go +++ b/parser/client/mobile_app.go @@ -1,7 +1,7 @@ package client import ( - "path/filepath" + "path" ) const ParserNameMobileApp = `mobile app` @@ -10,7 +10,7 @@ const FixtureFileMobileApp = `mobile_apps.yml` func init() { RegClientParser(ParserNameMobileApp, func(dir string) ClientParser { - return NewMobileApp(filepath.Join(dir, FixtureFileMobileApp)) + return NewMobileApp(path.Join(dir, FixtureFileMobileApp)) }) } diff --git a/parser/client/mobile_app_test.go b/parser/client/mobile_app_test.go index 08c79bb..0e95eba 100644 --- a/parser/client/mobile_app_test.go +++ b/parser/client/mobile_app_test.go @@ -1,15 +1,15 @@ package client import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestMediaAppParse(t *testing.T) { - ps := NewMobileApp(filepath.Join(dir, FixtureFileMobileApp)) + ps := NewMobileApp(path.Join(dir, FixtureFileMobileApp)) var list []*ClientFixture err := ReadYamlFile(`fixtures/mobile_app.yml`, &list) if err != nil { diff --git a/parser/client/pim.go b/parser/client/pim.go index d9f8aff..7f8aaee 100644 --- a/parser/client/pim.go +++ b/parser/client/pim.go @@ -1,7 +1,7 @@ package client import ( - "path/filepath" + "path" ) const ParserNamePim = `pim` @@ -10,7 +10,7 @@ const FixtureFilePim = `pim.yml` func init() { RegClientParser(ParserNamePim, func(dir string) ClientParser { - return NewPim(filepath.Join(dir, FixtureFilePim)) + return NewPim(path.Join(dir, FixtureFilePim)) }) } diff --git a/parser/client/pim_test.go b/parser/client/pim_test.go index 65a00f7..ca76290 100644 --- a/parser/client/pim_test.go +++ b/parser/client/pim_test.go @@ -1,15 +1,15 @@ package client import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestPimParse(t *testing.T) { - ps := NewPim(filepath.Join(dir, FixtureFilePim)) + ps := NewPim(path.Join(dir, FixtureFilePim)) var list []*ClientFixture err := ReadYamlFile(`fixtures/pim.yml`, &list) if err != nil { diff --git a/parser/device.go b/parser/device.go index 559a290..f7079f6 100644 --- a/parser/device.go +++ b/parser/device.go @@ -15,6 +15,7 @@ const ( DEVICE_TYPE_PHABLET = 10 DEVICE_TYPE_SMART_SPEAKER = 11 DEVICE_TYPE_WEARABLE = 12 // including set watches, headsets + DEVICE_TYPE_PERIPHERAL = 13 // including portable terminal, portable projector ) // Detectable device types @@ -32,628 +33,2106 @@ var deviceTypes = map[string]int{ `phablet`: DEVICE_TYPE_PHABLET, `smart speaker`: DEVICE_TYPE_SMART_SPEAKER, `wearable`: DEVICE_TYPE_WEARABLE, + `peripheral`: DEVICE_TYPE_PERIPHERAL, } // Known device brands // Note: Before using a new brand in on of the regex files, it needs to be added here var deviceBrands = map[string]string{ - `3Q`: `3Q`, - `4G`: `4Good`, - `AE`: `Ace`, - `AA`: `AllCall`, - `AC`: `Acer`, - `A9`: `Advan`, - `AD`: `Advance`, - `A3`: `AGM`, - `AZ`: `Ainol`, - `AI`: `Airness`, - `0A`: `AIS`, - `AW`: `Aiwa`, - `AK`: `Akai`, - `1A`: `Alba`, - `AL`: `Alcatel`, - `4A`: `Aligator`, - `3A`: `AllDocube`, - `A2`: `Allview`, - `A7`: `Allwinner`, - `A1`: `Altech UEC`, - `A5`: `altron`, - `AN`: `Arnova`, - `5A`: `ArmPhone`, - `2A`: `Atom`, - `KN`: `Amazon`, - `AG`: `AMGOO`, - `AO`: `Amoi`, - `AP`: `Apple`, - `AR`: `Archos`, - `AS`: `ARRIS`, - `AB`: `Arian Space`, - `AT`: `Airties`, - `A6`: `Ark`, - `A4`: `Ask`, - `A8`: `Assistant`, - `A0`: `ANS`, - `AU`: `Asus`, - `AH`: `AVH`, - `AV`: `Avvio`, - `AX`: `Audiovox`, - `AY`: `Axxion`, - `AM`: `Azumi Mobile`, - `BB`: `BBK`, - `BE`: `Becker`, - `B5`: `Beeline`, - `BI`: `Bird`, - `BT`: `Bitel`, - `BG`: `BGH`, - `BL`: `Beetel`, - `BP`: `Blaupunkt`, - `B3`: `Bluboo`, - `BF`: `Black Fox`, - `B6`: `BDF`, - `BM`: `Bmobile`, - `BN`: `Barnes & Noble`, - `BO`: `BangOlufsen`, - `BQ`: `BenQ`, - `BS`: `BenQ-Siemens`, - `BU`: `Blu`, - `BD`: `Bluegood`, - `B2`: `Blackview`, - `B4`: `bogo`, - `BW`: `Boway`, - `BZ`: `Bezkam`, - `BX`: `bq`, - `BV`: `Bravis`, - `BR`: `Brondi`, - `B1`: `Bush`, - `CB`: `CUBOT`, - `CF`: `Carrefour`, - `CP`: `Captiva`, - `CS`: `Casio`, - `R4`: `Casper`, - `CA`: `Cat`, - `C9`: `CAGI`, - `CE`: `Celkon`, - `CC`: `ConCorde`, - `C2`: `Changhong`, - `2C`: `Ghong`, - `CH`: `Cherry Mobile`, - `1C`: `Chuwi`, - `L8`: `Clarmin`, - `CK`: `Cricket`, - `C1`: `Crosscall`, - `CL`: `Compal`, - `CN`: `CnM`, - `CM`: `Crius Mea`, - `C3`: `China Mobile`, - `CR`: `CreNova`, - `CT`: `Capitel`, - `CQ`: `Compaq`, - `CO`: `Coolpad`, - `C5`: `Condor`, - `CW`: `Cowon`, - `CU`: `Cube`, - `CY`: `Coby Kyros`, - `C6`: `Comio`, - `C7`: `ComTrade Tesla`, - `C8`: `Concord`, - `CX`: `Crescent`, - `C4`: `Cyrus`, - `CV`: `CVTE`, - `D5`: `Daewoo`, - `DA`: `Danew`, - `DT`: `Datang`, - `D1`: `Datsun`, - `DE`: `Denver`, - `DW`: `DeWalt`, - `DX`: `DEXP`, - `DS`: `Desay`, - `DB`: `Dbtel`, - `DC`: `DoCoMo`, - `DG`: `Dialog`, - `DI`: `Dicam`, - `D4`: `Digi`, - `D3`: `Digicel`, - `DD`: `Digiland`, - `D2`: `Digma`, - `D6`: `Divisat`, - `DL`: `Dell`, - `DN`: `DNS`, - `DM`: `DMM`, - `DO`: `Doogee`, - `DV`: `Doov`, - `DP`: `Dopod`, - `DR`: `Doro`, - `DU`: `Dune HD`, - `EB`: `E-Boda`, - `EA`: `EBEST`, - `EC`: `Ericsson`, - `E7`: `Ergo`, - `ED`: `Energizer`, - `E4`: `Echo Mobiles`, - `ES`: `ECS`, - `E6`: `EE`, - `EI`: `Ezio`, - `EM`: `Eks Mobility`, - `EL`: `Elephone`, - `L0`: `Element`, - `EG`: `Elenberg`, - `EP`: `Easypix`, - `EK`: `EKO`, - `E1`: `Energy Sistem`, - `ER`: `Ericy`, - `EE`: `Essential`, - `EN`: `Eton`, - `E2`: `Essentielb`, - `1E`: `Etuline`, - `ET`: `eTouch`, - `EV`: `Evertek`, - `E3`: `Evolio`, - `EO`: `Evolveo`, - `EX`: `Explay`, - `E0`: `EvroMedia`, - `E5`: `Extrem`, - `EZ`: `Ezze`, - `E8`: `E-tel`, - `E9`: `Evercoss`, - `EU`: `Eurostar`, - `FA`: `Fairphone`, - `FM`: `Famoco`, - `FE`: `Fengxiang`, - `FI`: `FiGO`, - `FL`: `Fly`, - `F1`: `FinePower`, - `FT`: `Freetel`, - `FR`: `Forstar`, - `FO`: `Foxconn`, - `F2`: `FORME`, - `FN`: `FNB`, - `FU`: `Fujitsu`, - `FD`: `Fondi`, - `GT`: `G-TiDE`, - `GM`: `Garmin-Asus`, - `GA`: `Gateway`, - `GD`: `Gemini`, - `GN`: `General Mobile`, - `GE`: `Geotel`, - `GH`: `Ghia`, - `GI`: `Gionee`, - `GG`: `Gigabyte`, - `GS`: `Gigaset`, - `GZ`: `Ginzzu`, - `G4`: `Globex`, - `GC`: `GOCLEVER`, - `GL`: `Goly`, - `GO`: `Google`, - `G5`: `Gome`, - `G1`: `GoMobile`, - `GR`: `Gradiente`, - `GP`: `Grape`, - `GU`: `Grundig`, - `HF`: `Hafury`, - `HA`: `Haier`, - `HS`: `Hasee`, - `HE`: `HannSpree`, - `HI`: `Hisense`, - `HL`: `Hi-Level`, - `H2`: `Highscreen`, - `H1`: `Hoffmann`, - `HM`: `Homtom`, - `HO`: `Hosin`, - `HZ`: `Hoozo`, - `HP`: `HP`, - `HT`: `HTC`, - `HD`: `Huadoo`, - `HU`: `Huawei`, - `HX`: `Humax`, - `HY`: `Hyrican`, - `HN`: `Hyundai`, - `IG`: `iGet`, - `IA`: `Ikea`, - `IB`: `iBall`, - `IJ`: `i-Joy`, - `IY`: `iBerry`, - `IH`: `iHunt`, - `IK`: `iKoMo`, - `IE`: `iView`, - `I8`: `iVA`, - `IM`: `i-mate`, - `I1`: `iOcean`, - `I2`: `IconBIT`, - `IL`: `IMO Mobile`, - `I7`: `iLA`, - `IW`: `iNew`, - `IP`: `iPro`, - `IF`: `Infinix`, - `I0`: `InFocus`, - `I5`: `InnJoo`, - `IN`: `Innostream`, - `IS`: `Insignia`, - `I4`: `Inoi`, - `IR`: `iRola`, - `IU`: `iRulu`, - `I6`: `Irbis`, - `II`: `Inkti`, - `IX`: `Intex`, - `IO`: `i-mobile`, - `IQ`: `INQ`, - `IT`: `Intek`, - `IV`: `Inverto`, - `I3`: `Impression`, - `IZ`: `iTel`, - `I9`: `iZotron`, - `JA`: `JAY-Tech`, - `JI`: `Jiayu`, - `JO`: `Jolla`, - `J5`: `Just5`, - `JF`: `JFone`, - `KL`: `Kalley`, - `K4`: `Kaan`, - `K7`: `Kaiomy`, - `K6`: `Kanji`, - `KA`: `Karbonn`, - `K5`: `KATV1`, - `KD`: `KDDI`, - `K1`: `Kiano`, - `KV`: `Kivi`, - `KI`: `Kingsun`, - `KC`: `Kocaso`, - `KG`: `Kogan`, - `KO`: `Konka`, - `KM`: `Komu`, - `KB`: `Koobee`, - `KT`: `K-Touch`, - `KH`: `KT-Tech`, - `KK`: `Kodak`, - `KP`: `KOPO`, - `KW`: `Konrow`, - `KR`: `Koridy`, - `K2`: `KRONO`, - `KS`: `Kempler & Strauss`, - `K3`: `Keneksi`, - `KU`: `Kumai`, - `KY`: `Kyocera`, - `KZ`: `Kazam`, - `KE`: `Krüger&Matz`, - `LQ`: `LAIQ`, - `L2`: `Landvo`, - `L6`: `Land Rover`, - `LV`: `Lava`, - `LA`: `Lanix`, - `LK`: `Lark`, - `LC`: `LCT`, - `L5`: `Leagoo`, - `LD`: `Ledstar`, - `L1`: `LeEco`, - `L4`: `Lemhoov`, - `LE`: `Lenovo`, - `LN`: `Lenco`, - `LT`: `Leotec`, - `L7`: `Lephone`, - `LP`: `Le Pan`, - `LG`: `LG`, - `LI`: `Lingwin`, - `LO`: `Loewe`, - `LM`: `Logicom`, - `L3`: `Lexand`, - `LX`: `Lexibook`, - `LY`: `LYF`, - `LU`: `Lumus`, - `L9`: `Luna`, - `MN`: `M4tel`, - `MJ`: `Majestic`, - `MA`: `Manta Multimedia`, - `5M`: `Mann`, - `2M`: `Masstel`, - `MW`: `Maxwest`, - `7M`: `Maxcom`, - `M0`: `Maze`, - `MB`: `Mobistel`, - `0M`: `Mecool`, - `M3`: `Mecer`, - `MD`: `Medion`, - `M2`: `MEEG`, - `M1`: `Meizu`, - `3M`: `Meitu`, - `ME`: `Metz`, - `MX`: `MEU`, - `MI`: `MicroMax`, - `M5`: `MIXC`, - `MH`: `Mobiola`, - `4M`: `Mobicel`, - `M6`: `Mobiistar`, - `MC`: `Mediacom`, - `MK`: `MediaTek`, - `MO`: `Mio`, - `M7`: `Miray`, - `MM`: `Mpman`, - `M4`: `Modecom`, - `MF`: `Mofut`, - `MR`: `Motorola`, - `MV`: `Movic`, - `MS`: `Microsoft`, - `M9`: `MTC`, - `MP`: `MegaFon`, - `MZ`: `MSI`, - `MU`: `Memup`, - `MT`: `Mitsubishi`, - `ML`: `MLLED`, - `MQ`: `M.T.T.`, - `N4`: `MTN`, - `MY`: `MyPhone`, - `1M`: `MYFON`, - `MG`: `MyWigo`, - `M8`: `Myria`, - `6M`: `Mystery`, - `N3`: `Navon`, - `N7`: `National`, - `N5`: `NOA`, - `NE`: `NEC`, - `NF`: `Neffos`, - `NA`: `Netgear`, - `NU`: `NeuImage`, - `NG`: `NGM`, - `NZ`: `NG Optics`, - `N6`: `Nobby`, - `NO`: `Nous`, - `NI`: `Nintendo`, - `N1`: `Noain`, - `N2`: `Nextbit`, - `NK`: `Nokia`, - `NV`: `Nvidia`, - `NB`: `Noblex`, - `NM`: `Nomi`, - `N0`: `Nuvo`, - `NL`: `NUU Mobile`, - `NY`: `NYX Mobile`, - `NN`: `Nikon`, - `NW`: `Newgen`, - `NS`: `NewsMy`, - `NX`: `Nexian`, - `NT`: `NextBook`, - `O3`: `O+`, - `OB`: `Obi`, - `O1`: `Odys`, - `OD`: `Onda`, - `ON`: `OnePlus`, - `OP`: `OPPO`, - `OR`: `Orange`, - `OS`: `Ordissimo`, - `OT`: `O2`, - `OK`: `Ouki`, - `OE`: `Oukitel`, - `OU`: `OUYA`, - `OO`: `Opsson`, - `OV`: `Overmax`, - `OY`: `Oysters`, - `OW`: `öwn`, - `PN`: `Panacom`, - `PA`: `Panasonic`, - `PB`: `PCBOX`, - `PC`: `PCD`, - `PD`: `PCD Argentina`, - `PE`: `PEAQ`, - `PG`: `Pentagram`, - `PH`: `Philips`, - `1P`: `Phicomm`, - `PI`: `Pioneer`, - `PX`: `Pixus`, - `PL`: `Polaroid`, - `P5`: `Polytron`, - `P9`: `Primepad`, - `P6`: `Proline`, - `PM`: `Palm`, - `PO`: `phoneOne`, - `PT`: `Pantech`, - `PY`: `Ployer`, - `P4`: `Plum`, - `PV`: `Point of View`, - `PP`: `PolyPad`, - `P2`: `Pomp`, - `P3`: `PPTV`, - `PS`: `Positivo`, - `PR`: `Prestigio`, - `P7`: `Protruly`, - `P1`: `ProScan`, - `PU`: `PULID`, - `QI`: `Qilive`, - `QT`: `Qtek`, - `QH`: `Q-Touch`, - `QM`: `QMobile`, - `QA`: `Quantum`, - `QU`: `Quechua`, - `QO`: `Qumo`, - `RA`: `Ramos`, - `RZ`: `Razer`, - `RC`: `RCA Tablets`, - `RB`: `Readboy`, - `RI`: `Rikomagic`, - `RN`: `Rinno`, - `RV`: `Riviera`, - `RM`: `RIM`, - `RK`: `Roku`, - `RO`: `Rover`, - `R6`: `RoverPad`, - `RR`: `Roadrover`, - `R1`: `Rokit`, - `R3`: `Rombica`, - `RT`: `RT Project`, - `RX`: `Ritmix`, - `R7`: `Ritzviva`, - `R5`: `Ross&Moor`, - `R2`: `R-TV`, - `RG`: `RugGear`, - `RU`: `Runbo`, - `RY`: `Ryte`, - `SQ`: `Santin`, - `SA`: `Samsung`, - `S0`: `Sanei`, - `SD`: `Sega`, - `SL`: `Selfix`, - `SE`: `Sony Ericsson`, - `S1`: `Sencor`, - `SF`: `Softbank`, - `SX`: `SFR`, - `SG`: `Sagem`, - `SH`: `Sharp`, - `7S`: `Shift Phones`, - `3S`: `Shuttle`, - `SI`: `Siemens`, - `SJ`: `Silent Circle`, - `1S`: `Sigma`, - `SN`: `Sendo`, - `S6`: `Senseit`, - `EW`: `Senwa`, - `SW`: `Sky`, - `SK`: `Skyworth`, - `SC`: `Smartfren`, - `SO`: `Sony`, - `OI`: `Sonim`, - `8S`: `Soyes`, - `SP`: `Spice`, - `6S`: `Spectrum`, - `5S`: `Sunvell`, - `SU`: `SuperSonic`, - `S5`: `Supra`, - `SV`: `Selevision`, - `SY`: `Sanyo`, - `SM`: `Symphony`, - `4S`: `Syrox`, - `SR`: `Smart`, - `S7`: `Smartisan`, - `S4`: `Star`, - `SB`: `STF Mobile`, - `S8`: `STK`, - `S9`: `Savio`, - `2S`: `Starway`, - `ST`: `Storex`, - `S2`: `Stonex`, - `S3`: `SunVan`, - `SZ`: `Sumvision`, - `SS`: `SWISSMOBILITY`, - `10`: `Simbans`, - `X1`: `Safaricom`, - `TA`: `Tesla`, - `T5`: `TB Touch`, - `TC`: `TCL`, - `T7`: `Teclast`, - `TE`: `Telit`, - `T4`: `ThL`, - `TH`: `TiPhone`, - `TB`: `Tecno Mobile`, - `TP`: `TechPad`, - `TD`: `Tesco`, - `TI`: `TIANYU`, - `TG`: `Telego`, - `TL`: `Telefunken`, - `T2`: `Telenor`, - `TM`: `T-Mobile`, - `TN`: `Thomson`, - `TQ`: `Timovi`, - `TY`: `Tooky`, - `T1`: `Tolino`, - `T9`: `Top House`, - `TO`: `Toplux`, - `T8`: `Touchmate`, - `TS`: `Toshiba`, - `TT`: `TechnoTrend`, - `T6`: `TrekStor`, - `T3`: `Trevi`, - `TU`: `Tunisie Telecom`, - `TR`: `Turbo-X`, - `1T`: `Turbo`, - `11`: `True`, - `TV`: `TVC`, - `TX`: `TechniSat`, - `TZ`: `teXet`, - `UC`: `U.S. Cellular`, - `UH`: `Uhappy`, - `U1`: `Uhans`, - `UG`: `Ugoos`, - `UL`: `Ulefone`, - `UO`: `Unnecto`, - `UN`: `Unowhy`, - `US`: `Uniscope`, - `UX`: `Unimax`, - `UM`: `UMIDIGI`, - `UU`: `Unonu`, - `UK`: `UTOK`, - `UA`: `Umax`, - `UT`: `UTStarcom`, - `UZ`: `Unihertz`, - `VA`: `Vastking`, - `VD`: `Videocon`, - `VE`: `Vertu`, - `VN`: `Venso`, - `V5`: `Vivax`, - `VI`: `Vitelcom`, - `V7`: `Vinga`, - `VK`: `VK Mobile`, - `VS`: `ViewSonic`, - `V9`: `Vsun`, - `V8`: `Vesta`, - `VT`: `Vestel`, - `VR`: `Vernee`, - `V4`: `Verizon`, - `VL`: `Verykool`, - `V6`: `VGO TEL`, - `VV`: `Vivo`, - `VX`: `Vertex`, - `V3`: `Vinsoc`, - `V2`: `Vonino`, - `1V`: `Vontar`, - `VG`: `Vorago`, - `2V`: `Vorke`, - `V1`: `Voto`, - `VO`: `Voxtel`, - `VF`: `Vodafone`, - `VY`: `Voyo`, - `VZ`: `Vizio`, - `VW`: `Videoweb`, - `VU`: `Vulcan`, - `WA`: `Walton`, - `WF`: `Wileyfox`, - `WN`: `Wink`, - `WM`: `Weimei`, - `WE`: `WellcoM`, - `WY`: `Wexler`, - `W2`: `Wigor`, - `WI`: `Wiko`, - `WP`: `Wieppo`, - `WL`: `Wolder`, - `WG`: `Wolfgang`, - `WO`: `Wonu`, - `W1`: `Woo`, - `WX`: `Woxter`, - `XV`: `X-View`, - `XI`: `Xiaomi`, - `XL`: `Xiaolajiao`, - `XN`: `Xion`, - `XO`: `Xolo`, - `XR`: `Xoro`, - `YA`: `Yarvik`, - `YD`: `Yandex`, - `Y2`: `Yes`, - `YE`: `Yezz`, - `Y1`: `Yu`, - `YU`: `Yuandao`, - `YS`: `Yusun`, - `YO`: `Yota`, - `YT`: `Ytone`, - `YX`: `Yxtel`, - `ZE`: `Zeemi`, - `ZK`: `Zenek`, - `ZF`: `Zfiner`, - `ZO`: `Zonda`, - `ZI`: `Zidoo`, - `ZP`: `Zopo`, - `ZT`: `ZTE`, - `ZU`: `Zuum`, - `ZN`: `Zen`, - `ZY`: `Zync`, - `ZQ`: `ZYQ`, - `XT`: `X-TIGI`, - `XB`: `NEXBOX`, - + `5E`: `2E`, + `5IV`: `5IVE`, + `2F`: `F2 Mobile`, + `3Q`: `3Q`, + `J7`: `7 Mobile`, + `2Q`: `3GNET`, + `4G`: `4Good`, + `27`: `3GO`, + `04`: `4ife`, + `36`: `360`, + `88`: `8848`, + `10M`: `10moons`, + `41`: `A1`, + `AK1`: `A&K`, + `00`: `Accent`, + `ACC`: `Accesstyle`, + `ACD`: `ACD`, + `AE`: `Ace`, + `AC`: `Acer`, + `ACL`: `Aceline`, + `ACP`: `Acepad`, + `3K`: `Acteck`, + `ACT`: `actiMirror`, + `A9`: `Advan`, + `AD`: `Advance`, + `ADV`: `Advantage Air`, + `76`: `Adronix`, + `ADR`: `Adreamer`, + `AF`: `AfriOne`, + `FY`: `AFFIX`, + `A3`: `AGM`, + `AEE`: `AEEZO`, + `J0`: `AG Mobile`, + `AJI`: `Ajib`, + `AZ`: `Ainol`, + `AIR`: `Airis`, + `AI`: `Airness`, + `ARP`: `Airpha`, + `AT`: `Airties`, + `7U`: `Airtel`, + `AIT`: `AirTouch`, + `U0`: `AIRON`, + `0A`: `AIS`, + `AW`: `Aiwa`, + `85`: `Aiuto`, + `U7`: `AIDATA`, + `AL1`: `AileTV`, + `AK`: `Akai`, + `Q3`: `AKIRA`, + `1A`: `Alba`, + `AL`: `Alcatel`, + `AL0`: `Alienware`, + `20`: `Alcor`, + `XY`: `Alps`, + `XYA`: `XY Auto`, + `AAU`: `AAUW`, + `7L`: `ALDI NORD`, + `6L`: `ALDI SÜD`, + `3L`: `Alfawise`, + `4A`: `Aligator`, + `ALS`: `All Star`, + `AA`: `AllCall`, + `3A`: `AllDocube`, + `ALL`: `allente`, + `A2`: `Allview`, + `ALI`: `ALLINmobile`, + `A7`: `Allwinner`, + `ALP`: `alpsmart`, + `A1`: `Altech UEC`, + `66`: `Altice`, + `ALM`: `Altimo`, + `A5`: `altron`, + `ALB`: `Altibox`, + `ALT`: `Altus`, + `KN`: `Amazon`, + `AMZ`: `Amazon Basics`, + `AMA`: `AMA`, + `AG`: `AMGOO`, + `9A`: `Amigoo`, + `AO`: `Amoi`, + `3J`: `Amino`, + `54`: `AMCV`, + `60`: `Andowl`, + `ANX`: `ANXONIT`, + `ANL`: `ANCEL`, + `ANC`: `ANBERNIC`, + `AND`: `andersson`, + `6J`: `Angelcare`, + `ANG`: `AngelTech`, + `7A`: `Anry`, + `A0`: `ANS`, + `74`: `Anker`, + `3N`: `Aoson`, + `O8`: `AOC`, + `J2`: `AOYODKG`, + `55`: `AOpen`, + `RW`: `Aoro`, + `9Y`: `Aocos`, + `AOW`: `Aocwei`, + `AP`: `Apple`, + `APS`: `ApoloSign`, + `ARC`: `Arçelik`, + `AR`: `Archos`, + `AB`: `Arian Space`, + `ARI`: `Arival`, + `A6`: `Ark`, + `5A`: `ArmPhone`, + `AN`: `Arnova`, + `AS`: `ARRIS`, + `AQ`: `Aspera`, + `HJ`: `Aquarius`, + `40`: `Artel`, + `21`: `Artizlee`, + `59`: `ArtLine`, + `8A`: `Asano`, + `90`: `Asanzo`, + `1U`: `Astro (UA)`, + `AST`: `astro (MY)`, + `A4`: `Ask`, + `A8`: `Assistant`, + `ASS`: `ASSE`, + `AU`: `Asus`, + `6A`: `AT&T`, + `ATH`: `Athesi`, + `ATE`: `Atlantic Electrics`, + `5Q`: `Atmaca Elektronik`, + `YH`: `ATMAN`, + `ATM`: `ATMPC`, + `2A`: `Atom`, + `AT1`: `Atozee`, + `ATO`: `ATOL`, + `Z2`: `Atvio`, + `ATI`: `Attila`, + `ATU`: `Atouch`, + `AX`: `Audiovox`, + `AJ`: `AURIS`, + `YZ`: `Autan`, + `AUP`: `AUPO`, + `ZA`: `Avenzo`, + `AH`: `AVH`, + `AV`: `Avvio`, + `AVA`: `Avaya`, + `AXE`: `AXEN`, + `AY`: `Axxion`, + `AXX`: `AXXA`, + `AYA`: `AYA`, + `YR`: `AYYA`, + `XA`: `Axioo`, + `AM`: `Azumi Mobile`, + `AZE`: `Azeyou`, + `AZU`: `Azupik`, + `AZO`: `AZOM`, + `WW`: `Awow`, + `AWO`: `AWOX`, + `XU`: `AUX`, + `BAC`: `Backcell`, + `BFF`: `BAFF`, + `BO`: `BangOlufsen`, + `BN`: `Barnes & Noble`, + `BAR`: `BARTEC`, + `BAS`: `BASE`, + `BAU`: `BAUHN`, + `BB`: `BBK`, + `0B`: `BB Mobile`, + `B6`: `BDF`, + `QD`: `BDQ`, + `8Z`: `BDsharing`, + `BEF`: `Beafon`, + `BE`: `Becker`, + `B5`: `Beeline`, + `B0`: `Beelink`, + `BL`: `Beetel`, + `BEK`: `Beko`, + `2X`: `Benco`, + `BQ`: `BenQ`, + `BQL`: `Bqeel`, + `BS`: `BenQ-Siemens`, + `4Y`: `Benzo`, + `XJ`: `Benesse`, + `BEN`: `BenWee`, + `YB`: `Beista`, + `BY`: `BS Mobile`, + `BZ`: `Bezkam`, + `BEL`: `Bell`, + `9B`: `Bellphone`, + `63`: `Beyond`, + `BG`: `BGH`, + `6B`: `Bigben`, + `B8`: `BIHEE`, + `1B`: `Billion`, + `BA`: `BilimLand`, + `BIL`: `Billow`, + `BH`: `BioRugged`, + `BI`: `Bird`, + `BT`: `Bitel`, + `B7`: `Bitmore`, + `ZB`: `Bittium`, + `BIE`: `Biegedy`, + `BK`: `Bkav`, + `5B`: `Black Bear`, + `BLK`: `Black Box`, + `BF`: `Black Fox`, + `BPC`: `Blackpcs`, + `BLP`: `Blackphone`, + `BLT`: `Blackton`, + `B2`: `Blackview`, + `2Y`: `b2m`, + `BP`: `Blaupunkt`, + `BU`: `Blu`, + `BUS`: `BluSlate`, + `BUZ`: `BuzzTV`, + `B3`: `Bluboo`, + `2B`: `Bluedot`, + `BD`: `Bluegood`, + `LB`: `Bluewave`, + `J8`: `Bluebird`, + `BSS`: `BlueSky`, + `7B`: `Blloc`, + `UB`: `Bleck`, + `Q2`: `Blow`, + `BLI`: `BLISS`, + `BM`: `Bmobile`, + `Y5`: `BMAX`, + `BMX`: `BMXC`, + `B9`: `Bobarry`, + `B4`: `bogo`, + `BOL`: `Bolva`, + `BW`: `Boway`, + `BOO`: `Boost`, + `BOK`: `Bookeen`, + `BOT`: `Botech`, + `BX`: `bq`, + `8B`: `Brandt`, + `BRA`: `BrandCode`, + `BV`: `Bravis`, + `BRV`: `BRAVE`, + `BRG`: `Brigmton`, + `BR`: `Brondi`, + `XF`: `BROR`, + `BJ`: `BrightSign`, + `B1`: `Bush`, + `4Q`: `Bundy`, + `Y8`: `Bubblegum`, + `BMW`: `BMW`, + `BYJ`: `BYJU'S`, + `BYY`: `BYYBUO`, + `BYD`: `BYD`, + `C9`: `CAGI`, + `CAD`: `CADENA`, + `CAL`: `CALME`, + `CAI`: `Caixun`, + `CT`: `Capitel`, + `GRD`: `G-Guard`, + `GVL`: `G-Vill`, + `G3`: `CG Mobile`, + `37`: `CGV`, + `CP`: `Captiva`, + `CPD`: `CPDEVICE`, + `CF`: `Carrefour`, + `CA1`: `Carbon Mobile`, + `CS`: `Casio`, + `R4`: `Casper`, + `CA`: `Cat`, + `BC`: `Camfone`, + `CJ`: `Cavion`, + `CNM`: `Canaima`, + `CAN`: `Canal+`, + `4D`: `Canal Digital`, + `CNG`: `Canguro`, + `CNT`: `CCIT`, + `CEC`: `Cecotec`, + `CEP`: `CEPTER`, + `CEI`: `Ceibal`, + `02`: `Cell-C`, + `CEL`: `Cellacom`, + `34`: `CellAllure`, + `7C`: `Celcus`, + `CE`: `Celkon`, + `CG`: `Cellution`, + `62`: `Centric`, + `CEN`: `CENTEK`, + `C2`: `Changhong`, + `CHA`: `Chainway`, + `CHG`: `ChiliGreen`, + `CH`: `Cherry Mobile`, + `C3`: `China Mobile`, + `U9`: `China Telecom`, + `CI`: `Chico Mobile`, + `CHC`: `CHCNAV`, + `CIA`: `C Idea`, + `CIP`: `CipherLab`, + `CIT`: `Citycall`, + `1C`: `Chuwi`, + `L8`: `Clarmin`, + `25`: `Claresta`, + `CLA`: `CLAYTON`, + `CLT`: `Clovertek`, + `1J`: `Cloud`, + `CD`: `Cloudfone`, + `6C`: `Cloudpad`, + `C0`: `Clout`, + `CN`: `CnM`, + `CY`: `Coby Kyros`, + `XC`: `Cobalt`, + `C6`: `Comio`, + `COM`: `CommScope`, + `CL`: `Compal`, + `CQ`: `Compaq`, + `C7`: `ComTrade Tesla`, + `7Z`: `COMPUMAX`, + `C8`: `Concord`, + `CC`: `ConCorde`, + `C5`: `Condor`, + `C5M`: `C5 Mobile`, + `COE`: `Cogeco`, + `4C`: `Conquest`, + `COG`: `CONSUNG`, + `3C`: `Contixo`, + `8C`: `Connex`, + `53`: `Connectce`, + `CON`: `Conceptum`, + `CED`: `Continental Edison`, + `9C`: `Colors`, + `COL`: `COLORROOM`, + `CAA`: `coocaa`, + `CO`: `Coolpad`, + `COO`: `Coopers`, + `CDE`: `COOD-E`, + `4R`: `CORN`, + `1O`: `Cosmote`, + `CW`: `Cowon`, + `75`: `Covia`, + `QG`: `COYOTE`, + `CKK`: `CKK Mobile`, + `YW`: `ClearPHONE`, + `33`: `Clementoni`, + `CR`: `CreNova`, + `CX`: `Crescent`, + `CRE`: `Crestron`, + `CK`: `Cricket`, + `CM`: `Crius Mea`, + `CMF`: `CMF`, + `0C`: `Crony`, + `C1`: `Crosscall`, + `4W`: `Crown`, + `CTR`: `Ctroniq`, + `CU`: `Cube`, + `CB`: `CUBOT`, + `CUI`: `Cuiud`, + `CUL`: `Cultraview`, + `CV`: `CVTE`, + `CWO`: `Cwowdefu`, + `CX0`: `CX`, + `C4`: `Cyrus`, + `D5`: `Daewoo`, + `DA`: `Danew`, + `DAN`: `Dany`, + `DA1`: `DangcapHD`, + `DAR`: `Daria`, + `DT`: `Datang`, + `D7`: `Datawind`, + `7D`: `Datamini`, + `6D`: `Datalogic`, + `D1`: `Datsun`, + `DZ`: `Dazen`, + `DAS`: `DASS`, + `DAW`: `Dawlance`, + `DB`: `Dbtel`, + `DBP`: `DbPhone`, + `DCO`: `Dcode`, + `DL`: `Dell`, + `DL0`: `DL`, + `DE`: `Denver`, + `DS`: `Desay`, + `DSD`: `DSDevices`, + `DSI`: `DSIC`, + `DW`: `DeWalt`, + `DX`: `DEXP`, + `DEY`: `DEYI`, + `DEN`: `Denali`, + `DEA`: `DEALDIG`, + `DNK`: `Denka`, + `8D`: `DF`, + `DGT`: `DGTEC`, + `DG`: `Dialog`, + `DIA`: `DIALN`, + `DI`: `Dicam`, + `D4`: `Digi`, + `D3`: `Digicel`, + `DDG`: `Digidragon`, + `DH`: `Digihome`, + `DD`: `Digiland`, + `DIJ`: `DIJITSU`, + `DIG`: `Digit4G`, + `DIC`: `DIGICOM`, + `Q0`: `DIGIFORS`, + `DIK`: `DIKOM`, + `DQ`: `DISH`, + `DIS`: `Disney`, + `9D`: `Ditecma`, + `D2`: `Digma`, + `1D`: `Diva`, + `DIV`: `DiverMax`, + `D6`: `Divisat`, + `DIO`: `DIORA`, + `DIF`: `Diofox`, + `X6`: `DIXON`, + `DIM`: `DIMO`, + `5D`: `DING DING`, + `DIN`: `Dinax`, + `DNA`: `Dinalink`, + `DM`: `DMM`, + `DMO`: `DMOAO`, + `DN`: `DNS`, + `DC`: `DoCoMo`, + `DF`: `Doffler`, + `D9`: `Dolamee`, + `DO`: `Doogee`, + `D0`: `Doopro`, + `DV`: `Doov`, + `DOM`: `Dom.ru`, + `DP`: `Dopod`, + `DPA`: `DPA`, + `JQ`: `Doppio`, + `DR`: `Doro`, + `DOR`: `Dora`, + `ZD`: `DORLAND`, + `DRO`: `Droidlogic`, + `D8`: `Droxio`, + `DJ`: `Dragon Touch`, + `DRA`: `DRAGON`, + `DY`: `Dreamgate`, + `DRE`: `DreamTab`, + `DR1`: `DreamStar`, + `DTA`: `Dtac`, + `DU`: `Dune HD`, + `DUO`: `DuoTV`, + `UD`: `DUNNS Mobile`, + `DUU`: `Duubee`, + `DUR`: `Durabook`, + `DUD`: `DUDU AUTO`, + `DYO`: `Dyon`, + `DYM`: `Dykemann`, + `DTE`: `D-Tech`, + `DLI`: `D-Link`, + `ENO`: `eNOVA`, + `IN2`: `iNOVA`, + `IN3`: `inovo`, + `INH`: `Inhon`, + `IND`: `Indurama`, + `EB`: `E-Boda`, + `EJ`: `Engel`, + `ENA`: `ENACOM`, + `END`: `ENDURO`, + `ENI`: `ENIE`, + `2E`: `E-Ceros`, + `E8`: `E-tel`, + `ETH`: `E-TACHI`, + `EAS`: `EAS Electric`, + `EP`: `Easypix`, + `EQ`: `Eagle`, + `EGS`: `EagleSoar`, + `EA`: `EBEST`, + `YC`: `EBEN`, + `E4`: `Echo Mobiles`, + `EQ1`: `Equator`, + `ES`: `ECS`, + `35`: `ECON`, + `ECC`: `ECOO`, + `ZZ`: `ecom`, + `ECS`: `EcoStar`, + `EDE`: `Edenwood`, + `E6`: `EE`, + `GW`: `EGL`, + `EGO`: `EGOTEK`, + `EFT`: `EFT`, + `EK`: `EKO`, + `EY`: `Einstein`, + `EM`: `Eks Mobility`, + `UE`: `Ematic`, + `EMR`: `Emporia`, + `4K`: `EKT`, + `EKI`: `EKINOX`, + `7E`: `ELARI`, + `03`: `Electroneum`, + `Z8`: `ELECTRONIA`, + `ELG`: `ELE-GATE`, + `EL1`: `Elecson`, + `ELK`: `Elektroland`, + `L0`: `Element`, + `EG`: `Elenberg`, + `EL`: `Elephone`, + `JE`: `Elekta`, + `ELE`: `Elevate`, + `ELS`: `Elista`, + `ELT`: `elit`, + `4E`: `Eltex`, + `ELM`: `Elong Mobile`, + `ED`: `Energizer`, + `E1`: `Energy Sistem`, + `3E`: `Enot`, + `ENT`: `Entity`, + `ENV`: `Envizen`, + `8E`: `Epik One`, + `EPK`: `Epic`, + `XP`: `Epson`, + `EPH`: `Ephone`, + `EPL`: `Eplutus`, + `E7`: `Ergo`, + `EC`: `Ericsson`, + `05`: `Erisson`, + `ER`: `Ericy`, + `EE`: `Essential`, + `E2`: `Essentielb`, + `6E`: `eSTAR`, + `ETO`: `ETOE`, + `EN`: `Eton`, + `ET`: `eTouch`, + `1E`: `Etuline`, + `EHL`: `Ehlel`, + `EU`: `Eurostar`, + `4J`: `Eurocase`, + `EUR`: `EUROLUX`, + `EUD`: `Eudora`, + `E9`: `Evercoss`, + `EV`: `Evertek`, + `EVE`: `Everest`, + `EV1`: `Everex`, + `EVR`: `Everis`, + `EVF`: `Everfine`, + `E3`: `Evolio`, + `EO`: `Evolveo`, + `0Q`: `Evoo`, + `5U`: `EVPAD`, + `EVV`: `evvoli`, + `E0`: `EvroMedia`, + `XE`: `ExMobile`, + `4Z`: `Exmart`, + `EH`: `EXO`, + `EX`: `Explay`, + `EXP`: `Express LUCK`, + `E5`: `Extrem`, + `EXL`: `ExtraLink`, + `EF`: `EXCEED`, + `QE`: `EWIS`, + `EI`: `Ezio`, + `EZ`: `Ezze`, + `UF`: `EYU`, + `EYE`: `Eyemoo`, + `UE1`: `UE`, + `5F`: `F150`, + `FPS`: `F+`, + `F6`: `Facebook`, + `FAC`: `Facetel`, + `FA1`: `Facime`, + `FA`: `Fairphone`, + `FM`: `Famoco`, + `FAM`: `Famous`, + `17`: `FarEasTone`, + `9R`: `FaRao Pro`, + `FAR`: `Farassoo`, + `FB`: `Fantec`, + `FAN`: `Fanvace`, + `FE`: `Fengxiang`, + `FEN`: `Fenoti`, + `F7`: `Fero`, + `67`: `FEONAL`, + `FI`: `FiGO`, + `J9`: `FiGi`, + `FIG`: `Figgers`, + `F9`: `FiiO`, + `F1`: `FinePower`, + `FX`: `Finlux`, + `F3`: `FireFly Mobile`, + `F8`: `FISE`, + `FIS`: `Fision`, + `FIT`: `FITCO`, + `FLM`: `Filimo`, + `FIL`: `FILIX`, + `FIN`: `FINIX`, + `FL`: `Fly`, + `QC`: `FLYCAT`, + `FLY`: `FLYCOAY`, + `FLU`: `Fluo`, + `FN`: `FNB`, + `FOB`: `Fobem`, + `FD`: `Fondi`, + `0F`: `Fourel`, + `44`: `Four Mobile`, + `F0`: `Fonos`, + `F0N`: `FONTEL`, + `F2`: `FORME`, + `FRM`: `Formovie`, + `F5`: `Formuler`, + `FR`: `Forstar`, + `RF`: `Fortis`, + `FRT`: `FortuneShip`, + `FO`: `Foxconn`, + `FOD`: `FoxxD`, + `FJ`: `FOODO`, + `FOS`: `FOSSiBOT`, + `FRE`: `free`, + `FT`: `Freetel`, + `FTH`: `FRESH`, + `FEY`: `FreeYond`, + `FRU`: `Frunsi`, + `F4`: `F&U`, + `1F`: `FMT`, + `FPT`: `FPT`, + `FG`: `Fuego`, + `FUJ`: `FUJICOM`, + `FU`: `Fujitsu`, + `4F`: `Funai`, + `5J`: `Fusion5`, + `FF`: `Future Mobile Technology`, + `FFF`: `FFF SmartLife`, + `FW`: `FNF`, + `FXT`: `Fxtec`, + `GT`: `G-TiDE`, + `G9`: `G-Touch`, + `GFO`: `Gfone`, + `GTM`: `GTMEDIA`, + `GTX`: `GTX`, + `GDL`: `GDL`, + `0G`: `GFive`, + `GM`: `Garmin-Asus`, + `GA`: `Gateway`, + `99`: `Galaxy Innovations`, + `GA1`: `Galactic`, + `GAT`: `Galatec`, + `GAM`: `Gamma`, + `GAZ`: `Gazer`, + `GAL`: `Gazal`, + `GEA`: `Geanee`, + `GEN`: `Geant`, + `GD`: `Gemini`, + `GN`: `General Mobile`, + `2G`: `Genesis`, + `GEP`: `Geo Phone`, + `G2`: `GEOFOX`, + `GE`: `Geotel`, + `Q4`: `Geotex`, + `GEO`: `GEOZON`, + `GNO`: `Getnord`, + `GER`: `Gear Mobile`, + `GH`: `Ghia`, + `2C`: `Ghong`, + `GJ`: `Ghost`, + `GG`: `Gigabyte`, + `GS`: `Gigaset`, + `GZ`: `Ginzzu`, + `1G`: `Gini`, + `GI`: `Gionee`, + `GIR`: `GIRASOLE`, + `G4`: `Globex`, + `GL2`: `GlobalSec`, + `GLB`: `Globmall`, + `GME`: `GlocalMe`, + `38`: `GLONYX`, + `U6`: `Glofiish`, + `GLO`: `Glory Star`, + `GNE`: `GN Electronics`, + `G7`: `GoGEN`, + `GC`: `GOCLEVER`, + `5G`: `Gocomma`, + `GB`: `Gol Mobile`, + `GL`: `Goly`, + `GOL`: `GoldMaster`, + `GOS`: `GoldStar`, + `GOB`: `GOLDBERG`, + `GX`: `GLX`, + `G5`: `Gome`, + `G1`: `GoMobile`, + `GO`: `Google`, + `G0`: `Goophone`, + `6G`: `Gooweel`, + `GOO`: `GOODTEL`, + `GO1`: `GOtv`, + `GPL`: `G-PLUS`, + `8G`: `Gplus`, + `GR`: `Gradiente`, + `GRE`: `Graetz`, + `GP`: `Grape`, + `G6`: `Gree`, + `GRA`: `Great Asia`, + `3G`: `Greentel`, + `GRO`: `Green Orange`, + `GRL`: `Green Lion`, + `GR1`: `GroBerwert`, + `GF`: `Gretel`, + `82`: `Gresso`, + `GRB`: `Grünberg`, + `GU`: `Grundig`, + `GV`: `Gtel`, + `CUO`: `Guophone`, + `CUD`: `CUD`, + `GVC`: `GVC Pro`, + `H13`: `H133`, + `9Z`: `H96`, + `HF`: `Hafury`, + `9F`: `HAOVM`, + `HAQ`: `HAOQIN`, + `HA`: `Haier`, + `HEC`: `HEC`, + `XH`: `Haipai`, + `XHU`: `Haixu`, + `HAN`: `Handheld`, + `HE`: `HannSpree`, + `HNS`: `Hanseatic`, + `HA2`: `Hanson`, + `HK`: `Hardkernel`, + `HAR`: `Harper`, + `HA1`: `Hartens`, + `HS`: `Hasee`, + `8H`: `Hamlet`, + `HAM`: `Hammer`, + `HAT`: `Hathway`, + `HAV`: `HAVIT`, + `HEM`: `Hemilton`, + `H6`: `Helio`, + `HQ`: `HERO`, + `ZH`: `Hezire`, + `HEX`: `HexaByte`, + `HEW`: `HeadWolf`, + `HEI`: `Heimat`, + `HL`: `Hi-Level`, + `3H`: `Hi`, + `HIB`: `Hiberg`, + `HBY`: `HiBy`, + `HIH`: `HiHi`, + `HIK`: `HiKing`, + `H2`: `Highscreen`, + `Q1`: `High Q`, + `HI1`: `HIGH1ONE`, + `HIG`: `HiGrace`, + `1H`: `Hipstreet`, + `HIR`: `Hiremco`, + `HI`: `Hisense`, + `HIP`: `HIPER`, + `HC`: `Hitachi`, + `H8`: `Hitech`, + `W3`: `HiMax`, + `8X`: `Hi Nova`, + `HLL`: `HLLO`, + `HKC`: `HKC`, + `HMD`: `HMD`, + `8W`: `HKPro`, + `HOF`: `HOFER`, + `HOC`: `hoco`, + `H1`: `Hoffmann`, + `HOM`: `Homatics`, + `H0`: `Hometech`, + `HLB`: `HOLLEBERG`, + `HM`: `Homtom`, + `HM1`: `HOMII`, + `HOP`: `Hopeland`, + `HZ`: `Hoozo`, + `HOR`: `Horion`, + `H7`: `Horizon`, + `4H`: `Horizont`, + `HO`: `Hosin`, + `H3`: `Hotel`, + `HV`: `Hotwav`, + `U8`: `Hot Pepper`, + `HOT`: `HOTACK`, + `JH`: `HOTREALS`, + `HW`: `How`, + `WH`: `Honeywell`, + `HON`: `HongTop`, + `HOG`: `HONKUAHG`, + `HP`: `HP`, + `HDC`: `HDC`, + `HT`: `HTC`, + `QZ`: `Huagan`, + `HD`: `Huadoo`, + `HG`: `Huavi`, + `HU`: `Huawei`, + `HX`: `Humax`, + `HUM`: `Humanware`, + `HME`: `HUMElab`, + `HR`: `Hurricane`, + `H5`: `Huskee`, + `HUG`: `Hugerock`, + `HY`: `Hyrican`, + `HN`: `Hyundai`, + `7H`: `Hyve`, + `HYT`: `Hytera`, + `HYK`: `Hykker`, + `HYA`: `Hyatta`, + `IKL`: `I KALL`, + `3I`: `i-Cherry`, + `IJ`: `i-Joy`, + `IM`: `i-mate`, + `IO`: `i-mobile`, + `INN`: `I-INN`, + `IPL`: `I-Plus`, + `OF`: `iOutdoor`, + `IB`: `iBall`, + `IY`: `iBerry`, + `7I`: `iBrit`, + `IBO`: `ibowin`, + `I2`: `IconBIT`, + `ING`: `Icone Gold`, + `IC`: `iDroid`, + `IDI`: `iDino`, + `6Z`: `iData`, + `IDC`: `IDC`, + `IG`: `iGet`, + `IHL`: `iHome Life`, + `IH`: `iHunt`, + `IA`: `Ikea`, + `IYO`: `iYou`, + `8I`: `IKU Mobile`, + `2K`: `IKI Mobile`, + `IK`: `iKoMo`, + `58`: `iKon`, + `588`: `iKonia`, + `I7`: `iLA`, + `2I`: `iLife`, + `1I`: `iMars`, + `IMI`: `iMI`, + `U4`: `iMan`, + `ILE`: `iLepo`, + `IL`: `IMO Mobile`, + `IMA`: `Imaq`, + `IM1`: `Imose`, + `I3`: `Impression`, + `FC`: `INCAR`, + `2H`: `Inch`, + `6I`: `Inco`, + `INK`: `Inka`, + `IW`: `iNew`, + `IF`: `Infinix`, + `INF`: `Infiniton`, + `IPR`: `InfinityPro`, + `I0`: `InFocus`, + `IN1`: `InFone`, + `II`: `Inkti`, + `MIR`: `Infomir`, + `81`: `InfoKit`, + `I5`: `InnJoo`, + `26`: `Innos`, + `IN`: `Innostream`, + `I4`: `Inoi`, + `INO`: `iNo Mobile`, + `IQ`: `INQ`, + `QN`: `iQ&T`, + `IS`: `Insignia`, + `YI`: `INSYS`, + `IT`: `Intek`, + `INT`: `Intel`, + `IX`: `Intex`, + `IV`: `Inverto`, + `32`: `Invens`, + `4I`: `Invin`, + `IFT`: `iFIT`, + `INA`: `iNavi`, + `I1`: `iOcean`, + `IMU`: `iMuz`, + `IP`: `iPro`, + `X9`: `iPEGTOP`, + `8Q`: `IQM`, + `Q8`: `IRA`, + `I6`: `Irbis`, + `5I`: `Iris`, + `IRE`: `iReplace`, + `IR`: `iRola`, + `IU`: `iRulu`, + `IRO`: `iRobot`, + `9I`: `iSWAG`, + `9J`: `iSafe Mobile`, + `IST`: `iStar`, + `86`: `IT`, + `IZ`: `iTel`, + `0I`: `iTruck`, + `I8`: `iVA`, + `IE`: `iView`, + `0J`: `iVooMi`, + `UI`: `ivvi`, + `QW`: `iWaylink`, + `I9`: `iZotron`, + `IXT`: `iXTech`, + `IOT`: `IOTWE`, + `JA`: `JAY-Tech`, + `JAM`: `Jambo`, + `KJ`: `Jiake`, + `JD`: `Jedi`, + `JEE`: `Jeep`, + `J6`: `Jeka`, + `JF`: `JFone`, + `JI`: `Jiayu`, + `JG`: `Jinga`, + `JIN`: `Jin Tu`, + `JX`: `Jio`, + `VJ`: `Jivi`, + `JK`: `JKL`, + `JR1`: `JREN`, + `JO`: `Jolla`, + `JP`: `Joy`, + `JOY`: `JoySurf`, + `UJ`: `Juniper Systems`, + `J5`: `Just5`, + `JUS`: `JUSYEA`, + `7J`: `Jumper`, + `JPA`: `JPay`, + `JV`: `JVC`, + `JXD`: `JXD`, + `JS`: `Jesy`, + `KT`: `K-Touch`, + `KLT`: `K-Lite`, + `K4`: `Kaan`, + `K7`: `Kaiomy`, + `KL`: `Kalley`, + `K6`: `Kanji`, + `KA`: `Karbonn`, + `K5`: `KATV1`, + `KAP`: `Kapsys`, + `K0`: `Kata`, + `KZ`: `Kazam`, + `9K`: `Kazuna`, + `KD`: `KDDI`, + `KHA`: `Khadas`, + `KS`: `Kempler & Strauss`, + `K3`: `Keneksi`, + `KHI`: `KENSHI`, + `KNW`: `KENWOOD`, + `KX`: `Kenxinda`, + `KEN`: `Kenbo`, + `KND`: `Kendo`, + `KZG`: `KZG`, + `K1`: `Kiano`, + `KID`: `kidiby`, + `5W`: `Kingbox`, + `KI`: `Kingsun`, + `KIS`: `Kinstone`, + `KF`: `KINGZONE`, + `KIN`: `Kingstar`, + `46`: `Kiowa`, + `KV`: `Kivi`, + `64`: `Kvant`, + `KVA`: `KVADRA`, + `0K`: `Klipad`, + `KNM`: `KN Mobile`, + `KC`: `Kocaso`, + `KK`: `Kodak`, + `KG`: `Kogan`, + `KGT`: `KGTEL`, + `KM`: `Komu`, + `KMC`: `KMC`, + `KO`: `Konka`, + `KW`: `Konrow`, + `KB`: `Koobee`, + `7K`: `Koolnee`, + `K9`: `Kooper`, + `KP`: `KOPO`, + `KR`: `Koridy`, + `XK`: `Koslam`, + `K2`: `KRONO`, + `KRX`: `Korax`, + `KE`: `Krüger&Matz`, + `5K`: `KREZ`, + `WK`: `KRIP`, + `KRA`: `Kraft`, + `KH`: `KT-Tech`, + `KTC`: `KTC`, + `Z6`: `KUBO`, + `KUG`: `KuGou`, + `K8`: `Kuliao`, + `8K`: `Kult`, + `KU`: `Kumai`, + `6K`: `Kurio`, + `KYD`: `Kydos`, + `KY`: `Kyocera`, + `KQ`: `Kyowon`, + `1K`: `Kzen`, + `LQ`: `LAIQ`, + `L6`: `Land Rover`, + `L2`: `Landvo`, + `LA`: `Lanix`, + `LA1`: `Lanin`, + `LK`: `Lark`, + `Z3`: `Laurus`, + `LEC`: `Lectrus`, + `LAS`: `Laser`, + `LV`: `Lava`, + `LVI`: `Lville`, + `LC`: `LCT`, + `L5`: `Leagoo`, + `U3`: `Leben`, + `LEB`: `LeBest`, + `LD`: `Ledstar`, + `LEE`: `Leelbox`, + `L1`: `LeEco`, + `4B`: `Leff`, + `LEG`: `Legend`, + `L4`: `Lemhoov`, + `W9`: `LEMFO`, + `LEM`: `Lemco`, + `LN`: `Lenco`, + `LE`: `Lenovo`, + `LT`: `Leotec`, + `LP`: `Le Pan`, + `ZJ`: `Leke`, + `L7`: `Lephone`, + `LZ`: `Lesia`, + `L3`: `Lexand`, + `LX`: `Lexibook`, + `LG`: `LG`, + `39`: `Liberton`, + `5L`: `Linsar`, + `LIN`: `Linsay`, + `LF`: `Lifemaxx`, + `LI`: `Lingwin`, + `LIB`: `Lingbo`, + `LIM`: `Lime`, + `LJ`: `L-Max`, + `LW`: `Linnex`, + `JJ`: `Listo`, + `LNM`: `LNMBBS`, + `LO`: `Loewe`, + `LNG`: `LongTV`, + `YL`: `Loview`, + `LOV`: `Lovme`, + `LGN`: `LOGAN`, + `1L`: `Logic`, + `LH`: `Logic Instrument`, + `LM`: `Logicom`, + `LOG`: `Logik`, + `LGT`: `Logitech`, + `GY`: `LOKMAT`, + `LPX`: `LPX-G`, + `0L`: `Lumigon`, + `LU`: `Lumus`, + `LUM`: `Lumitel`, + `L9`: `Luna`, + `LNN`: `LUNNEN`, + `LUO`: `LUO`, + `LR`: `Luxor`, + `LY`: `LYF`, + `LL`: `Leader Phone`, + `LTL`: `LYOTECH LABS`, + `QL`: `LT Mobile`, + `LW1`: `LW`, + `MQ`: `M.T.T.`, + `MN`: `M4tel`, + `XM`: `Macoox`, + `92`: `MAC AUDIO`, + `MJ`: `Majestic`, + `FQ`: `Mafe`, + `MAG`: `MAG`, + `MA2`: `MAGCH`, + `6Y`: `Magicsee`, + `MA4`: `Magenta`, + `23`: `Magnus`, + `NH`: `Manhattan`, + `MAN`: `Mango`, + `5M`: `Mann`, + `MA`: `Manta Multimedia`, + `Z0`: `Mantra`, + `J4`: `Mara`, + `MAR`: `Marshal`, + `8Y`: `Massgo`, + `MA1`: `Mascom`, + `2M`: `Masstel`, + `3X`: `Mastertech`, + `MAS`: `Master-G`, + `50`: `Matrix`, + `MAT`: `Matco Tools`, + `7M`: `Maxcom`, + `7M1`: `Maxfone`, + `ZM`: `Maximus`, + `6X`: `Maxtron`, + `0D`: `MAXVI`, + `MAX`: `Maxwell`, + `XZ`: `MAXX`, + `MW`: `Maxwest`, + `M0`: `Maze`, + `YM`: `Maze Speed`, + `87`: `Malata`, + `MAU`: `Maunfeld`, + `MCL`: `McLaut`, + `28`: `MBOX`, + `FK`: `MBI`, + `MBK`: `MBK`, + `3D`: `MDC Store`, + `1Y`: `MDTV`, + `09`: `meanIT`, + `M3`: `Mecer`, + `M3M`: `M3 Mobile`, + `0M`: `Mecool`, + `MEC`: `MECHEN`, + `MEM`: `MeMobile`, + `MC`: `Mediacom`, + `MD`: `Medion`, + `M2`: `MEEG`, + `MEG`: `MEGA VISION`, + `MCA`: `Megacable`, + `MP`: `MegaFon`, + `MGX`: `MEGAMAX`, + `X0`: `mPhone`, + `3M`: `Meitu`, + `M1`: `Meizu`, + `0E`: `Melrose`, + `MU`: `Memup`, + `ME`: `Metz`, + `MEO`: `MEO`, + `MX`: `MEU`, + `MES`: `MESWAO`, + `MI`: `MicroMax`, + `MIP`: `mipo`, + `MS`: `Microsoft`, + `6Q`: `Microtech`, + `MIG`: `Mightier`, + `1X`: `Minix`, + `OM`: `Mintt`, + `MIN`: `Mint`, + `MO`: `Mio`, + `MOD`: `Moondrop`, + `MOR`: `MORTAL`, + `X7`: `Mione`, + `M7`: `Miray`, + `MIT`: `Mitchell & Brown`, + `8M`: `Mito`, + `MT`: `Mitsubishi`, + `0Y`: `Mitsui`, + `M5`: `MIXC`, + `2D`: `MIVO`, + `1Z`: `MiXzo`, + `MIW`: `MIWANG`, + `ML`: `MLLED`, + `LS`: `MLS`, + `MLA`: `MLAB`, + `5H`: `MMI`, + `4M`: `Mobicel`, + `M6`: `Mobiistar`, + `MOK`: `Mobile Kingdom`, + `MH`: `Mobiola`, + `MB`: `Mobistel`, + `ID`: `MobiIoT`, + `6W`: `MobiWire`, + `9M`: `Mobo`, + `MOB`: `Mobell`, + `MVO`: `Mobvoi`, + `M4`: `Modecom`, + `MEP`: `Mode Mobile`, + `MF`: `Mofut`, + `MR`: `Motorola`, + `MTS`: `Motorola Solutions`, + `MIV`: `Motiv`, + `MV`: `Movic`, + `MOV`: `Movitel`, + `MO1`: `MOVISUN`, + `MOS`: `Mosimosi`, + `MOX`: `Moxee`, + `MM`: `Mpman`, + `MZ`: `MSI`, + `3R`: `MStar`, + `M9`: `MTC`, + `N4`: `MTN`, + `72`: `M-Tech`, + `9H`: `M-Horse`, + `MKP`: `M-KOPA`, + `MLB`: `multibox`, + `1R`: `Multilaser`, + `MPS`: `MultiPOS`, + `MLT`: `MULTYNET`, + `1M`: `MYFON`, + `MY1`: `myPhone (PL)`, + `MY`: `MyPhone (PH)`, + `51`: `Myros`, + `M8`: `Myria`, + `6M`: `Mystery`, + `3T`: `MyTab`, + `MG`: `MyWigo`, + `J3`: `Mymaga`, + `MYM`: `MyMobile`, + `07`: `MyGica`, + `MYG`: `MygPad`, + `MWA`: `MwalimuPlus`, + `NEO`: `neoCore`, + `NER`: `Neoregent`, + `08`: `Nabi`, + `N7`: `National`, + `NC`: `Navcity`, + `6N`: `Navitech`, + `7V`: `Navitel`, + `N3`: `Navon`, + `7R`: `NavRoad`, + `NAB`: `NABO`, + `NAS`: `NASCO`, + `NP`: `Naomi Phone`, + `NAN`: `Nanho`, + `NE`: `NEC`, + `NDP`: `Nedaphone`, + `8N`: `Necnot`, + `NF`: `Neffos`, + `9X`: `Neo`, + `NEK`: `NEKO`, + `1N`: `Neomi`, + `7Q`: `Neon IQ`, + `8F`: `Neolix`, + `NES`: `Nesons`, + `NET`: `NetBox`, + `NWT`: `NETWIT`, + `NA`: `Netgear`, + `NEM`: `Netmak`, + `NU`: `NeuImage`, + `NEU`: `NeuTab`, + `NEV`: `NEVIR`, + `NW`: `Newgen`, + `N9`: `Newland`, + `0N`: `Newman`, + `NS`: `NewsMy`, + `ND`: `Newsday`, + `HB`: `New Balance`, + `BRI`: `New Bridge`, + `NEW`: `Newal`, + `XB`: `NEXBOX`, + `NX`: `Nexian`, + `7X`: `Nexa`, + `7XR`: `Nexar`, + `N8`: `NEXON`, + `N2`: `Nextbit`, + `NT`: `NextBook`, + `NTT`: `NTT West`, + `4N`: `NextTab`, + `NEX`: `NEXT`, + `NST`: `Next & NextStar`, + `NJO`: `nJoy`, + `NG`: `NGM`, + `NZ`: `NG Optics`, + `NZP`: `NGpon`, + `NN`: `Nikon`, + `NIL`: `NILAIT`, + `NI`: `Nintendo`, + `NIN`: `NINETEC`, + `NI1`: `NINETOLOGY`, + `N5`: `NOA`, + `N1`: `Noain`, + `N6`: `Nobby`, + `NOC`: `Novacom`, + `NOS`: `NoviSea`, + `NO2`: `NOVIS`, + `NOV`: `Novey`, + `NO1`: `NOVO`, + `57`: `Nubia`, + `JN`: `NOBUX`, + `NB`: `Noblex`, + `OG`: `NOGA`, + `NK`: `Nokia`, + `NM`: `Nomi`, + `2N`: `Nomu`, + `6H`: `Noontec`, + `NR`: `Nordmende`, + `NRD`: `Nordfrost`, + `NOR`: `NORMANDE`, + `7N`: `NorthTech`, + `NOT`: `Nothing`, + `5N`: `Nos`, + `NO`: `Nous`, + `NQ`: `Novex`, + `NOD`: `noDROPOUT`, + `NJ`: `NuAns`, + `NL`: `NUU Mobile`, + `N0`: `Nuvo`, + `NUV`: `NuVision`, + `NV`: `Nvidia`, + `NY`: `NYX Mobile`, + `NON`: `N-one`, + `O3`: `O+`, + `OT`: `O2`, + `O7`: `Oale`, + `OC`: `OASYS`, + `OB`: `Obi`, + `OBR`: `Ober`, + `OQ`: `Meta`, + `O1`: `Odys`, + `ODP`: `Odotpad`, + `O9`: `ok.`, + `OKA`: `Okapi`, + `OA`: `Okapia`, + `OKI`: `Oking`, + `OLA`: `Olax`, + `OLK`: `Olkya`, + `OLY`: `Olympia`, + `OCE`: `OCEANIC`, + `OLT`: `OLTO`, + `OJ`: `Ookee`, + `OD`: `Onda`, + `ON`: `OnePlus`, + `ONC`: `OneClick`, + `ONL`: `OneLern`, + `OAN`: `Oangcc`, + `OX`: `Onix`, + `OIN`: `Onida`, + `3O`: `ONYX BOOX`, + `O4`: `ONN`, + `9Q`: `Onkyo`, + `ONV`: `ONVO`, + `OOR`: `Ooredoo`, + `2O`: `OpelMobile`, + `OH`: `Openbox`, + `7Y`: `Obabox`, + `OP`: `OPPO`, + `OO`: `Opsson`, + `OPT`: `Optoma`, + `OPH`: `Ophone`, + `OR`: `Orange`, + `ORP`: `Orange Pi`, + `ORA`: `Orava`, + `O5`: `Orbic`, + `Y6`: `Orbita`, + `ORB`: `Orbsmart`, + `OS`: `Ordissimo`, + `8O`: `Orion`, + `OTT`: `OTTO`, + `OK`: `Ouki`, + `0O`: `OINOM`, + `OIL`: `Oilsky`, + `QK`: `OKWU`, + `QQ`: `OMIX`, + `56`: `OKSI`, + `OE`: `Oukitel`, + `OU`: `OUYA`, + `JB`: `OUJIA`, + `OV`: `Overmax`, + `30`: `Ovvi`, + `O2`: `Owwo`, + `OSC`: `OSCAL`, + `OXT`: `OX TAB`, + `OY`: `Oysters`, + `QF`: `OYSIN`, + `O6`: `Oyyu`, + `OZ`: `OzoneHD`, + `OLL`: `Ollee`, + `7P`: `P-UP`, + `PRA`: `Pacific Research Alliance`, + `PAG`: `PAGRAER`, + `PAD`: `Padpro`, + `YP`: `Paladin`, + `PM`: `Palm`, + `PN`: `Panacom`, + `PA`: `Panasonic`, + `PNV`: `Panavox`, + `PT`: `Pantech`, + `PAN`: `Pano`, + `PND`: `Panodic`, + `PA1`: `Panoramic`, + `PLT`: `Platoon`, + `PLD`: `PLDT`, + `94`: `Packard Bell`, + `H9`: `Parrot Mobile`, + `PAR`: `Partner Mobile`, + `PAP`: `PAPYRE`, + `PB`: `PCBOX`, + `PCS`: `PC Smart`, + `PC`: `PCD`, + `PD`: `PCD Argentina`, + `PE`: `PEAQ`, + `PEN`: `Penta`, + `PG`: `Pentagram`, + `PQ`: `Pendoo`, + `93`: `Perfeo`, + `8J`: `Pelitt`, + `1P`: `Phicomm`, + `4P`: `Philco`, + `PH`: `Philips`, + `5P`: `Phonemax`, + `PO`: `phoneOne`, + `PI`: `Pioneer`, + `PIC`: `Pioneer Computers`, + `PJ`: `PiPO`, + `8P`: `Pixelphone`, + `9O`: `Pixela`, + `PX`: `Pixus`, + `PIX`: `PIXPRO`, + `QP`: `Pico`, + `PIR`: `PIRANHA`, + `PIN`: `PINE`, + `9P`: `Planet Computers`, + `PLA`: `Play Now`, + `PY`: `Ployer`, + `P4`: `Plum`, + `PLU`: `PlusStyle`, + `22`: `Pluzz`, + `P8`: `PocketBook`, + `0P`: `POCO`, + `FH`: `Point Mobile`, + `PV`: `Point of View`, + `PVB`: `PVBox`, + `PL`: `Polaroid`, + `Q6`: `Polar`, + `97`: `PolarLine`, + `PP`: `PolyPad`, + `P5`: `Polytron`, + `P2`: `Pomp`, + `P0`: `Poppox`, + `0X`: `POPTEL`, + `PS`: `Positivo`, + `3P`: `Positivo BGH`, + `3F`: `Porsche`, + `PRT`: `Portfolio`, + `PPD`: `PPDS`, + `P3`: `PPTV`, + `FP`: `Premio`, + `PR1`: `Premier`, + `PR`: `Prestigio`, + `P9`: `Primepad`, + `PRM`: `PRIME`, + `6P`: `Primux`, + `2P`: `Prixton`, + `PRI`: `Pritom`, + `PRP`: `PRISM+`, + `PF`: `PROFiLO`, + `P6`: `Proline`, + `5O`: `Prology`, + `P1`: `ProScan`, + `PRO`: `PROSONIC`, + `P7`: `Protruly`, + `R0`: `ProVision`, + `7O`: `Polestar`, + `PU`: `PULID`, + `UP`: `Purism`, + `PUN`: `Punos`, + `QFX`: `QFX`, + `Q7`: `Q-Box`, + `QH`: `Q-Touch`, + `QB`: `Q.Bell`, + `QI`: `Qilive`, + `QIN`: `QIN`, + `QIW`: `Qiuwoky`, + `QM`: `QMobile`, + `QT`: `Qtek`, + `Q9`: `QTECH`, + `QA`: `Quantum`, + `QUE`: `Quest`, + `QUA`: `Quatro`, + `QU`: `Quechua`, + `QUI`: `Quipus`, + `QO`: `Qumo`, + `UQ`: `Qubo`, + `QUP`: `Qupi`, + `YQ`: `QLink`, + `QY`: `Qnet Mobile`, + `WJ`: `Qware`, + `QWT`: `QWATT`, + `R2`: `R-TV`, + `R3D`: `R3Di`, + `RA`: `Ramos`, + `0R`: `Raspberry`, + `R9`: `Ravoz`, + `RZ`: `Razer`, + `RAZ`: `RAZZ`, + `95`: `Rakuten`, + `RAY`: `Raylandz`, + `RC`: `RCA Tablets`, + `RCT`: `RCT`, + `2R`: `Reach`, + `RLX`: `Realix`, + `REL`: `RelNAT`, + `RE4`: `Relndoo`, + `RB`: `Readboy`, + `RE`: `Realme`, + `RE1`: `Redbean`, + `R8`: `RED`, + `RDX`: `RED-X`, + `REW`: `Redway`, + `6F`: `Redfox`, + `RE2`: `RedLine`, + `RD`: `Reeder`, + `Z9`: `REGAL`, + `RH`: `Remdun`, + `RP`: `Revo`, + `REV`: `Revomovil`, + `8R`: `Retroid Pocket`, + `REN`: `Renova`, + `RE3`: `RENSO`, + `REP`: `rephone`, + `RHI`: `Rhino`, + `RIC`: `Ricoh`, + `RI`: `Rikomagic`, + `RM`: `RIM`, + `RN`: `Rinno`, + `RNB`: `Ringing Bells`, + `RX`: `Ritmix`, + `R7`: `Ritzviva`, + `RV`: `Riviera`, + `6R`: `Rivo`, + `RIZ`: `Rizzen`, + `RR`: `Roadrover`, + `QR`: `ROADMAX`, + `ROH`: `ROCH`, + `ROC`: `Roam Cat`, + `ROT`: `Rocket`, + `R1`: `Rokit`, + `ROI`: `ROiK`, + `RK`: `Roku`, + `R3`: `Rombica`, + `RUA`: `Romsat`, + `R5`: `Ross&Moor`, + `RO`: `Rover`, + `R6`: `RoverPad`, + `RQ`: `RoyQueen`, + `RJ`: `Royole`, + `RT`: `RT Project`, + `RTK`: `RTK`, + `RG`: `RugGear`, + `RUG`: `Ruggex`, + `RUT`: `RuggeTech`, + `RU`: `Runbo`, + `RUN`: `RunGee`, + `RUP`: `Rupa`, + `RL`: `Ruio`, + `RY`: `Ryte`, + `X5`: `Saba`, + `8L`: `S-TELL`, + `8L1`: `S-Color`, + `4O`: `S2Tel`, + `89`: `Seatel`, + `SEW`: `Sewoo`, + `SE1`: `SEEWO`, + `SEN`: `SENNA`, + `SER`: `SERVO`, + `Y7`: `Saiet`, + `SLF`: `SAILF`, + `X1`: `Safaricom`, + `SG`: `Sagem`, + `SAG`: `Sagemcom`, + `4L`: `Salora`, + `SA`: `Samsung`, + `SAT`: `Samtech`, + `SAM`: `Samtron`, + `SAB`: `Sambox`, + `SNA`: `SNAMI`, + `S0`: `Sanei`, + `12`: `Sansui`, + `SAK`: `Sankey`, + `SQ`: `Santin`, + `SY`: `Sanyo`, + `SAN`: `SANY`, + `S9`: `Savio`, + `Y4`: `TCL SCBC`, + `SCH`: `SCHAUB LORENZ`, + `CZ`: `Schneider`, + `SHO`: `SCHONTECH`, + `SCO`: `Scosmos`, + `SC1`: `Scoole`, + `ZG`: `Schok`, + `G8`: `SEG`, + `SEX`: `SEHMAX`, + `SD`: `Sega`, + `0U`: `Selecline`, + `9G`: `Selenga`, + `SV`: `Selevision`, + `SL`: `Selfix`, + `0S`: `SEMP TCL`, + `S1`: `Sencor`, + `SNM`: `Sencrom`, + `SN`: `Sendo`, + `01`: `Senkatel`, + `S6`: `Senseit`, + `EW`: `Senwa`, + `24`: `Seeken`, + `SEB`: `SEBBE`, + `61`: `Seuic`, + `SX`: `SFR`, + `SGI`: `SGIN`, + `SH`: `Sharp`, + `JU`: `Shanling`, + `7S`: `Shift Phones`, + `78`: `Shivaki`, + `RS`: `Shtrikh-M`, + `3S`: `Shuttle`, + `13`: `Sico`, + `SI`: `Siemens`, + `1S`: `Sigma`, + `70`: `Silelis`, + `SJ`: `Silent Circle`, + `SIL`: `Silva Schneider`, + `10`: `Simbans`, + `98`: `Simply`, + `SIM`: `simfer`, + `52`: `Singtech`, + `SIN`: `SINGER`, + `31`: `Siragon`, + `SIS`: `Siswoo`, + `83`: `Sirin Labs`, + `5Z`: `SK Broadband`, + `GK`: `SKG`, + `SW`: `Sky`, + `SK`: `Skyworth`, + `SKY`: `Skyline`, + `SK1`: `SkyStream`, + `SKT`: `Skytech`, + `SKK`: `SKK Mobile`, + `14`: `Smadl`, + `19`: `Smailo`, + `SR`: `Smart Electronic`, + `SMA`: `Smart Kassel`, + `STE`: `Smart Tech`, + `49`: `Smart`, + `47`: `SmartBook`, + `3B`: `Smartab`, + `80`: `SMARTEC`, + `SM1`: `Smartex`, + `SC`: `Smartfren`, + `S7`: `Smartisan`, + `SMU`: `SMUX`, + `SMT`: `SMT Telecom`, + `JR`: `Sylvania`, + `SYH`: `SYH`, + `3Y`: `Smarty`, + `HH`: `Smooth Mobile`, + `1Q`: `Smotreshka`, + `SF`: `Softbank`, + `9L`: `SOLE`, + `JL`: `SOLO`, + `SOS`: `SOSH`, + `SOD`: `Soda`, + `SOL`: `Solas`, + `16`: `Solone`, + `OI`: `Sonim`, + `SVE`: `Sveon`, + `SO`: `Sony`, + `SE`: `Sony Ericsson`, + `X2`: `Soundmax`, + `SUL`: `SoulLink`, + `8S`: `Soyes`, + `77`: `SONOS`, + `68`: `Soho Style`, + `SOB`: `SobieTech`, + `SOW`: `SOWLY`, + `PK`: `Spark`, + `SPX`: `Sparx`, + `FS`: `SPC`, + `6S`: `Spectrum`, + `43`: `Spectralink`, + `SP`: `Spice`, + `SPD`: `Spider`, + `84`: `Sprint`, + `SPU`: `SPURT`, + `QS`: `SQOOL`, + `S4`: `Star`, + `OL`: `Starlight`, + `STA`: `Star-Light`, + `18`: `Starmobile`, + `2S`: `Starway`, + `45`: `Starwind`, + `SB`: `STF Mobile`, + `S8`: `STK`, + `GQ`: `STG Telecom`, + `S2`: `Stonex`, + `ST`: `Storex`, + `STR`: `Stream`, + `71`: `StrawBerry`, + `96`: `STRONG`, + `69`: `Stylo`, + `STI`: `Stilevs`, + `9S`: `Sugar`, + `SUR`: `Surge`, + `SUF`: `Surfans`, + `06`: `Subor`, + `SUT`: `SULPICE TV`, + `SZ`: `Sumvision`, + `0H`: `Sunstech`, + `S3`: `SunVan`, + `5S`: `Sunvell`, + `5Y`: `Sunny`, + `W8`: `SUNWIND`, + `SBX`: `SuperBOX`, + `SBM`: `Supermax`, + `SBR`: `Sber`, + `SGE`: `Super General`, + `SU`: `SuperSonic`, + `79`: `SuperTab`, + `STV`: `SuperTV`, + `S5`: `Supra`, + `SUP`: `Supraim`, + `ZS`: `Suzuki`, + `2J`: `Sunmi`, + `SUN`: `Sunmax`, + `0W`: `Swipe`, + `SWI`: `Switel`, + `SS`: `SWISSMOBILITY`, + `1W`: `Swisstone`, + `SWO`: `SWOFY`, + `SSK`: `SSKY`, + `SYC`: `Syco`, + `SM`: `Symphony`, + `4S`: `Syrox`, + `SYS`: `System76`, + `TM`: `T-Mobile`, + `T96`: `T96`, + `TAD`: `TADAAM`, + `TK`: `Takara`, + `73`: `Tambo`, + `9N`: `Tanix`, + `U5`: `Taiga System`, + `TAL`: `Talius`, + `7G`: `TAG Tech`, + `TLB`: `TALBERG`, + `TAU`: `TAUBE`, + `T5`: `TB Touch`, + `TC`: `TCL`, + `T0`: `TD Systems`, + `YY`: `TD Tech`, + `H4`: `Technicolor`, + `TEA`: `TeachTouch`, + `Z5`: `Technika`, + `TE1`: `TechSmart`, + `TX`: `TechniSat`, + `TT`: `TechnoTrend`, + `TTS`: `TECHNOSAT`, + `TM1`: `Temigereev`, + `TP`: `TechPad`, + `TPS`: `TPS`, + `9E`: `Techwood`, + `7F`: `Technopc`, + `TCH`: `Techstorm`, + `T7`: `Teclast`, + `TB`: `Tecno Mobile`, + `TEC`: `TecToy`, + `91`: `TEENO`, + `TLK`: `Telkom`, + `2L`: `Tele2`, + `TL`: `Telefunken`, + `TG`: `Telego`, + `T2`: `Telenor`, + `TE`: `Telit`, + `65`: `Telia`, + `TLY`: `Telly`, + `TEL`: `Telma`, + `PW`: `Telpo`, + `TLS`: `TeloSystems`, + `TER`: `Teracube`, + `TD`: `Tesco`, + `TA`: `Tesla`, + `9T`: `Tetratab`, + `TET`: `TETC`, + `TZ`: `teXet`, + `29`: `Teknosa`, + `JZ`: `TJC`, + `TJD`: `TJD`, + `JC`: `TENPLUS`, + `T4`: `ThL`, + `TN`: `Thomson`, + `O0`: `Thuraya`, + `TI`: `TIANYU`, + `JY`: `Tigers`, + `8T`: `Time2`, + `TQ`: `Timovi`, + `TIM`: `TIMvision`, + `2T`: `Tinai`, + `TF`: `Tinmo`, + `TH`: `TiPhone`, + `YV`: `TiVo`, + `TIV`: `Tivax`, + `TIB`: `Tibuta`, + `Y3`: `TOKYO`, + `TOX`: `TOX`, + `T1`: `Tolino`, + `0T`: `Tone`, + `TY`: `Tooky`, + `TYD`: `TYD`, + `TOO`: `TOOGO`, + `TPT`: `Top-Tech`, + `T9`: `Top House`, + `DK`: `Topelotek`, + `42`: `Topway`, + `TO`: `Toplux`, + `TOD`: `TOPDON`, + `TOP`: `TopDevice`, + `TO2`: `TOPSHOWS`, + `7T`: `Torex`, + `TOR`: `Torque`, + `TRN`: `TORNADO`, + `6O`: `TOSCIDO`, + `TO1`: `Topsion`, + `TS`: `Toshiba`, + `T8`: `Touchmate`, + `TOU`: `Touch Plus`, + `5R`: `Transpeed`, + `T6`: `TrekStor`, + `TRP`: `Trecfone`, + `T3`: `Trevi`, + `TRI`: `TriaPlay`, + `TJ`: `Trifone`, + `Q5`: `Trident`, + `TRB`: `Trimble`, + `4T`: `Tronsmart`, + `11`: `True`, + `JT`: `True Slim`, + `J1`: `Trio`, + `TRC`: `Tricolor`, + `THT`: `Tsinghua Tongfang`, + `5C`: `TTEC`, + `TTF`: `TTfone`, + `TTK`: `TTK-TV`, + `TU`: `Tunisie Telecom`, + `1T`: `Turbo`, + `TR`: `Turbo-X`, + `5X`: `TurboPad`, + `5T`: `TurboKids`, + `UR`: `Turkcell`, + `4U`: `TuCEL`, + `TUV`: `Tuvio`, + `TUC`: `TUCSON`, + `2U`: `Türk Telekom`, + `TV`: `TVC`, + `TVP`: `TV+`, + `TW`: `TWM`, + `Z1`: `TWZ`, + `6T`: `Twoe`, + `TWN`: `TwinMOS`, + `15`: `Tymes`, + `UC`: `U.S. Cellular`, + `UD1`: `UD`, + `UGI`: `UGINE`, + `UG`: `Ugoos`, + `U1`: `Uhans`, + `UH`: `Uhappy`, + `UL`: `Ulefone`, + `UA`: `Umax`, + `UM`: `UMIDIGI`, + `UM2`: `Umiio`, + `UNT`: `Unitech`, + `UZ`: `Unihertz`, + `3Z`: `UZ Mobile`, + `UX`: `Unimax`, + `UNQ`: `Uniqcell`, + `US`: `Uniscope`, + `UNI`: `Unistrong`, + `U2`: `UNIWA`, + `UND`: `Uniden`, + `UNE`: `UNITED`, + `UGR`: `United Group`, + `UO`: `Unnecto`, + `UNN`: `Unnion Technologies`, + `UNP`: `UnoPhone`, + `UU`: `Unonu`, + `UN`: `Unowhy`, + `UY`: `UNNO`, + `UOO`: `UOOGOU`, + `UNB`: `Unblock Tech`, + `UK`: `UTOK`, + `3U`: `IUNI`, + `UT`: `UTStarcom`, + `6U`: `UTime`, + `9U`: `Urovo`, + `UW`: `U-Magic`, + `5V`: `VAIO`, + `WV`: `VAVA`, + `VA`: `Vastking`, + `VAS`: `VASOUN`, + `VP`: `Vargo`, + `VC`: `Vankyo`, + `VAL`: `VALEM`, + `VA2`: `VALE`, + `VAT`: `VALTECH`, + `VAN`: `VANGUARD`, + `VAW`: `VANWIN`, + `VB`: `VC`, + `VEI`: `Veidoo`, + `VN`: `Venso`, + `VNP`: `VNPT Technology`, + `VEN`: `Venstar`, + `UV`: `Venturer`, + `VQ`: `Vega`, + `WC`: `VEON`, + `4V`: `Verico`, + `V4`: `Verizon`, + `VR`: `Vernee`, + `VX`: `Vertex`, + `VE`: `Vertu`, + `VET`: `VETAS`, + `VL`: `Verykool`, + `QV`: `Verssed`, + `VER`: `Versus`, + `V8`: `Vesta`, + `VEK`: `Vekta`, + `VT`: `Vestel`, + `48`: `Vexia`, + `V6`: `VGO TEL`, + `QJ`: `VDVD`, + `VIC`: `Victurio`, + `VD`: `Videocon`, + `VW`: `Videoweb`, + `VS`: `ViewSonic`, + `VIE`: `Viendo`, + `VIK`: `VIKUSHA`, + `V7`: `Vinga`, + `V7T`: `V7`, + `V3`: `Vinsoc`, + `XD`: `Vinabox`, + `FV`: `Vios`, + `0V`: `Vipro`, + `ZV`: `Virzo`, + `VIP`: `Viper`, + `VI`: `Vitelcom`, + `VIB`: `ViBox`, + `8V`: `Viumee`, + `V5`: `Vivax`, + `VIV`: `VIVIMAGE`, + `VI2`: `VIVIBright`, + `VV`: `Vivo`, + `6V`: `VIWA`, + `VII`: `VIIPOO`, + `VID`: `VIDA`, + `VZ`: `Vizio`, + `VIZ`: `Vizmo`, + `VIT`: `Vityaz`, + `VTM`: `Vitumi`, + `9V`: `Vision Touch`, + `VIS`: `Vision Technology`, + `VST`: `Visitech`, + `VIL`: `Visual Land`, + `VI1`: `VILLAON`, + `VIM`: `VIMOQ`, + `VK`: `VK Mobile`, + `JM`: `v-mobile`, + `VHO`: `V-HOPE`, + `VHM`: `V-HOME`, + `VGE`: `V-Gen`, + `V0`: `VKworld`, + `VM`: `Vodacom`, + `VOC`: `VOCAL`, + `VF`: `Vodafone`, + `7W`: `VOGA`, + `V2`: `Vonino`, + `1V`: `Vontar`, + `VG`: `Vorago`, + `2V`: `Vorke`, + `8U`: `Vorcom`, + `JW`: `Vortex`, + `VRX`: `VORTEX (RO)`, + `VOR`: `Vormor`, + `V1`: `Voto`, + `Z7`: `VOX`, + `VO`: `Voxtel`, + `VY`: `Voyo`, + `VOL`: `Völfen`, + `VO1`: `Volt`, + `VOP`: `Volla`, + `V02`: `VOLIA`, + `VH`: `Vsmart`, + `V9`: `Vsun`, + `VU`: `Vulcan`, + `3V`: `VVETIME`, + `ZC`: `VUCATIMES`, + `VO2`: `VOLKANO`, + `VUE`: `Vue Micro`, + `WAK`: `Walker`, + `WA`: `Walton`, + `WAF`: `WAF`, + `WAO`: `W&O`, + `WLT`: `Waltham`, + `WAL`: `Waltter`, + `WAI`: `Wainyok`, + `WAT`: `waipu.tv`, + `WHI`: `White Mobile`, + `WHO`: `Whoop`, + `WBL`: `We. by Loewe.`, + `WCP`: `WeChip`, + `WM`: `Weimei`, + `WM1`: `Weiimi`, + `WE`: `WellcoM`, + `W6`: `WELLINGTON`, + `WD`: `Western Digital`, + `WST`: `Weston`, + `WT`: `Westpoint`, + `WAN`: `Wanmukang`, + `WA1`: `WANSA`, + `WY`: `Wexler`, + `3W`: `WE`, + `WEC`: `Wecool`, + `WEE`: `Weelikeit`, + `WP`: `Wieppo`, + `W2`: `Wigor`, + `WI`: `Wiko`, + `WF`: `Wileyfox`, + `WLR`: `WildRed`, + `WS`: `Winds`, + `WN`: `Wink`, + `9W`: `Winmax`, + `W5`: `Winnovo`, + `WU`: `Wintouch`, + `WIS`: `Winstar`, + `W0`: `Wiseasy`, + `2W`: `Wizz`, + `W4`: `WIWA`, + `WIZ`: `WizarPos`, + `WL`: `Wolder`, + `WG`: `Wolfgang`, + `WQ`: `Wolki`, + `WON`: `WONDER`, + `WO`: `Wonu`, + `W1`: `Woo`, + `WR`: `Wortmann`, + `WX`: `Woxter`, + `WOZ`: `WOZIFAN`, + `XQ`: `X-AGE`, + `XEL`: `XElectron`, + `X3`: `X-BO`, + `XBI`: `XB`, + `XMO`: `X-Mobile`, + `XT`: `X-TIGI`, + `XV`: `X-View`, + `X4`: `X.Vision`, + `X88`: `X88`, + `X96`: `X96`, + `96Q`: `X96Q`, + `A95`: `A95X`, + `XG`: `Xgody`, + `XGE`: `XGEM`, + `QX`: `XGIMI`, + `XL`: `Xiaolajiao`, + `XI`: `Xiaomi`, + `XW`: `Xiaodu`, + `XN`: `Xion`, + `XO`: `Xolo`, + `XR`: `Xoro`, + `XPP`: `XPPen`, + `XRL`: `XREAL`, + `XS`: `Xshitou`, + `XSM`: `Xsmart`, + `4X`: `Xtouch`, + `X8`: `Xtratech`, + `XCR`: `Xcruiser`, + `XCO`: `XCOM`, + `XCL`: `Xcell`, + `XWA`: `Xwave`, + `YD`: `Yandex`, + `YA`: `Yarvik`, + `Y2`: `Yes`, + `YES`: `Yestel`, + `YE`: `Yezz`, + `YG`: `YEPEN`, + `YEL`: `YELLYOUTH`, + `YK`: `Yoka TV`, + `YO`: `Yota`, + `YOU`: `Youin`, + `YO1`: `Youwei`, + `YOO`: `Yooz`, + `YT`: `Ytone`, + `Y9`: `YOTOPT`, + `Y1`: `Yu`, + `YF`: `YU Fly`, + `Y0`: `YUHO`, + `YN`: `Yuno`, + `YUN`: `YUNDOO`, + `YUS`: `YunSong`, + `YUM`: `YUMKEM`, + `YIK`: `YIKEMI`, + `YU`: `Yuandao`, + `YS`: `Yusun`, + `YJ`: `YASIN`, + `YX`: `Yxtel`, + `0Z`: `Zatec`, + `2Z`: `Zaith`, + `ZAM`: `Zamolxe`, + `ZAL`: `ZALA`, + `ZZB`: `ZZB`, + `ZEA`: `Zealot`, + `PZ`: `Zebra`, + `ZE1`: `Zeblaze`, + `ZE`: `Zeemi`, + `WZ`: `Zeeker`, + `ZN`: `Zen`, + `ZK`: `Zenek`, + `ZL`: `Zentality`, + `ZF`: `Zfiner`, + `ZI`: `Zidoo`, + `FZ`: `ZIFRO`, + `ZIF`: `ZIFFLER`, + `ZIO`: `ZIOVO`, + `ZX`: `Ziox`, + `ZIK`: `ZIK`, + `ZKI`: `Z-Kai`, + `ZIG`: `Zigo`, + `ZIN`: `Zinox`, + `ZO`: `Zonda`, + `ZW`: `Zonko`, + `ZP`: `Zopo`, + `ZOO`: `ZoomSmart`, + `ZO1`: `Zoom`, + `ZT`: `ZTE`, + `ZU`: `Zuum`, + `ZY`: `Zync`, + `ZR`: `Zyrex`, + `ZQ`: `ZYQ`, + `Z4`: `ZH&K`, + `OW`: `öwn`, + `WBF`: `Webfleet`, + `WSS`: `WS`, // legacy brands, might be removed in future versions `WB`: `Web TV`, `XX`: `Unknown`, diff --git a/parser/device/camera.go b/parser/device/camera.go index f08cb80..4ebdce3 100644 --- a/parser/device/camera.go +++ b/parser/device/camera.go @@ -1,7 +1,7 @@ package device import ( - "path/filepath" + "path" ) const ParserNameCamera = `camera` @@ -10,7 +10,7 @@ const FixtureFileCamera = `cameras.yml` func init() { RegDeviceParser(ParserNameCamera, func(dir string) DeviceParser { - return NewCamera(filepath.Join(dir, FixtureFileCamera)) + return NewCamera(path.Join(dir, FixtureFileCamera)) }) } diff --git a/parser/device/camera_test.go b/parser/device/camera_test.go index 5870bba..0df028e 100644 --- a/parser/device/camera_test.go +++ b/parser/device/camera_test.go @@ -1,15 +1,15 @@ package device import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestCameraParse(t *testing.T) { - ps := NewCamera(filepath.Join(dir, FixtureFileCamera)) + ps := NewCamera(path.Join(dir, FixtureFileCamera)) var list []*DeviceFixture err := ReadYamlFile(`fixtures/camera.yml`, &list) if err != nil { @@ -35,4 +35,4 @@ func TestCameraParse(t *testing.T) { test := item.GetDeviceMatchResult() assert.DeepEqual(t, test, r) } -} \ No newline at end of file +} diff --git a/parser/device/car.go b/parser/device/car.go index b4de894..d8aa3d7 100644 --- a/parser/device/car.go +++ b/parser/device/car.go @@ -1,7 +1,7 @@ package device import ( - "path/filepath" + "path" ) const ParserNameCar = `car browser` @@ -10,7 +10,7 @@ const FixtureFileCar = `car_browsers.yml` func init() { RegDeviceParser(ParserNameCar, func(dir string) DeviceParser { - return NewCar(filepath.Join(dir, FixtureFileCar)) + return NewCar(path.Join(dir, FixtureFileCar)) }) } diff --git a/parser/device/car_test.go b/parser/device/car_test.go index b8e9f06..b6fef38 100644 --- a/parser/device/car_test.go +++ b/parser/device/car_test.go @@ -1,15 +1,15 @@ package device import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestCarParse(t *testing.T) { - ps := NewCar(filepath.Join(dir, FixtureFileCar)) + ps := NewCar(path.Join(dir, FixtureFileCar)) var list []*DeviceFixture err := ReadYamlFile(`fixtures/car_browser.yml`, &list) if err != nil { diff --git a/parser/device/console.go b/parser/device/console.go index 75d5fee..2af6b24 100644 --- a/parser/device/console.go +++ b/parser/device/console.go @@ -1,7 +1,7 @@ package device import ( - "path/filepath" + "path" ) const ParserNameConsole = `console` @@ -10,7 +10,7 @@ const FixtureFileConsole = `consoles.yml` func init() { RegDeviceParser(ParserNameConsole, func(dir string) DeviceParser { - return NewConsole(filepath.Join(dir, FixtureFileConsole)) + return NewConsole(path.Join(dir, FixtureFileConsole)) }) } diff --git a/parser/device/console_test.go b/parser/device/console_test.go index 4f38644..d5ec70b 100644 --- a/parser/device/console_test.go +++ b/parser/device/console_test.go @@ -1,15 +1,15 @@ package device import ( - "path/filepath" + "path" "testing" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" "gotest.tools/assert" ) func TestConsoleParse(t *testing.T) { - ps := NewConsole(filepath.Join(dir, FixtureFileConsole)) + ps := NewConsole(path.Join(dir, FixtureFileConsole)) var list []*DeviceFixture err := ReadYamlFile(`fixtures/console.yml`, &list) if err != nil { @@ -23,4 +23,3 @@ func TestConsoleParse(t *testing.T) { assert.DeepEqual(t, test, r) } } - diff --git a/parser/device/device_parser.go b/parser/device/device_parser.go index 24ee766..c5afd21 100644 --- a/parser/device/device_parser.go +++ b/parser/device/device_parser.go @@ -4,7 +4,7 @@ import ( "sort" "strings" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" ) const UnknownBrand = "Unknown" @@ -125,4 +125,4 @@ func (d *DeviceParserAbstract) Parse(ua string) *DeviceMatchResult { } } return r -} \ No newline at end of file +} diff --git a/parser/device/device_test.go b/parser/device/device_test.go index 910a80a..bd07924 100644 --- a/parser/device/device_test.go +++ b/parser/device/device_test.go @@ -1,13 +1,13 @@ package device -import( - . "github.com/gamebtc/devicedetector/parser" +import ( + . "github.com/slipros/devicedetector/parser" ) const dir = "../../regexes/device" type DeviceFixtureResult struct { - Type int `yaml:"type"` + Type int `yaml:"type"` Model string `yaml:"model"` Brand string `yaml:"brand"` } @@ -17,10 +17,10 @@ type DeviceFixture struct { DeviceFixtureResult `yaml:"device"` } -func (d *DeviceFixture)GetDeviceMatchResult()*DeviceMatchResult { +func (d *DeviceFixture) GetDeviceMatchResult() *DeviceMatchResult { return &DeviceMatchResult{ Model: d.Model, Brand: d.Brand, Type: GetDeviceName(d.Type), } -} \ No newline at end of file +} diff --git a/parser/device/hbbtv.go b/parser/device/hbbtv.go index 8239a1e..7f332ee 100644 --- a/parser/device/hbbtv.go +++ b/parser/device/hbbtv.go @@ -1,9 +1,9 @@ package device import ( - "path/filepath" + "path" - . "github.com/gamebtc/devicedetector/parser" + . "github.com/slipros/devicedetector/parser" ) const ParserNameHbbTv = `tv` @@ -12,7 +12,7 @@ const FixtureFileHbbTv = `televisions.yml` func init() { RegDeviceParser(ParserNameHbbTv, func(dir string) DeviceParser { - return NewHbbTv(filepath.Join(dir, FixtureFileHbbTv)) + return NewHbbTv(path.Join(dir, FixtureFileHbbTv)) }) } diff --git a/parser/device/hbbtv_test.go b/parser/device/hbbtv_test.go index 6ee1de6..771fbff 100644 --- a/parser/device/hbbtv_test.go +++ b/parser/device/hbbtv_test.go @@ -1,14 +1,14 @@ package device import ( - "path/filepath" + "path" "testing" "gotest.tools/assert" ) func TestHbbTvParse(t *testing.T) { - ps := NewHbbTv(filepath.Join(dir, FixtureFileHbbTv)) + ps := NewHbbTv(path.Join(dir, FixtureFileHbbTv)) ua := `Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70` r := ps.Parse(ua) diff --git a/parser/device/mobile.go b/parser/device/mobile.go index 40761b0..2e1dfc1 100644 --- a/parser/device/mobile.go +++ b/parser/device/mobile.go @@ -1,7 +1,7 @@ package device import ( - "path/filepath" + "path" ) const ParserNameMobile = `mobile` @@ -10,7 +10,7 @@ const FixtureFileMobile = `mobiles.yml` func init() { RegDeviceParser(ParserNameMobile, func(dir string) DeviceParser { - return NewMobile(filepath.Join(dir, FixtureFileMobile)) + return NewMobile(path.Join(dir, FixtureFileMobile)) }) } diff --git a/parser/device/portable_media_player.go b/parser/device/portable_media_player.go index 485167c..8f01674 100644 --- a/parser/device/portable_media_player.go +++ b/parser/device/portable_media_player.go @@ -1,7 +1,7 @@ package device import ( - "path/filepath" + "path" ) const ParserNamePortableMediaPlayer = `portablemediaplayer` @@ -10,7 +10,7 @@ const FixtureFilePortableMediaPlayer = `portable_media_player.yml` func init() { RegDeviceParser(ParserNamePortableMediaPlayer, func(dir string) DeviceParser { - return NewPortableMediaPlayer(filepath.Join(dir, FixtureFilePortableMediaPlayer)) + return NewPortableMediaPlayer(path.Join(dir, FixtureFilePortableMediaPlayer)) }) } diff --git a/parser/os.go b/parser/os.go index a460520..1e486e4 100644 --- a/parser/os.go +++ b/parser/os.go @@ -17,113 +17,237 @@ type OsReg struct { var OperatingSystems = map[string]string{ `AIX`: `AIX`, `AND`: `Android`, + `ADR`: `Android TV`, + `ALP`: `Alpine Linux`, + `AMZ`: `Amazon Linux`, `AMG`: `AmigaOS`, - `ATV`: `Apple TV`, + `ARM`: `Armadillo OS`, + `ARO`: `AROS`, + `ATV`: `tvOS`, `ARL`: `Arch Linux`, + `AOS`: `AOSC OS`, + `ASP`: `ASPLinux`, + `AZU`: `Azure Linux`, `BTR`: `BackTrack`, `SBA`: `Bada`, + `BYI`: `Baidu Yi`, `BEO`: `BeOS`, `BLB`: `BlackBerry OS`, `QNX`: `BlackBerry Tablet OS`, + `PAN`: `blackPanther OS`, + `BOS`: `Bliss OS`, `BMP`: `Brew`, + `BSN`: `BrightSignOS`, + `CAI`: `Caixa Mágica`, `CES`: `CentOS`, + `CST`: `CentOS Stream`, + `CLO`: `Clear Linux OS`, + `CLR`: `ClearOS Mobile`, `COS`: `Chrome OS`, + `CRS`: `Chromium OS`, + `CHN`: `China OS`, + `COL`: `Coolita OS`, `CYN`: `CyanogenMod`, `DEB`: `Debian`, + `DEE`: `Deepin`, `DFB`: `DragonFly`, + `DVK`: `DVKBuntu`, + `ELE`: `ElectroBSD`, + `EUL`: `EulerOS`, `FED`: `Fedora`, + `FEN`: `Fenix`, `FOS`: `Firefox OS`, `FIR`: `Fire OS`, + `FOR`: `Foresight Linux`, + `FRE`: `Freebox`, `BSD`: `FreeBSD`, + `FRI`: `FRITZ!OS`, + `FYD`: `FydeOS`, + `FUC`: `Fuchsia`, `GNT`: `Gentoo`, + `GNX`: `GENIX`, + `GEO`: `GEOS`, + `GNS`: `gNewSense`, + `GRI`: `GridOS`, `GTV`: `Google TV`, `HPX`: `HP-UX`, `HAI`: `Haiku OS`, + `IPA`: `iPadOS`, + `HAR`: `HarmonyOS`, + `HAS`: `HasCodingOS`, + `HEL`: `HELIX OS`, `IRI`: `IRIX`, `INF`: `Inferno`, + `JME`: `Java ME`, + `JOL`: `Joli OS`, `KOS`: `KaiOS`, + `KAL`: `Kali`, + `KAN`: `Kanotix`, + `KIN`: `KIN OS`, + `KOL`: `KolibriOS`, `KNO`: `Knoppix`, + `KTV`: `KreaTV`, `KBT`: `Kubuntu`, `LIN`: `GNU/Linux`, + `LEA`: `LeafOS`, + `LND`: `LindowsOS`, + `LNS`: `Linspire`, + `LEN`: `Lineage OS`, + `LIR`: `Liri OS`, + `LOO`: `Loongnix`, `LBT`: `Lubuntu`, + `LOS`: `Lumin OS`, + `LUN`: `LuneOS`, `VLN`: `VectorLinux`, `MAC`: `Mac`, `MAE`: `Maemo`, + `MAG`: `Mageia`, `MDR`: `Mandriva`, `SMG`: `MeeGo`, + `MET`: `Meta Horizon`, `MCD`: `MocorDroid`, + `MON`: `moonOS`, + `EZX`: `Motorola EZX`, `MIN`: `Mint`, `MLD`: `MildWild`, `MOR`: `MorphOS`, `NBS`: `NetBSD`, `MTK`: `MTK / Nucleus`, + `MRE`: `MRE`, + `NXT`: `NeXTSTEP`, + `NWS`: `NEWS-OS`, `WII`: `Nintendo`, `NDS`: `Nintendo Mobile`, + `NOV`: `Nova`, `OS2`: `OS/2`, `T64`: `OSF1`, `OBS`: `OpenBSD`, + `OHS`: `OpenHarmony`, + `OVS`: `OpenVMS`, + `OVZ`: `OpenVZ`, + `OWR`: `OpenWrt`, + `OTV`: `Opera TV`, + `ORA`: `Oracle Linux`, `ORD`: `Ordissimo`, + `PAR`: `Pardus`, + `PCL`: `PCLinuxOS`, + `PIC`: `PICO OS`, + `PLA`: `Plasma Mobile`, `PSP`: `PlayStation Portable`, `PS3`: `PlayStation`, + `PVE`: `Proxmox VE`, + `PUF`: `Puffin OS`, + `PUR`: `PureOS`, + `QTP`: `Qtopia`, + `PIO`: `Raspberry Pi OS`, + `RAS`: `Raspbian`, `RHT`: `Red Hat`, + `RST`: `Red Star`, + `RED`: `RedOS`, + `REV`: `Revenge OS`, + `RIS`: `risingOS`, `ROS`: `RISC OS`, + `ROC`: `Rocky Linux`, + `ROK`: `Roku OS`, + `RSO`: `Rosa`, + `ROU`: `RouterOS`, `REM`: `Remix OS`, + `RRS`: `Resurrection Remix OS`, + `REX`: `REX`, `RZD`: `RazoDroiD`, + `RXT`: `RTOS & Next`, `SAB`: `Sabayon`, `SSE`: `SUSE`, `SAF`: `Sailfish OS`, + `SCI`: `Scientific Linux`, + `SEE`: `SeewoOS`, + `SER`: `SerenityOS`, + `SIR`: `Sirin OS`, `SLW`: `Slackware`, `SOS`: `Solaris`, + `SBL`: `Star-Blade OS`, `SYL`: `Syllable`, `SYM`: `Symbian`, `SYS`: `Symbian OS`, `S40`: `Symbian OS Series 40`, `S60`: `Symbian OS Series 60`, `SY3`: `Symbian^3`, + `TEN`: `TencentOS`, `TDX`: `ThreadX`, `TIZ`: `Tizen`, + `TIV`: `TiVo OS`, `TOS`: `TmaxOS`, + `TUR`: `Turbolinux`, `UBT`: `Ubuntu`, + `ULT`: `ULTRIX`, + `UOS`: `UOS`, + `VID`: `VIDAA`, + `VIZ`: `ViziOS`, + `WAS`: `watchOS`, + `WER`: `Wear OS`, `WTV`: `WebTV`, + `WHS`: `Whale OS`, `WIN`: `Windows`, `WCE`: `Windows CE`, `WIO`: `Windows IoT`, `WMO`: `Windows Mobile`, `WPH`: `Windows Phone`, `WRT`: `Windows RT`, + `WPO`: `WoPhone`, `XBX`: `Xbox`, `XBT`: `Xubuntu`, - `YNS`: `YunOs`, + `YNS`: `YunOS`, + `ZEN`: `Zenwalk`, + `ZOR`: `ZorinOS`, `IOS`: `iOS`, `POS`: `palmOS`, + `WEB`: `Webian`, `WOS`: `webOS`, } // Operating system families mapped to the short codes of the associated operating systems var OsFamilies = map[string][]string{ - `Android`: []string{`AND`, `CYN`, `FIR`, `REM`, `RZD`, `MLD`, `MCD`, `YNS`}, - `AmigaOS`: []string{`AMG`, `MOR`}, - `Apple TV`: []string{`ATV`}, - `BlackBerry`: []string{`BLB`, `QNX`}, - `Brew`: []string{`BMP`}, - `BeOS`: []string{`BEO`, `HAI`}, - `Chrome OS`: []string{`COS`}, - `Firefox OS`: []string{`FOS`, `KOS`}, - `Gaming Console`: []string{`WII`, `PS3`}, - `Google TV`: []string{`GTV`}, - `IBM`: []string{`OS2`}, - `iOS`: []string{`IOS`}, - `RISC OS`: []string{`ROS`}, - `GNU/Linux`: []string{`LIN`, `ARL`, `DEB`, `KNO`, `MIN`, `UBT`, `KBT`, `XBT`, `LBT`, `FED`, `RHT`, `VLN`, `MDR`, `GNT`, `SAB`, `SLW`, `SSE`, `CES`, `BTR`, `SAF`, `ORD`, `TOS`}, - `Mac`: []string{`MAC`}, - `Mobile Gaming Console`: []string{`PSP`, `NDS`, `XBX`}, - `Real-time OS`: []string{`MTK`, `TDX`}, - `Other Mobile`: []string{`WOS`, `POS`, `SBA`, `TIZ`, `SMG`, `MAE`}, - `Symbian`: []string{`SYM`, `SYS`, `SY3`, `S60`, `S40`}, - `Unix`: []string{`SOS`, `AIX`, `HPX`, `BSD`, `NBS`, `OBS`, `DFB`, `SYL`, `IRI`, `T64`, `INF`}, - `WebTV`: []string{`WTV`}, - `Windows`: []string{`WIN`}, - `Windows Mobile`: []string{`WPH`, `WMO`, `WCE`, `WRT`, `WIO`}, + `Android`: { + `AND`, `CYN`, `FIR`, `REM`, `RZD`, `MLD`, `MCD`, `YNS`, `GRI`, `HAR`, + `ADR`, `CLR`, `BOS`, `REV`, `LEN`, `SIR`, `RRS`, `WER`, `PIC`, `ARM`, + `HEL`, `BYI`, `RIS`, `PUF`, `LEA`, `MET`, `OHS`, + }, + `AmigaOS`: {`AMG`, `MOR`, `ARO`}, + `BlackBerry`: {`BLB`, `QNX`}, + `Brew`: {`BMP`}, + `BeOS`: {`BEO`, `HAI`}, + `Chrome OS`: {`COS`, `CRS`, `FYD`, `SEE`}, + `Firefox OS`: {`FOS`, `KOS`}, + `Gaming Console`: {`WII`, `PS3`}, + `Google TV`: {`GTV`}, + `IBM`: {`OS2`}, + `iOS`: {`IOS`, `ATV`, `WAS`, `IPA`}, + `RISC OS`: {`ROS`}, + `GNU/Linux`: { + `LIN`, `ARL`, `DEB`, `KNO`, `MIN`, `UBT`, `KBT`, `XBT`, `LBT`, `FED`, + `RHT`, `VLN`, `MDR`, `GNT`, `SAB`, `SLW`, `SSE`, `CES`, `BTR`, `SAF`, + `ORD`, `TOS`, `RSO`, `DEE`, `FRE`, `MAG`, `FEN`, `CAI`, `PCL`, `HAS`, + `LOS`, `DVK`, `ROK`, `OWR`, `OTV`, `KTV`, `PUR`, `PLA`, `FUC`, `PAR`, + `FOR`, `MON`, `KAN`, `ZEN`, `LND`, `LNS`, `CHN`, `AMZ`, `TEN`, `CST`, + `NOV`, `ROU`, `ZOR`, `RED`, `KAL`, `ORA`, `VID`, `TIV`, `BSN`, `RAS`, + `UOS`, `PIO`, `FRI`, `LIR`, `WEB`, `SER`, `ASP`, `AOS`, `LOO`, `EUL`, + `SCI`, `ALP`, `CLO`, `ROC`, `OVZ`, `PVE`, `RST`, `EZX`, `GNS`, `JOL`, + `TUR`, `QTP`, `WPO`, `PAN`, `VIZ`, `AZU`, `COL`, + }, + `Mac`: {`MAC`}, + `Mobile Gaming Console`: {`PSP`, `NDS`, `XBX`}, + `OpenVMS`: {`OVS`}, + `Real-time OS`: {`MTK`, `TDX`, `MRE`, `JME`, `REX`, `RXT`, `KOL`}, + `Other Mobile`: {`WOS`, `POS`, `SBA`, `TIZ`, `SMG`, `MAE`, `LUN`, `GEO`}, + `Symbian`: {`SYM`, `SYS`, `SY3`, `S60`, `S40`}, + `Unix`: { + `SOS`, `AIX`, `HPX`, `BSD`, `NBS`, `OBS`, `DFB`, `SYL`, `IRI`, `T64`, + `INF`, `ELE`, `GNX`, `ULT`, `NWS`, `NXT`, `SBL`, + }, + `WebTV`: {`WTV`}, + `Windows`: {`WIN`}, + `Windows Mobile`: {`WPH`, `WMO`, `WCE`, `WRT`, `WIO`, `KIN`}, + `Other Smart TV`: {`WHS`}, } const ( @@ -164,9 +288,9 @@ func NewOss(file string) (*Oss, error) { return nil, err } ps := []*PlatformReg{ - &PlatformReg{Name: PlatformTypeARM, Regular: Regular{Regex: "arm"}}, - &PlatformReg{Name: PlatformTypeX64, Regular: Regular{Regex: "WOW64|x64|win64|amd64|x86_64"}}, - &PlatformReg{Name: PlatformTypeX86, Regular: Regular{Regex: "i[0-9]86|i86pc"}}, + {Name: PlatformTypeARM, Regular: Regular{Regex: "arm"}}, + {Name: PlatformTypeX64, Regular: Regular{Regex: "WOW64|x64|win64|amd64|x86_64"}}, + {Name: PlatformTypeX86, Regular: Regular{Regex: "i[0-9]86|i86pc"}}, } for _, pp := range ps { pp.Compile() diff --git a/parser/os_test.go b/parser/os_test.go index fd0d466..08f1e89 100644 --- a/parser/os_test.go +++ b/parser/os_test.go @@ -1,7 +1,7 @@ package parser import ( - "path/filepath" + "path" "testing" "gotest.tools/assert" @@ -13,7 +13,7 @@ func TestOsParse(t *testing.T) { UserAgent string `yaml:"user_agent" json:"user_agent"` } - var osParser, _ = NewOss(filepath.Join(dir, FixtureFileOs)) + var osParser, _ = NewOss(path.Join(dir, FixtureFileOs)) var list []OsFixture err := ReadYamlFile(`fixtures/oss.yml`, &list) diff --git a/parser/parser_abstract.go b/parser/parser_abstract.go index 776327c..a040f9c 100644 --- a/parser/parser_abstract.go +++ b/parser/parser_abstract.go @@ -2,14 +2,17 @@ package parser import ( "errors" - "gopkg.in/yaml.v2" - "io/ioutil" + "os" "strconv" "strings" + "gopkg.in/yaml.v2" + regexp "github.com/dlclark/regexp2" ) +var ReadFile = os.ReadFile + const Unknown = "Unknown" const UnknownShort = "UNK" @@ -57,12 +60,13 @@ func ArrayContainsString(list []string, v string) bool { return false } -func ReadYamlFile(file string, v interface{}) error { - data, err := ioutil.ReadFile(file) +func ReadYamlFile(file string, ptr any) error { + data, err := ReadFile(file) if err != nil { return errors.New("not exists:" + file) } - return yaml.Unmarshal(data, v) + + return yaml.Unmarshal(data, ptr) } type MatchResult interface { @@ -142,9 +146,10 @@ func BuildVersion(versionString string, matches []string) string { return ver } -var( +var ( tdReg = regexp.MustCompile(` TD$`, regexp.IgnoreCase) ) + func BuildModel(m string, matches []string) string { model := BuildByMatch(m, matches) model = strings.ReplaceAll(model, "_", " ") @@ -199,4 +204,4 @@ func StringContainsLetter(ua string) bool { } } return false -} \ No newline at end of file +} diff --git a/parser/parser_test.go b/parser/parser_test.go index 9127060..2143934 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -3,13 +3,14 @@ package parser import ( "encoding/json" "fmt" - "path/filepath" + "path" "testing" ) const dir = "../regexes" + func TestVendors(t *testing.T) { - if v, err := NewVendor(filepath.Join(dir, FixtureFileVendor)); err != nil { + if v, err := NewVendor(path.Join(dir, FixtureFileVendor)); err != nil { t.Fatal(err) } else if v == nil { t.Fatal("value is null") diff --git a/parser/vendor_fragment.go b/parser/vendor_fragment.go index 1585b45..71e60f9 100644 --- a/parser/vendor_fragment.go +++ b/parser/vendor_fragment.go @@ -10,8 +10,7 @@ type VendorFragments struct { func NewVendor(file string) (*VendorFragments, error) { var m map[string][]string - err := ReadYamlFile(file, &m) - if err != nil { + if err := ReadYamlFile(file, &m); err != nil { return nil, err } diff --git a/parser/vendor_fragment_test.go b/parser/vendor_fragment_test.go index aab0daf..2ade4e1 100644 --- a/parser/vendor_fragment_test.go +++ b/parser/vendor_fragment_test.go @@ -1,7 +1,7 @@ package parser import ( - "path/filepath" + "path" "testing" "gotest.tools/assert" @@ -12,7 +12,7 @@ func TestVendorParse(t *testing.T) { Vendor string `yaml:"vendor"` UserAgent string `yaml:"useragent"` } - var vendorParser, _ = NewVendor(filepath.Join(dir, FixtureFileVendor)) + var vendorParser, _ = NewVendor(path.Join(dir, FixtureFileVendor)) var list []VendorFixture err := ReadYamlFile(`fixtures/vendorfragments.yml`, &list) if err != nil { diff --git a/regexes/bots.yml b/regexes/bots.yml index f31e42b..c89e86f 100644 --- a/regexes/bots.yml +++ b/regexes/bots.yml @@ -5,10 +5,31 @@ # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later ############### -- regex: '360Spider(-Image|-Video)?' +- regex: 'WireReaderBot' + name: 'WireReaderBot' + category: 'Feed Fetcher' + url: 'https://wirereader.app/' + +- regex: 'monitoring360bot' + name: '360 Monitoring' + category: 'Site Monitor' + url: 'https://www.360monitoring.io' + producer: + name: 'Plesk International GmbH' + url: 'https://www.plesk.com' + +- regex: 'Cloudflare-Healthchecks' + name: 'Cloudflare Health Checks' + category: 'Service Agent' + url: 'https://developers.cloudflare.com/health-checks/' + producer: + name: 'CloudFlare' + url: 'https://www.cloudflare.com/' + +- regex: '360Spider' name: '360Spider' category: 'Search bot' - url: 'http://www.so.com/help/help_3_2.html' + url: 'https://www.so.com/help/help_3_2.html' producer: name: 'Online Media Group, Inc.' url: '' @@ -40,26 +61,50 @@ - regex: 'AhrefsBot' name: 'aHrefs Bot' category: 'Crawler' - url: 'http://ahrefs.com/robot' + url: 'https://ahrefs.com/robot' + producer: + name: 'Ahrefs Pte Ltd' + url: 'https://ahrefs.com/robot' + +- regex: 'AhrefsSiteAudit' + name: 'AhrefsSiteAudit' + category: 'Site Monitor' + url: 'https://ahrefs.com/robot/site-audit' producer: name: 'Ahrefs Pte Ltd' - url: 'http://ahrefs.com/robot' + url: 'https://ahrefs.com/' - regex: 'ia_archiver|alexabot|verifybot' name: 'Alexa Crawler' category: 'Search bot' - url: 'https://alexa.zendesk.com/hc/en-us/sections/200100794-Crawlers' + url: 'https://support.alexa.com/hc/en-us/sections/200100794-Crawlers' producer: name: 'Alexa Internet' - url: 'http://www.alexa.com' + url: 'https://www.alexa.com' - regex: 'alexa site audit' name: 'Alexa Site Audit' category: 'Site Monitor' - url: 'http://www.alexa.com/help/webmasters' + url: 'https://support.alexa.com/hc/en-us/articles/200450194' producer: name: 'Alexa Internet' - url: 'http://www.alexa.com' + url: 'https://www.alexa.com' + +- regex: 'Amazonbot' + name: 'Amazon Bot' + category: 'Crawler' + url: 'https://developer.amazon.com/support/amazonbot' + producer: + name: 'Amazon.com, Inc.' + url: 'https://www.amazon.com/' + +- regex: 'AmazonAdBot' + name: 'Amazon AdBot' + category: 'Crawler' + url: 'https://adbot.amazon.com/' + producer: + name: 'Amazon.com, Inc.' + url: 'https://www.amazon.com/' - regex: 'Amazon[ -]Route ?53[ -]Health[ -]Check[ -]Service' name: 'Amazon Route53 Health Check' @@ -82,23 +127,39 @@ url: 'https://httpd.apache.org/docs/2.4/programs/ab.html' producer: name: 'The Apache Software Foundation' - url: 'http://www.apache.org/foundation/' + url: 'https://www.apache.org/foundation/' - regex: 'Applebot' name: 'Applebot' category: 'Crawler' - url: 'http://www.apple.com/go/applebot' + url: 'https://support.apple.com/en-us/119829' + producer: + name: 'Apple Inc' + url: 'https://www.apple.com/' + +- regex: 'iTMS' + name: 'iTMS' + category: 'Crawler' + url: 'https://support.apple.com/en-us/119829' producer: name: 'Apple Inc' - url: 'http://www.apple.com' + url: 'https://www.apple.com/' + +- regex: 'AppSignalBot' + name: 'AppSignalBot' + category: 'Site Monitor' + url: 'https://docs.appsignal.com/uptime-monitoring/' + producer: + name: 'AppSignal' + url: 'https://appsignal.com/' - regex: 'Arachni' name: 'Arachni' category: 'Security Checker' - url: 'http://www.arachni-scanner.com' + url: 'https://www.arachni-scanner.com/' producer: name: 'Sarosys LLC' - url: 'http://www.sarosys.com/' + url: 'https://www.sarosys.com/' - regex: 'AspiegelBot' name: 'AspiegelBot' @@ -112,7 +173,7 @@ name: 'Castro 2' category: 'Service Agent' url: 'http://supertop.co/castro/' - producer: + producer: name: 'Supertop' url: 'http://supertop.co' @@ -127,10 +188,10 @@ - regex: 'archive\.org_bot|special_archiver' name: 'archive.org bot' category: 'Crawler' - url: 'http://www.archive.org/details/archive.org_bot' + url: 'https://archive.org/details/archive.org_bot' producer: name: 'The Internet Archive' - url: 'http://www.archive.org' + url: 'https://archive.org' - regex: 'Ask Jeeves/Teoma' name: 'Ask Jeeves' @@ -156,7 +217,7 @@ name: '2.0Promotion GbR' url: 'http://www.backlinktest.com' -- regex: 'baiduspider(-image)?|baidu Transcoder|baidu.*spider' +- regex: 'Baidu.*spider|baidu Transcoder' name: 'Baidu Spider' category: 'Search bot' url: 'http://www.baidu.com/search/spider.htm' @@ -172,7 +233,15 @@ name: '' url: '' -- regex: 'MSNBot|msrbot|bingbot|BingPreview|msnbot-(UDiscovery|NewsBlogs)|adidxbot' +- regex: 'Better Uptime Bot' + name: 'Better Uptime Bot' + category: 'Site Monitor' + url: 'https://betteruptime.com/faq' + producer: + name: 'Better Uptime' + url: 'https://betteruptime.com/' + +- regex: 'MSNBot|msrbot|bingbot|bingadsbot|BingPreview|msnbot-(UDiscovery|NewsBlogs)|adidxbot' name: 'BingBot' category: 'Search bot' url: 'http://search.msn.com/msnbot.htmn' @@ -180,6 +249,14 @@ name: 'Microsoft Corporation' url: 'http://www.microsoft.com' +- regex: 'Blackbox Exporter' + name: 'Blackbox Exporter' + category: 'Site Monitor' + url: 'https://github.com/prometheus/blackbox_exporter' + producer: + name: 'Prometheus' + url: 'https://prometheus.io/' + - regex: 'Blekkobot' name: 'Blekkobot' category: 'Search bot' @@ -188,7 +265,7 @@ name: 'Blekko' url: 'http://blekko.com' -- regex: 'BLEXBot(Test)?' +- regex: 'BLEXBot' name: 'BLEXBot Crawler' category: 'Crawler' url: 'http://webmeup-crawler.com' @@ -217,7 +294,7 @@ category: 'Crawler' producer: name: 'BoardReader' - url: 'http://boardreader.com/' + url: 'https://boardreader.com/' - regex: 'BountiiBot' name: 'Bountii Bot' @@ -283,15 +360,71 @@ name: 'CloudFlare' url: 'http://www.cloudflare.com' +- regex: 'Cloudflare-?Diagnostics' + name: 'Cloudflare Diagnostics' + category: 'Site Monitor' + url: 'https://www.cloudflare.com/' + producer: + name: 'Cloudflare' + url: 'https://www.cloudflare.com/' + - regex: 'CloudFlare-AlwaysOnline' name: 'CloudFlare Always Online' category: 'Site Monitor' - url: 'http://www.cloudflare.com/always-online' + url: 'https://www.cloudflare.com/always-online' producer: name: 'CloudFlare' - url: 'http://www.cloudflare.com' + url: 'https://www.cloudflare.com/' + +- regex: 'Cloudflare-SSLDetector' + name: 'Cloudflare SSL Detector' + category: 'Site Monitor' + url: 'https://developers.cloudflare.com/fundamentals/reference/cloudflare-site-crawling/' + producer: + name: 'CloudFlare' + url: 'https://www.cloudflare.com/' + +- regex: 'Cloudflare Custom Hostname Verification' + name: 'Cloudflare Custom Hostname Verification' + category: 'Service Agent' + url: 'https://developers.cloudflare.com/fundamentals/reference/cloudflare-site-crawling/' + producer: + name: 'CloudFlare' + url: 'https://www.cloudflare.com/' + +- regex: 'Cloudflare-Traffic-Manager' + name: 'Cloudflare Traffic Manager' + category: 'Site Monitor' + url: 'https://developers.cloudflare.com/fundamentals/reference/cloudflare-site-crawling/' + producer: + name: 'CloudFlare' + url: 'https://www.cloudflare.com/' + +- regex: 'Cloudflare-Smart-Transit' + name: 'Cloudflare Smart Transit' + category: 'Site Monitor' + url: 'https://developers.cloudflare.com/fundamentals/reference/cloudflare-site-crawling/' + producer: + name: 'CloudFlare' + url: 'https://www.cloudflare.com/' + +- regex: 'CloudflareObservatory' + name: 'Cloudflare Observatory' + category: 'Site Monitor' + url: 'https://developers.cloudflare.com/speed/speed-test/run-speed-test' + producer: + name: 'CloudFlare' + url: 'https://www.cloudflare.com/' + +- regex: 'https://developers\.cloudflare\.com/security-center/' + name: 'Cloudflare Security Insights' + category: 'Site Monitor' + url: 'https://developers.cloudflare.com/fundamentals/reference/cloudflare-site-crawling/' + producer: + name: 'CloudFlare' + url: 'https://www.cloudflare.com/' -- regex: 'coccoc|coccocbot(-ads|-fast|-image|-shopping|-web)?' +- regex: 'coccoc\.com' name: 'Cốc Cốc Bot' url: 'https://help.coccoc.com/en/search-engine/coccoc-robots' category: 'Search bot' @@ -323,7 +456,7 @@ name: 'Certified Security Solutions' url: 'https://www.css-security.com/company/about-us/' -- regex: 'Datadog Agent' +- regex: 'Datadog Agent|Datadog/?Synthetics' name: 'Datadog Agent' url: 'https://github.com/DataDog/dd-agent' category: 'Site Monitor' @@ -339,7 +472,6 @@ name: 'Datanyze' url: 'https://www.datanyze.com' - - regex: 'Dataprovider' name: 'Dataprovider' category: 'Crawler' @@ -348,7 +480,7 @@ name: 'Dataprovider B.V.' url: 'https://www.dataprovider.com/' -- regex: 'Daum(oa)?[ /][0-9]' +- regex: 'Daum(?!(?:Apps|Device))' name: 'Daum' category: 'Search bot' url: 'http://tab.search.daum.net/aboutWebSearch_en.html' @@ -364,7 +496,7 @@ name: 'DAZOO.FR' url: 'http://dazoo.fr' -- regex: 'discobot(-news)?' +- regex: 'discobot' name: 'Discobot' category: 'Search bot' url: 'http://discoveryengine.com/discobot.html' @@ -372,7 +504,7 @@ name: 'Discovery Engine' url: 'http://discoveryengine.com' -- regex: 'Domain Re-Animator Bot|support@domainreanimator.com' +- regex: 'Domain Re-Animator Bot|support@domainreanimator\.com' name: 'Domain Re-Animator Bot' category: 'Crawler' url: '' @@ -389,9 +521,17 @@ url: 'http://moz.com/' - regex: 'DuckDuck(?:Go-Favicons-)?Bot' - name: 'DuckDuckGo Bot' + name: 'DuckDuckBot' + category: 'Search bot' + url: 'https://duckduckgo.com/duckduckgo-help-pages/results/duckduckbot/' + producer: + name: 'DuckDuckGo' + url: 'https://duckduckgo.com/' + +- regex: 'DuckAssistBot' + name: 'DuckAssistBot' category: 'Search bot' - url: 'https://duckduckgo.com/duckduckbot' + url: 'https://duckduckgo.com/duckduckgo-help-pages/results/duckassistbot/' producer: name: 'DuckDuckGo' url: 'https://duckduckgo.com/' @@ -427,7 +567,7 @@ name: 'eVenture Capital Partners II, LLC' url: 'http://www.eventures.vc/' -- regex: 'Exabot(-Thumbnails|-Images)?|ExaleadCloudview' +- regex: 'Exabot|ExaleadCloudview' name: 'ExaBot' category: 'Crawler' url: 'http://www.exabot.com/go/robot' @@ -451,13 +591,37 @@ name: 'SEOmoz, Inc.' url: 'http://moz.com/' -- regex: 'facebookexternalhit|facebookplatform|facebookexternalua' - name: 'Facebook External Hit' +- regex: 'facebook(?:catalog|externalhit|externalua|platform|scraper)' + name: 'Facebook Crawler' + category: 'Social Media Agent' + url: 'https://developers.facebook.com/docs/sharing/webmasters/web-crawlers' + producer: + name: 'Meta Platforms, Inc.' + url: 'https://www.meta.com/' + +- regex: 'meta-externalagent' + name: 'Meta-ExternalAgent' + category: 'Crawler' + url: 'https://developers.facebook.com/docs/sharing/webmasters/web-crawlers' + producer: + name: 'Meta Platforms, Inc.' + url: 'https://www.meta.com/' + +- regex: 'meta-externalfetcher' + name: 'Meta-ExternalFetcher' category: 'Social Media Agent' - url: 'https://www.facebook.com/externalhit_uatext.php' + url: 'https://developers.facebook.com/docs/sharing/webmasters/web-crawlers' + producer: + name: 'Meta Platforms, Inc.' + url: 'https://www.meta.com/' + +- regex: 'FacebookBot' + name: 'FacebookBot' + category: 'Crawler' + url: 'https://developers.facebook.com/docs/sharing/bot' producer: - name: 'Facebook' - url: 'http://www.facebook.com' + name: 'Meta Platforms, Inc.' + url: 'https://www.meta.com/' - regex: 'Feedbin' name: 'Feedbin' @@ -483,7 +647,7 @@ name: 'David Smith & Developing Perspective, LLC' url: 'https://david-smith.org' -- regex: '(Meta)?Feedly(Bot|App)?' +- regex: 'Feedly' name: 'Feedly' url: 'http://www.feedly.com' category: 'Feed Fetcher' @@ -499,7 +663,7 @@ name: '' url: '' -- regex: 'Fever/[0-9]' +- regex: 'Fever/' name: 'Fever' url: 'http://feedafever.com/' category: 'Feed Fetcher' @@ -549,6 +713,10 @@ name: '' url: '' +- regex: 'gobuster' + name: 'Gobuster' + url: 'https://github.com/OJ/gobuster' + - regex: 'ichiro/mobile goo' name: 'Goo' category: 'Search bot' @@ -557,6 +725,10 @@ name: 'NTT Resonant' url: 'http://goo.ne.jp' +- regex: 'Storebot-Google' + name: 'Google StoreBot' + category: 'Crawler' + - regex: 'Google Favicon' name: 'Google Favicon' category: 'Crawler' @@ -567,7 +739,7 @@ url: 'https://search.google.com/search-console/about' producer: name: 'Google Inc.' - url: 'http://www.google.com' + url: 'https://www.google.com/' - regex: 'Google Page Speed Insights' name: 'Google PageSpeed Insights' @@ -575,7 +747,7 @@ url: 'http://developers.google.com/speed/pagespeed/insights/' producer: name: 'Google Inc.' - url: 'http://www.google.com' + url: 'https://www.google.com/' - regex: 'google_partner_monitoring' name: 'Google Partner Monitoring' @@ -583,7 +755,7 @@ url: '' producer: name: 'Google Inc.' - url: 'http://www.google.com' + url: 'https://www.google.com/' - regex: 'Google-Cloud-Scheduler' name: 'Google Cloud Scheduler' @@ -599,7 +771,7 @@ url: 'https://search.google.com/structured-data/testing-tool' producer: name: 'Google Inc.' - url: 'http://www.google.com' + url: 'https://www.google.com/' - regex: 'GoogleStackdriverMonitoring' name: 'Google Stackdriver Monitoring' @@ -609,13 +781,61 @@ name: 'Google Inc.' url: 'https://www.google.com' +- regex: 'Google-Transparency-Report' + name: 'Google Transparency Report' + category: 'Site Monitor' + url: 'https://transparencyreport.google.com/' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' + +- regex: 'Google-CloudVertexBot' + name: 'Google-CloudVertexBot' + category: 'Crawler' + url: 'https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers#google-cloudvertexbot' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' + - regex: 'via ggpht\.com GoogleImageProxy' name: 'Gmail Image Proxy' category: 'Crawler' url: '' producer: name: 'Google Inc.' - url: 'http://www.google.com' + url: 'https://www.google.com/' + +- regex: 'Google-Document-Conversion' + name: 'Google-Document-Conversion' + category: 'Service Agent' + url: 'https://support.google.com/drive/answer/176692?hl=en' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' + +- regex: 'GoogleDocs; apps-spreadsheets' + name: 'Google Sheets' + category: 'Service Agent' + url: 'https://workspace.google.com/products/sheets/' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' + +- regex: 'GoogleDocs; apps-presentations' + name: 'Google Slides' + category: 'Service Agent' + url: 'https://workspace.google.com/products/slides/' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' + +- regex: 'GoogleDocs;' + name: 'Google Docs' + category: 'Service Agent' + url: 'https://docs.google.com/' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' - regex: 'SeznamEmailProxy' name: 'Seznam Email Proxy' @@ -649,21 +869,61 @@ name: 'Visual Meta' url: 'https://www.shopalike.cz/' -- regex: 'AdsBot-Google(-Mobile)?|Adwords-(DisplayAds|Express|Instant)|Google Web Preview|Google[ -]Publisher[ -]Plugin|Google-(Adwords|AMPHTML|Assess|HotelAdsVerifier|Read-Aloud|Shopping-Quality|Site-Verification|speakr|Test|Youtube-Links)|(APIs|DuplexWeb|Feedfetcher|Mediapartners)-Google|Googlebot(-Mobile|-Image|-Video|-News)?|GoogleProducer|Google.*/\+/web/snippet' +- regex: 'deepcrawl\.com' + name: 'Lumar' + category: 'Crawler' + url: 'https://deepcrawl.com/bot' + producer: + name: 'Lumar' + url: 'https://www.lumar.io/' + +- regex: 'Googlebot-News' + name: 'Googlebot News' + category: 'Search bot' + url: 'https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' + +- regex: 'Adwords-(?:DisplayAds|Express|Instant)|Google Web Preview|Google[ -]Publisher[ -]Plugin|Google-(?:adstxt|Ads-Conversions|Ads-Qualify|Adwords|AMPHTML|Assess|Extended|HotelAdsVerifier|InspectionTool|Lens|PageRenderer|Read-Aloud|Shopping-Quality|Site-Verification|Sites-Thumbnails|speakr|Stale-Content-Probe|Test|Youtube-Links)|(?:AdsBot|APIs|Feedfetcher|Mediapartners)-Google(?:-Mobile)?|Google(?:AdSenseInfeed|AssociationService|bot|Other|Prober|Producer|Sites)|Google.*/\+/web/snippet' name: 'Googlebot' category: 'Search bot' - url: 'http://www.google.com/bot.html' + url: 'https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers' producer: name: 'Google Inc.' - url: 'http://www.google.com' + url: 'https://www.google.com/' -- regex: 'heritrix' - name: 'Heritrix' +- regex: '^Google$' + name: 'Googlebot' + category: 'Search bot' + url: 'https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' + +- regex: 'Google-Safety' + name: 'Google-Safety' category: 'Crawler' - url: 'https://webarchive.jira.com/wiki/display/Heritrix/Heritrix' + url: 'https://developers.google.com/search/docs/crawling-indexing/google-special-case-crawlers' producer: - name: 'The Internet Archive' - url: 'http://www.archive.org' + name: 'Google Inc.' + url: 'https://www.google.com/' + +- regex: 'DuplexWeb-Google' + name: 'DuplexWeb-Google' + category: 'Crawler' + url: 'https://developers.google.com/search/docs/crawling-indexing/google-special-case-crawlers' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' + +- regex: 'Google-Area120-PrivacyPolicyFetcher' + name: 'Google Area 120 Privacy Policy Fetcher' + category: 'Crawler' + url: 'https://area120.google.com/' + producer: + name: 'Google Inc.' + url: 'https://www.google.com/' - regex: 'HubSpot ' name: 'HubSpot' @@ -672,6 +932,10 @@ name: 'HubSpot Inc.' url: 'https://www.hubspot.com' +- regex: 'vuhuv(?:Bot|RBT)' + name: 'vuhuvBot' + category: 'Search bot' + url: 'https://vuhuv.com/bot.html' - regex: 'HTTPMon' name: 'HTTPMon' @@ -689,7 +953,7 @@ name: '' url: '' -- regex: 'inoreader.com' +- regex: 'inoreader\.com' name: 'inoreader' category: 'Feed Reader' url: 'https://www.inoreader.com' @@ -704,7 +968,7 @@ - regex: 'ips-agent' name: 'IPS Agent' - category: 'crawler' + category: 'Crawler' producer: name: 'VeriSign, Inc' url: 'http://www.verisign.com/' @@ -717,6 +981,10 @@ name: '' url: 'https://ip-guide.com' +- regex: 'k6/' + name: 'K6' + url: 'https://k6.io/' + - regex: 'kouio' name: 'Kouio' url: 'http://kouio.com/' @@ -733,7 +1001,7 @@ name: '' url: '' -- regex: '([A-z0-9]*)-Lighthouse' +- regex: '[A-z0-9]*-Lighthouse' name: 'Lighthouse' category: 'Site Monitor' url: 'https://developers.google.com/web/tools/lighthouse' @@ -741,7 +1009,15 @@ name: 'Lighthouse' url: 'https://developers.google.com/web/tools/lighthouse' -- regex: 'linkdexbot(-mobile)?|linkdex\.com' +- regex: 'last-modified\.com' + name: 'LastMod Bot' + category: 'Site Monitor' + url: 'https://last-modified.com/en/about' + producer: + name: '' + url: 'https://last-modified.com/en' + +- regex: 'linkdexbot|linkdex\.com' name: 'Linkdex Bot' category: 'Search bot' url: 'http://www.linkdex.com/bots' @@ -759,12 +1035,13 @@ - regex: 'ltx71' name: 'LTX71' - url: 'http://ltx71.com/' + category: 'Security Checker' + url: 'https://ltx71.com/' producer: name: '' url: '' -- regex: 'Mail\.RU(_Bot)?' +- regex: 'Mail\.RU' name: 'Mail.Ru Bot' category: 'Search bot' url: 'http://help.mail.ru/webmaster/indexing/robots/types_robots' @@ -788,7 +1065,15 @@ name: '' url: '' -- regex : 'masscan' +- regex: 'masscan-ng' + name: 'masscan-ng' + url: 'https://github.com/bi-zone/masscan-ng' + category: 'Crawler' + producer: + name: 'BIZON, OOO' + url: 'https://bi.zone/' + +- regex: '.*masscan' name: 'masscan' url: 'https://github.com/robertdavidgraham/masscan' category: 'Crawler' @@ -876,11 +1161,11 @@ name: 'Nagios Plugins Development Team' url: 'https://nagios.org' -- regex: 'nbertaupete95\(at\)gmail.com' +- regex: 'nbertaupete95\(at\)gmail\.com' name: 'nbertaupete95' category: 'Crawler' -- regex: 'Netcraft( Web Server Survey| SSL Server Survey|SurveyAgent)' +- regex: 'Netcraft(?: Web Server Survey| SSL Server Survey|SurveyAgent)' name: 'Netcraft Survey Bot' category: 'Search bot' url: '' @@ -904,7 +1189,7 @@ name: '' url: '' -- regex: 'NewsBlur .*(Fetcher|Finder)' +- regex: 'NewsBlur .*(?:Fetcher|Finder)' name: 'NewsBlur' url: 'http://www.newsblur.com' category: 'Feed Fetcher' @@ -941,12 +1226,28 @@ category: 'Crawler' producer: name: 'Nuzzel' - url: https://www.nuzzel.com/ + url: 'https://www.nuzzel.com/' + +- regex: 'NodePing' + name: 'NodePing' + category: 'Site Monitor' + url: 'https://nodeping.com' + producer: + name: 'NodePing' + url: 'https://nodeping.com' -- regex: 'Octopus [0-9]' +- regex: 'Octopus [\d.]+' name: 'Octopus' -- regex: 'omgili(?:bot)?' +- regex: 'OnlineOrNot\.com_bot' + name: 'OnlineOrNot Bot' + category: 'Site Monitor' + url: 'https://onlineornot.com/website-monitoring' + producer: + name: 'OnlineOrNot' + url: 'https://onlineornot.com' + +- regex: 'omgili' name: 'Omgili bot' category: 'Search bot' url: 'http://www.omgili.com/Crawler.html' @@ -1007,12 +1308,12 @@ name: 'PHP Server Monitor' url: 'http://www.phpservermonitor.org/' -- regex: 'PocketParser' - name: 'PocketParser' +- regex: 'Pocket(?:ImageCache|Parser)' + name: 'Pocket' category: 'Read-it-later Service' url: 'https://getpocket.com/pocketparser_ua' producer: - name: 'Pocket' + name: 'Read It Later, Inc.' url: 'https://getpocket.com/' - regex: 'PritTorrent' @@ -1023,7 +1324,15 @@ name: 'Bitlove' url: 'http://bitlove.org/' -- regex: 'psbot(-page)?' +- regex: 'PRTG Network Monitor' + name: 'PRTG Network Monitor' + category: 'Network Monitor' + url: 'https://www.paessler.com/prtg' + producer: + name: 'Paessler AG' + url: 'https://www.paessler.com' + +- regex: 'psbot' name: 'Picsearch bot' category: 'Search bot' url: 'http://www.picsearch.com/bot.html' @@ -1031,7 +1340,7 @@ name: 'Picsearch' url: 'http://www.picsearch.com' -- regex: 'Pingdom\.com' +- regex: 'Pingdom(?:\.com|TMS)' name: 'Pingdom Bot' category: 'Site Monitor' url: '' @@ -1047,6 +1356,14 @@ name: 'Quora' url: 'http://www.quora.com' +- regex: 'Quora-Bot' + name: 'Quora Bot' + category: 'Crawler' + url: '' + producer: + name: 'Quora' + url: 'https://www.quora.com/' + - regex: 'RamblerMail' name: 'RamblerMail Image Proxy' category: 'Crawler' @@ -1063,10 +1380,10 @@ name: 'QueryEye Inc.' url: 'http://queryeye.com' -- regex: 'Qwantify' - name: 'Qwantify' +- regex: 'Qwantify|Qwantbot' + name: 'Qwantbot' category: 'Crawler' - url: 'https://www.qwant.com/' + url: 'https://help.qwant.com/bot/' producer: name: 'Qwant Corporation' url: 'https://www.qwant.com/' @@ -1138,12 +1455,44 @@ url: '' - regex: 'SemrushBot' - name: 'Semrush Bot' + name: 'SemrushBot' + category: 'Crawler' + url: 'https://www.semrush.com/bot/' + producer: + name: 'Semrush Inc.' + url: 'https://www.semrush.com/' + +- regex: 'BacklinksExtendedBot' + name: 'BacklinksExtendedBot' + category: 'Crawler' + url: 'https://www.semrush.com/bot/' + producer: + name: 'Semrush Inc.' + url: 'https://www.semrush.com/' + +- regex: 'SerpReputationManagementAgent' + name: 'Semrush Reputation Management' + category: 'Service Agent' + url: 'https://www.semrush.com/bot/' + producer: + name: 'Semrush Inc.' + url: 'https://www.semrush.com/' + +- regex: 'SplitSignalBot' + name: 'SplitSignalBot' + category: 'Crawler' + url: 'https://www.semrush.com/bot/' + producer: + name: 'Semrush Inc.' + url: 'https://www.semrush.com/' + +- regex: 'SiteAuditBot' + name: 'SiteAuditBot' category: 'Crawler' - url: 'http://www.semrush.com/bot.html' + url: 'https://www.semrush.com/bot/' producer: - name: 'SEMrush' - url: 'http://www.semrush.com' + name: 'Semrush Inc.' + url: 'https://www.semrush.com/' - regex: 'SensikaBot' name: 'Sensika Bot' @@ -1153,7 +1502,7 @@ name: 'Sensika' url: 'http://sensika.com' -- regex: 'SEOENG(World)?Bot' +- regex: 'SEOENG(?:World)?Bot' name: 'SEOENGBot' category: 'Crawler' url: 'http://www.seoengine.com/seoengbot.htm' @@ -1161,14 +1510,6 @@ name: 'SEO Engine' url: 'http://www.seoengine.com' -- regex: 'SEOkicks-Robot' - name: 'SEOkicks-Robot' - category: 'Crawler' - url: 'http://www.seokicks.de/robot.html' - producer: - name: 'SEOkicks' - url: 'https://www.seokicks.de/' - - regex: 'seoscanners\.net' name: 'Seoscanners.net' category: 'Crawler' @@ -1230,7 +1571,7 @@ name: 'SISTRIX GmbH' url: 'http://www.sistrix.de' -- regex: 'SISTRIX Optimizer' +- regex: 'compatible; (?:SISTRIX )?Optimizer' name: 'SISTRIX Optimizer' category: 'Crawler' url: 'https://optimizer.sistrix.com' @@ -1243,7 +1584,7 @@ category: 'Crawler' url: 'http://ricks-apps.com/osx/sitesucker/' -- regex: 'sixy.ch' +- regex: 'sixy\.ch' name: 'Sixy.ch' category: 'Site Monitor' url: 'http://sixy.ch' @@ -1259,7 +1600,7 @@ name: 'Slack Technologies' url: 'http://slack.com' -- regex: '(Sogou (web|inst|Pic) spider)|New-Sogou-Spider' +- regex: 'Sogou[ -](?:head|inst|Orion|Pic|Test|web)[ -]spider|New-Sogou-Spider' name: 'Sogou Spider' category: 'Search bot' url: 'http://www.sogou.com/docs/help/webmasters.htm' @@ -1275,13 +1616,13 @@ name: 'Tencent Holdings' url: 'http://www.soso.com' -- regex: 'sqlmap/' - name: 'sqlmap' - category: 'Security Checker' - url: 'http://sqlmap.org/' +- regex: 'Sprinklr' + name: 'Sprinklr' + category: 'Crawler' + url: '' producer: - name: 'sqlmap' - url: 'http://sqlmap.org/' + name: 'Sprinklr, Inc.' + url: 'https://www.sprinklr.com/' - regex: 'SSL Labs' name: 'SSL Labs' @@ -1307,7 +1648,7 @@ name: 'Superfeedr' url: 'https://superfeedr.com/' -- regex: 'Sparkler/[0-9]' +- regex: 'Sparkler' name: 'Sparkler' category: 'Crawler' url: 'https://github.com/USCDataScience/sparkler' @@ -1320,13 +1661,20 @@ name: 'Tailrank Inc' url: 'http://spinn3r.com' -- regex: 'Sputnik(Image)?Bot' +- regex: 'SputnikBot' name: 'Sputnik Bot' - category: '' + category: 'Crawler' + url: '' + +- regex: 'SputnikFaviconBot' + name: 'Sputnik Favicon Bot' + category: 'Crawler' + url: '' + +- regex: 'SputnikImageBot' + name: 'Sputnik Image Bot' + category: 'Crawler' url: '' - producer: - name: '' - url: '' - regex: 'SurveyBot' name: 'Survey Bot' @@ -1369,11 +1717,19 @@ name: '' url: '' -- regex: 'theoldreader.com' +- regex: 'theoldreader\.com' name: 'theoldreader' category: 'Feed Reader' url: 'https://theoldreader.com' +- regex: 'Trackable/0\.1' + name: 'Chartable' + category: 'Site Monitor' + url: 'https://help.chartable.com/article/34-what-is-the-trackable-analytics-prefix' + producer: + name: 'Chartable' + url: 'https://chartable.com' + - regex: 'trendictionbot' name: 'Trendiction Bot' category: 'Crawler' @@ -1390,13 +1746,13 @@ name: 'iParadigms, LLC.' url: 'http://www.turnitin.com' -- regex: 'TweetedTimes Bot' +- regex: 'TweetedTimes' name: 'TweetedTimes Bot' category: 'Crawler' - url: 'http://tweetedtimes.com' + url: 'https://tweetedtimes.com/' producer: name: 'TweetedTimes' - url: 'http://tweetedtimes.com/' + url: 'https://tweetedtimes.com/' - regex: 'TweetmemeBot' name: 'Tweetmeme Bot' @@ -1437,21 +1793,21 @@ name: 'UkrNet Ltd' url: 'https://www.ukr.net/' -- regex: 'Uptimebot' +- regex: 'Uptime(?:bot)?/' name: 'Uptimebot' category: 'Site Monitor' - url: 'https://uptime.com/uptimebot' + url: 'https://uptime.com/uptime-bot' producer: name: 'Uptime' - url: 'https://uptime.com' + url: 'https://uptime.com/' - regex: 'UptimeRobot' - name: 'Uptime Robot' + name: 'UptimeRobot' category: 'Site Monitor' - url: '' + url: 'https://uptimerobot.com/' producer: name: 'Uptime Robot' - url: 'http://uptimerobot.com' + url: 'https://uptimerobot.com/' - regex: 'URLAppendBot' name: 'URLAppendBot' @@ -1472,10 +1828,18 @@ - regex: 'vkShare; ' name: 'VK Share Button' category: 'Crawler' - url: 'http://vk.com/dev/Share' + url: 'https://dev.vk.com/en/widgets/share' + producer: + name: 'VK' + url: 'https://vk.com/' + +- regex: 'VKRobot' + name: 'VK Robot' + category: 'Crawler' + url: 'https://dev.vk.com/en/' producer: name: 'VK' - url: 'http://vk.com/' + url: 'https://vk.com/' - regex: 'VSMCrawler' name: 'Visual Site Mapper Crawler' @@ -1509,7 +1873,7 @@ name: 'W3C' url: 'http://www.w3.org' -- regex: 'W3C_Validator|Validator.nu' +- regex: 'W3C_Validator|Validator\.nu' name: 'W3C Markup Validation Service' category: 'Validator' url: 'http://validator.w3.org/services' @@ -1533,6 +1897,14 @@ name: 'W3C' url: 'http://www.w3.org' +- regex: 'P3P Validator' + name: 'W3C P3P Validator' + category: 'Validator' + url: 'https://www.w3.org/P3P/validator.html' + producer: + name: 'W3C' + url: 'https://www.w3.org' + - regex: 'Wappalyzer' name: 'Wappalyzer' url: 'https://github.com/AliasIO/Wappalyzer' @@ -1545,7 +1917,7 @@ category: 'Site Monitor' url: 'https://www.webpagetest.org' -- regex: 'WeSEE(:Search)?' +- regex: 'WeSEE' name: 'WeSEE:Search' category: 'Search bot' url: 'http://www.wesee.com/bot' @@ -1569,6 +1941,38 @@ name: 'WebSitePulse' url: 'http://www.websitepulse.com/' +- regex: 'WordPress.+isitwp\.com' + name: 'IsItWP' + category: 'Crawler' + url: 'https://www.isitwp.com/' + producer: + name: 'WPBeginner, LLC' + url: 'https://www.wpbeginner.com/' + +- regex: 'Automattic Analytics Crawler' + name: 'Automattic Analytics' + category: 'Crawler' + url: 'https://wordpress.com/crawler/' + producer: + name: 'Wordpress.org' + url: 'https://wordpress.org/' + +- regex: 'WordPress\.com mShots' + name: 'WordPress.com mShots' + category: 'Service Agent' + url: 'https://wordpress.org/' + producer: + name: 'Wordpress.org' + url: 'https://wordpress.org/' + +- regex: 'wp\.com feedbot' + name: 'wp.com feedbot' + category: 'Feed Fetcher' + url: 'https://wordpress.com/' + producer: + name: 'Automattic, Inc.' + url: 'https://automattic.com/' + - regex: 'WordPress' name: 'WordPress' category: 'Service Agent' @@ -1617,6 +2021,14 @@ name: 'Yahoo! Inc.' url: 'http://www.yahoo.com' +- regex: 'YahooMailProxy' + name: 'Yahoo! Mail Proxy' + category: 'Service Agent' + url: 'https://help.yahoo.com/kb/yahoo-mail-proxy-SLN28749.html' + producer: + name: 'Yahoo! Inc.' + url: 'http://www.yahoo.com' + - regex: 'YahooCacheSystem' name: 'Yahoo! Cache System' category: 'Crawler' @@ -1628,20 +2040,44 @@ - regex: 'Y!J-BRW' name: 'Yahoo! Japan BRW' category: 'Crawler' - url: 'https://www.yahoo-help.jp/app/answers/detail/p/595/a_id/42716/~/ウェブページにアクセスするシステムのユーザーエージェントについて' + url: 'https://support.yahoo-net.jp/PccSearch/s/article/H000007955' + producer: + name: 'Yahoo! Japan Corp.' + url: 'https://www.yahoo.co.jp/' + +- regex: 'Y!J-WSC' + name: 'Yahoo! Japan WSC' + category: 'Crawler' + url: 'https://support.yahoo-net.jp/PccSearch/s/article/H000007955' + producer: + name: 'Yahoo! Japan Corp.' + url: 'https://www.yahoo.co.jp/' + +- regex: 'Y!J-ASR' + name: 'Yahoo! Japan ASR' + category: 'Crawler' + url: 'https://support.yahoo-net.jp/PccSearch/s/article/H000007955' + producer: + name: 'Yahoo! Japan Corp.' + url: 'https://www.yahoo.co.jp/' + +- regex: '^Y!J' + name: 'Yahoo! Japan' + category: 'Crawler' + url: 'https://support.yahoo-net.jp/PccSearch/s/article/H000007955' producer: name: 'Yahoo! Japan Corp.' url: 'https://www.yahoo.co.jp/' -- regex: 'Yandex(SpravBot|ScreenshotBot|MobileBot|AccessibilityBot|ForDomain|Vertis|Market|Catalog|Calendar|Sitelinks|AdNet|Pagechecker|Webmaster|Media|Video|Bot|Images|Antivirus|Direct|Blogs|Favicons|ImageResizer|Verticals|News(links)?|Metrika|\.Gazeta Bot)|YaDirectFetcher|YandexTurbo|YandexTracker|YandexSearchShop|YandexRCA|YandexPartner|YandexOntoDBAPI|YandexOntoDB|YandexMobileScreenShotBot' +- regex: 'Yandex(?:(?:\.Gazeta |Accessibility|Mobile|MobileScreenShot|RenderResources|Screenshot|Sprav)?Bot|(?:AdNet|Antivirus|Blogs|Calendar|Catalog|Direct|Favicons|ForDomain|ImageResizer|Images|Market|Media|Metrika|News|OntoDB(?:API)?|Pagechecker|Partner|RCA|SearchShop|(?:News|Site)links|Tracker|Turbo|Userproxy|Verticals|Vertis|Video|Webmaster))|YaDirectFetcher' name: 'Yandex Bot' category: 'Search bot' - url: 'http://www.yandex.com/bots' + url: 'https://yandex.com/support/webmaster/robot-workings/check-yandex-robots.html' producer: name: 'Yandex LLC' - url: 'http://company.yandex.com' + url: 'https://yandex.com/company/' -- regex: 'Yeti|NaverJapan' +- regex: 'Yeti|NaverJapan|AdsBot-Naver' name: 'Yeti/Naverbot' category: 'Search bot' url: 'http://help.naver.com/robots/' @@ -1657,7 +2093,7 @@ name: 'NetEase, Inc.' url: 'http://corp.163.com' -- regex: 'YOURLS v[0-9]' +- regex: 'YOURLS' name: 'Yourls' category: 'Crawler' url: 'http://yourls.org' @@ -1699,7 +2135,7 @@ name: 'Yottaa' url: 'http://www.yottaa.com/' -- regex: 'Yahoo Ad monitoring.*yahoo-ad-monitoring-SLN24857.*' +- regex: 'Yahoo Ad monitoring.*yahoo-ad-monitoring-SLN24857' name: 'Yahoo Gemini' category: 'Crawler' url: 'https://help.yahoo.com/kb/yahoo-ad-monitoring-SLN24857.html' @@ -1718,20 +2154,20 @@ - regex: 'HubPages.*crawlingpolicy' name: 'HubPages' category: 'Crawler' - url: 'http://hubpages.com/help/crawlingpolicy' + url: 'https://hubpages.com/help/crawlingpolicy' producer: - name: 'HubPages' - url: 'http://hubpages.com/' + name: 'HubPages, Inc.' + url: 'https://discover.hubpages.com/' -- regex: 'Pinterest/\d\.\d.*www\.pinterest\.com.*' +- regex: 'Pinterest(?:bot)?/.*www\.pinterest\.com' name: 'Pinterest' - url: '' + url: 'https://help.pinterest.com/en/business/article/pinterest-crawler' category: 'Crawler' producer: name: 'Pinterest' - url: 'http://www.pinterest.com/' + url: 'https://www.pinterest.com/' -- regex: 'Site24x7' +- regex: '.*Site24x7' name: 'Site24x7 Website Monitoring' category: 'Site Monitor' url: 'https://www.site24x7.com/site24x7-faq.html' @@ -1739,6 +2175,14 @@ name: 'Site24x7' url: 'https://www.site24x7.com' +- regex: '.* HLB' + name: 'Site24x7 Defacement Monitor' + category: 'Site Monitor' + url: 'https://support.site24x7.com/portal/en/kb/articles/default-user-agent-used-in-website-defacement-monitor' + producer: + name: 'Site24x7' + url: 'https://www.site24x7.com/' + - regex: 's~snapchat-proxy' name: 'Snapchat Proxy' category: 'Crawler' @@ -1747,6 +2191,22 @@ name: 'Snapchat Inc.' url: 'https://www.snapchat.com' +- regex: 'Snap URL Preview Service' + name: 'Snap URL Preview Service' + category: 'Service Agent' + url: 'https://developers.snap.com/robots' + producer: + name: 'Snapchat Inc.' + url: 'https://www.snapchat.com/' + +- regex: 'SnapchatAds' + name: 'Snapchat Ads' + category: 'Crawler' + url: 'https://businesshelp.snapchat.com/s/article/adsbot-crawler?language=en_US' + producer: + name: 'Snapchat Inc.' + url: 'https://www.snapchat.com/' + - regex: "Let's Encrypt validation server" name: "Let's Encrypt Validation" category: 'Service Agent' @@ -1771,13 +2231,13 @@ name: 'Monitor.Us' url: 'http://www.monitor.us' -- regex: 'Catchpoint( bot)?' +- regex: 'Catchpoint' name: 'Catchpoint' category: 'Site Monitor' - url: '' + url: 'https://www.catchpoint.com/' producer: name: 'Catchpoint Systems' - url: 'http://www.catchpoint.com/' + url: 'https://www.catchpoint.com/' - regex: 'bitlybot' name: 'BitlyBot' @@ -1823,6 +2283,11 @@ - regex: 'PagePeeker' name: 'PagePeeker' + category: 'Crawler' + url: 'https://pagepeeker.com/robots/' + producer: + name: 'PAGEPEEKER SRL' + url: 'https://pagepeeker.com/' - regex: 'WebThumbnail' name: 'WebThumbnail' @@ -1839,22 +2304,19 @@ - regex: 'AdMantX.*admantx\.com' name: 'ADMantX' -- regex: 'Server Density Service Monitoring.*' +- regex: 'Server Density Service Monitoring' name: 'Server Density' - regex: 'RSSRadio \(Push Notification Scanner;support@dorada\.co\.uk\)' name: 'RSSRadio Bot' -- regex: '(A6-Indexer|nuhk|TsolCrawler|Yammybot|Openbot|Gulper Web Bot|grub-client|Download Demon|SearchExpress|Microsoft URL Control|borg|altavista|dataminr.com|tweetedtimes.com|TrendsmapResolver|teoma|blitzbot|oegp|furlbot|http%20client|polybot|htdig|mogimogi|larbin|scrubby|searchsight|seekbot|semanticdiscovery|snappy|vortex(?! Build)|zeal|fast-webcrawler|converacrawler|dataparksearch|findlinks|BrowserMob|HttpMonitor|ThumbShotsBot|URL2PNG|ZooShot|GomezA|Google SketchUp|Read%20Later|RackspaceBot|robots|SeopultContentAnalyzer|7Siters|centuryb.o.t9)' - name: 'Generic Bot' - - regex: '^sentry' name: 'Sentry Bot' producer: name: 'Sentry' url: 'https://sentry.io' -- regex: '^Spotify' +- regex: '^Spotify/[\d.]+$' name: 'Spotify' producer: name: 'Spotify' @@ -1904,7 +2366,7 @@ name: 'WooRank sprl' url: 'https://www.woorank.com/' -- regex: '(Match|LinkCheck) by Siteimprove.com' +- regex: 'Siteimprove' name: 'Siteimprove' category: 'Search bot' url: 'https://siteimprove.com/' @@ -1936,7 +2398,7 @@ name: 'Idee Inc.' url: 'http://ideeinc.com/' -- regex: 'zelist.ro feed parser' +- regex: 'zelist\.ro feed parser' name: 'Ze List' url: 'https://www.zelist.ro/' category: 'Feed Fetcher' @@ -1955,18 +2417,18 @@ - regex: 'BoardReader Favicon Fetcher' name: 'BoardReader' category: 'Search bot' - url: 'http://boardreader.com/' + url: 'https://boardreader.com/' producer: name: 'Effyis Inc' - url: 'http://boardreader.com/' + url: 'https://boardreader.com/' -- regex: 'IDG/IT' - name: 'IDG/IT' - category: 'Search bot' - url: 'https://spaziodati.eu/' +- regex: 'IDG/(?:EU|IT|RU|UK)' + name: 'IDG' + category: 'Crawler' + url: 'https://www.spaziodati.eu/' producer: name: 'SpazioDati S.r.l.' - url: 'https://spaziodati.eu/' + url: 'https://www.spaziodati.eu/' - regex: 'Bytespider' name: 'Bytespider' @@ -1984,26 +2446,26 @@ name: 'Fotolitografie Fiorentine di Becchi Antonio s.n.c.' url: 'https://www.wikido.com/' -- regex: 'AwarioSmartBot' +- regex: 'Awario(?:Smart)?Bot' name: 'Awario' category: 'Search bot' url: 'https://awario.com/bots.html' producer: - name: 'Awario' - url: 'https://awario.com/' + name: 'TechFusion Ltd.' + url: 'https://www.techfusion.com.cy/' - regex: 'AwarioRssBot' name: 'Awario' category: 'Feed Fetcher' url: 'https://awario.com/bots.html' producer: - name: 'Awario' - url: 'https://awario.com/' + name: 'TechFusion Ltd.' + url: 'https://www.techfusion.com.cy/' - regex: 'oBot' name: 'oBot' category: 'Search bot' - url: 'http://www.xforce-security.com/crawler/' + url: 'https://www.xforce-security.com/crawler/' producer: name: 'IBM Germany Research & Development GmbH' url: 'https://exchange.xforce.ibmcloud.com/' @@ -2032,6 +2494,14 @@ name: 'Startpagina B.V.' url: 'https://www.startpagina.nl/' +- regex: 'MoodleBot-Linkchecker' + name: 'MoodleBot Linkchecker' + category: 'Search bot' + url: 'hhttps://docs.moodle.org/en/Usage' + producer: + name: 'Moodle Pty Ltd' + url: 'https://moodle.org/' + - regex: 'GTmetrix' name: 'GTmetrix' category: 'Crawler' @@ -2040,7 +2510,13 @@ name: 'Carbon60 Operating Co. Ltd.' url: 'https://www.carbon60.com/' -# Generic detections +- regex: 'CyberFind ?Crawler' + name: 'CyberFind Crawler' + category: 'Crawler' + url: 'https://www.cyberfind.net/bot.html' + producer: + name: 'Find.tf' + url: 'https://find.tf/' - regex: 'Nutch' name: 'Nutch-based Bot' @@ -2048,7 +2524,2527 @@ url: 'https://nutch.apache.org' producer: name: 'The Apache Software Foundation' - url: 'http://www.apache.org/foundation/' + url: 'https://www.apache.org/foundation/' + +- regex: 'Seobility' + name: 'Seobility' + category: 'Crawler' + url: 'https://www.seobility.net/en/faq/?category=crawling#!aboutourbot' + +- regex: 'Vercelbot' + name: 'Vercel Bot' + category: 'Service bot' + url: 'https://vercel.com' + +- regex: 'Grammarly' + name: 'Grammarly' + category: 'Service bot' + url: 'https://www.grammarly.com' + +- regex: 'Robozilla' + name: 'Robozilla' + category: 'Crawler' + +- regex: 'Domains Project' + name: 'Domains Project' + category: 'Crawler' + url: 'https://domainsproject.org' + +- regex: 'PetalBot' + name: 'Petal Bot' + category: 'Crawler' + url: 'https://aspiegel.com/petalbot' + +- regex: 'SerendeputyBot' + name: 'Serendeputy Bot' + category: 'Crawler' + url: 'https://serendeputy.com/about/serendeputy-bot' + +- regex: 'ias-(?:va|sg).*admantx.*service-fetcher|admantx\.com.*service-fetcher' + name: 'ADmantX Service Fetcher' + category: 'Service bot' + url: 'https://www.admantx.com/service-fetcher.html' + +- regex: 'SemanticScholarBot' + name: 'Semantic Scholar Bot' + category: 'Crawler' + url: 'https://www.semanticscholar.org/crawler' + +- regex: 'VelenPublicWebCrawler' + name: 'Velen Public Web Crawler' + category: 'Crawler' + url: 'https://hunter.io/robot' + +- regex: 'Barkrowler' + name: 'Barkrowler' + category: 'Crawler' + url: 'http://www.exensa.com/crawl' + +- regex: 'BDCbot' + name: 'BDCbot' + category: 'Crawler' + url: 'https://bigweb.bigdatacorp.com.br/pages/faq.aspx' + producer: + name: 'BIG Data Solucoes Em Tecnologia de Informatica LTDA' + url: 'https://bigdatacorp.com.br/' + +- regex: 'adbeat' + name: 'Adbeat' + category: 'Crawler' + url: 'https://www.adbeat.com/operation_policy' + producer: + name: 'PPC Labs LLC' + url: 'https://www.adbeat.com/' + +- regex: '(?:BuiltWith|BW/)' + name: 'BuiltWith' + category: 'Crawler' + url: 'https://builtwith.com/biup' + producer: + name: 'BuiltWith Pty Ltd' + url: 'https://builtwith.com/' + +- regex: 'https://whatis\.contentkingapp\.com' + name: 'ContentKing' + category: 'Site Monitor' + url: 'https://whatis.contentkingapp.com/' + producer: + name: 'ContentKing BV' + url: 'https://www.contentkingapp.com/' + +- regex: 'MicroAdBot' + name: 'MicroAdBot' + category: 'Crawler' + url: 'https://www.microad.co.jp/' + producer: + name: 'MicroAd, Inc.' + url: 'https://www.microad.co.jp/' + +- regex: 'PingAdmin\.Ru' + name: 'PingAdmin.Ru' + category: 'Site Monitor' + url: 'https://ping-admin.ru/' + +- regex: 'notifyninja.+monitoring' + name: 'Notify Ninja' + category: 'Site Monitor' + url: 'http://notifyninja.com' + +- regex: 'WebDataStats' + name: 'WebDataStats' + category: 'Crawler' + url: 'https://webdatastats.com/policy.html' + producer: + name: 'WebTehRazrabotka LLC' + url: 'https://webdatastats.com/' + +- regex: 'parse\.ly scraper' + name: 'parse.ly' + category: 'Crawler' + url: 'https://www.parse.ly/help/integration/crawler' + producer: + name: 'Parsely, Inc.' + url: 'https://www.parse.ly/' + +- regex: 'Nimbostratus-Bot' + name: 'Nimbostratus Bot' + category: 'Site Monitor' + url: 'http://cloudsystemnetworks.com' + +- regex: 'HeartRails_Capture' + name: 'Heart Rails Capture' + category: 'Service Agent' + url: 'http://capture.heartrails.com' + +- regex: 'Project-Resonance' + name: 'Project Resonance' + category: 'Crawler' + url: 'https://project-resonance.com/' + producer: + name: 'RedHunt Labs Limited' + url: 'https://redhuntlabs.com/' + +- regex: 'DataXu' + name: 'DataXu' + category: 'Service Agent' + url: 'https://advertising.roku.com/dataxu' + producer: + name: 'Roku, Inc.' + url: 'https://roku.com' + +- regex: 'Cocolyzebot' + name: 'Cocolyzebot' + category: 'Crawler' + url: 'https://cocolyze.com/en/cocolyzebot' + producer: + name: 'VSI INNOVATION SAS' + url: 'https://vsi-innovation.com/' + +- regex: 'veryhip' + name: 'VeryHip' + category: 'Crawler' + url: 'https://veryhip.com/' + producer: + name: 'VeryHip' + url: 'https://veryhip.com/' + +- regex: 'LinkpadBot' + name: 'LinkpadBot' + category: 'Crawler' + url: 'https://www.linkpad.org/' + producer: + name: 'Solomono LLC' + url: 'https://www.linkpad.org/' + +- regex: 'MuscatFerret' + name: 'MuscatFerret' + category: 'Crawler' + url: 'http://www.webtop.com/' + +- regex: 'PageThing\.com' + name: 'PageThing' + category: 'Crawler' + url: 'https://www.pagething.com/' + producer: + name: 'SPECIALNOISE LTD' + url: 'https://www.specialnoise.com/' + +- regex: 'ArchiveBox' + name: 'ArchiveBox' + url: 'https://archivebox.io/' + category: 'Crawler' + producer: + name: '' + url: '' + +- regex: 'Choosito' + name: 'Choosito' + url: 'https://www.choosito.com/' + category: 'Crawler' + producer: + name: 'Choosito! Inc.' + url: 'https://www.choosito.com/' + +- regex: 'datagnionbot' + name: 'datagnionbot' + url: 'https://www.datagnion.com/bot.html' + category: 'Crawler' + producer: + name: 'DATAGNION GMBH' + url: 'https://www.datagnion.com/' + +- regex: 'WhatCMS' + name: 'WhatCMS' + url: 'https://whatcms.org/' + category: 'Crawler' + producer: + name: 'Nineteen Ten LLC' + url: 'https://whatcms.org/' + +- regex: 'httpx' + name: 'httpx' + url: 'https://github.com/projectdiscovery/httpx' + category: 'Crawler' + producer: + name: 'ProjectDiscovery, Inc.' + url: 'https://projectdiscovery.io/' + +- regex: '.*\.oast\.' + name: 'Interactsh' + category: 'Security Checker' + url: 'https://github.com/projectdiscovery/interactsh' + producer: + name: 'ProjectDiscovery, Inc.' + url: 'https://projectdiscovery.io/' + +- regex: 'scaninfo@(?:expanseinc|paloaltonetworks)\.com' + name: 'Expanse' + category: 'Security Checker' + url: 'https://expanse.co/' + producer: + name: 'Expanse Inc.' + url: 'https://expanse.co/' + +- regex: 'HuaweiWebCatBot' + name: 'HuaweiWebCatBot' + category: 'Crawler' + url: 'https://isecurity.huawei.com' + producer: + name: 'Huawei Technologies Co., Ltd.' + url: 'https://huawei.com' + +- regex: 'Hatena-Favicon' + name: 'Hatena Favicon' + category: 'Crawler' + url: 'https://www.hatena.ne.jp/faq/' + producer: + name: 'Hatena Co., Ltd.' + url: 'https://www.hatena.ne.jp' +- regex: 'Hatena-?Bookmark' + name: 'Hatena Bookmark' + category: 'Crawler' + url: 'https://www.hatena.ne.jp/faq/' + producer: + name: 'Hatena Co., Ltd.' + url: 'https://www.hatena.ne.jp' + +- regex: 'RyowlEngine' + name: 'Ryowl' + category: 'Crawler' + url: 'https://ryowl.org' + +- regex: 'OdklBot' + name: 'Odnoklassniki Bot' + category: 'Crawler' + url: 'https://odnoklassniki.ru' + +- regex: 'Mediatoolkitbot' + name: 'Mediatoolkit Bot' + category: 'Crawler' + url: 'https://mediatoolkit.com' + +- regex: 'ZoominfoBot' + name: 'ZoominfoBot' + category: 'Crawler' + url: 'https://www.zoominfo.com' + +- regex: 'WeViKaBot' + name: 'WeViKaBot' + category: 'Crawler' + url: 'http://www.wevika.de' + +- regex: 'SEOkicks' + name: 'SEOkicks' + category: 'Crawler' + url: 'https://www.seokicks.de/robot.html' + producer: + name: 'SEOkicks' + url: 'https://www.seokicks.de/' + +- regex: 'Plukkie' + name: 'Plukkie' + category: 'Crawler' + url: 'http://www.botje.com/plukkie.htm' + +- regex: 'proximic;' + name: 'Comscore' + category: 'Crawler' + url: 'https://www.comscore.com/Web-Crawler' + +- regex: 'SurdotlyBot' + name: 'SurdotlyBot' + category: 'Crawler' + url: 'http://sur.ly/bot.html' + +- regex: 'Gowikibot' + name: 'Gowikibot' + category: 'Crawler' + url: 'http:/www.gowikibot.com' + +- regex: 'SabsimBot' + name: 'SabsimBot' + category: 'Crawler' + url: 'https://sabsim.com' + +- regex: 'LumtelBot' + name: 'LumtelBot' + category: 'Crawler' + url: 'https://umtel.com' -- regex: '[a-z0-9\-_]*((? end of file +- regex: 'OS ROSA; Linux' + name: 'Rosa' + version: '' ########## # webOS ########## -- regex: '(?:webOS|Palm webOS)(?:/(\d+[\.\d]+))?' +- regex: '(?:Web0S; .*WEBOS|webOS|web0S|Palm webOS|hpwOS)(?:[/]?(\d+[.\d]+))?' name: 'webOS' version: '$1' - -- regex: '(?:PalmOS|Palm OS)(?:[/ ](\d+[\.\d]+))?|Palm' + versions: + - regex: 'WEBOS(\d+[.\d]+)' + version: '$1' + - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/120' + version: '25' + - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/108' + version: '24' + - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/94' + version: '23' + - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/87' + version: '22' + - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/79' + version: '6' + - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/68' + version: '5' + - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/53' + version: '4' + - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/38' + version: '3' + - regex: 'WEBOS1' + version: '1' + - regex: 'Web0S; Linux/SmartTV.+Safari/538' + version: '2' + - regex: 'Web0S; Linux/SmartTV.+Safari/537' + version: '1' + +- regex: '(?:PalmOS|Palm OS)(?:[/ ](\d+[.\d]+))?|Palm' name: 'palmOS' version: '$1' -- regex: 'Xiino(?:.*v\. (\d+[\.\d]+))?' # palmOS only browser +- regex: 'Xiino(?:.*v\. (\d+[.\d]+))?' # palmOS only browser name: 'palmOS' version: '$1' - -- regex: 'MorphOS(?:[ /](\d+[\.\d]+))?' +- regex: 'MorphOS(?:[ /](\d+[.\d]+))?' name: 'MorphOS' version: '$1' - ########## # Windows ########## -- regex: 'CYGWIN_NT-10.0|Windows NT 10.0|Windows 10' +- regex: 'FBW.+FBSV/(\d+[.\d]*);' + name: 'Windows' + version: '$1' + +- regex: 'Windows.+OS: (\d+[.\d]*)' + name: 'Windows' + version: '$1' + +- regex: 'Windows; ?(\d+[.\d]*);' + name: 'Windows' + version: '$1' + +- regex: 'mingw32|winhttp|WhatsApp/.*W$' + name: 'Windows' + version: '' + +- regex: '(?:Windows(?:-Update-Agent)?|Microsoft-(?:CryptoAPI|Delivery-Optimization|WebDAV-MiniRedir|WNS)|WINDOWS_64)/(\d+\.\d+)' + name: 'Windows' + version: '$1' + +- regex: 'Windows-(1[01])-' + name: 'Windows' + version: '$1' + +- regex: 'CYGWIN_NT-10\.0|Win(?:dows )?NT 10\.0|Windows[ /]10' name: 'Windows' version: '10' -- regex: 'CYGWIN_NT-6.4|Windows NT 6.4|Windows 10' +- regex: 'CYGWIN_NT-6\.4|Windows NT 6\.4|Windows 10|win10' name: 'Windows' version: '10' - -- regex: 'CYGWIN_NT-6.3|Windows NT 6.3|Windows 8.1' + +- regex: 'Windows[/-](2016|2019|2022|2025)Server' + name: 'Windows' + version: 'Server $1' + +- regex: 'Windows/2012ServerR2' + name: 'Windows' + version: 'Server 2012 R2' + +- regex: 'CYGWIN_NT-6\.3|Windows NT 6\.3|Windows[ /]8\.1' name: 'Windows' version: '8.1' +- regex: 'Windows/2012Server' + name: 'Windows' + version: 'Server 2012' -- regex: 'CYGWIN_NT-6.2|Windows NT 6.2|Windows 8' +- regex: 'CYGWIN_NT-6\.2|Windows NT 6\.2|Windows 8|post2008Server' name: 'Windows' version: '8' - - -- regex: 'CYGWIN_NT-6.1|Windows NT 6.1|Windows 7' + +- regex: 'Windows/2008ServerR2' + name: 'Windows' + version: 'Server 2008 R2' + +- regex: 'CYGWIN_NT-6\.1|Windows NT 6\.1|Windows[ /]7|win7|Windows \(6\.1' name: 'Windows' version: '7' - - -- regex: 'CYGWIN_NT-6.0|Windows NT 6.0|Windows Vista' + +- regex: 'CYGWIN_NT-6\.0|Windows NT 6\.0|Windows Vista' name: 'Windows' version: 'Vista' - - -- regex: 'CYGWIN_NT-5.2|Windows NT 5.2|Windows Server 2003 / XP x64' + +- regex: 'CYGWIN_NT-5\.2|Windows NT 5\.2|Windows Server 2003 / XP x64|Windows/2003Server' name: 'Windows' version: 'Server 2003' - - -- regex: 'CYGWIN_NT-5.1|Windows NT 5.1|Windows XP' + +- regex: 'CYGWIN_NT-5\.1|Windows NT 5\.1|(?:Microsoft-)?Windows[ -]XP' name: 'Windows' version: 'XP' - - -- regex: 'CYGWIN_NT-5.0|Windows NT 5.0|Windows 2000' + +- regex: 'CYGWIN_NT-5\.0|Windows NT 5\.0|Windows 2000' name: 'Windows' version: '2000' - - -- regex: 'CYGWIN_NT-4.0|Windows NT 4.0|WinNT|Windows NT' + +- regex: 'CYGWIN_NT-4\.0|Windows NT 4\.0|WinNT(?! 10)|Windows NT' name: 'Windows' version: 'NT' - - -- regex: 'CYGWIN_ME-4.90|Win 9x 4.90|Windows ME' + +- regex: 'CYGWIN_ME-4\.90|Win 9x 4\.90|Windows ME' name: 'Windows' version: 'ME' - - -- regex: 'CYGWIN_98-4.10|Win98|Windows 98' + +- regex: 'CYGWIN_98-4\.10|Win98|Windows 98' name: 'Windows' version: '98' - - -- regex: 'CYGWIN_95-4.0|Win32|Win95|Windows 95|Windows_95' + +- regex: 'CYGWIN_95-4\.0|Win32|Win95|Windows 95|Windows_95' name: 'Windows' version: '95' - - -- regex: 'Windows 3.1' + +- regex: 'Windows 3\.1' name: 'Windows' version: '3.1' - - -- regex: 'Windows' + +- regex: 'Windows|.+win32|Win64|MSDW|HandBrake Win Upd|Microsoft BITS|ms-office; MSOffice' name: 'Windows' version: '' +- regex: 'OS/Microsoft_Windows_NT_(\d+\.\d+)' + name: 'Windows' + version: '$1' ########## # Haiku OS @@ -285,270 +1296,614 @@ name: 'Haiku OS' version: '' - ########## -# iOS +# tvOS (https://developer.apple.com/tvos/) ########## -- regex: 'CFNetwork/889' - name: 'iOS' - version: '11.1' +- regex: 'Apple ?TV.*CPU (?:iPhone )?OS ((?:9|1[0-9]|26)[_.]\d+(?:[_.]\d+)*)' + name: 'tvOS' + version: '$1' -- regex: 'CFNetwork/887.*(x86_64)' - name: 'Mac' - version: '10.13' +- regex: 'Apple TV; iOS ((?:9|1[0-9]|26)[_.]\d+(?:[_.]\d+)*)' + name: 'tvOS' + version: '$1' -- regex: 'CFNetwork/887' - name: 'iOS' - version: '11.0' +- regex: 'iOS(?:; |/)((?:9|1[0-9]|26)\.\d+(?:[_.]\d+)*) (?:model/)?AppleTV' + name: 'tvOS' + version: '$1' -- regex: 'CFNetwork/811.*(x86_64)' - name: 'Mac' - version: '10.12' +- regex: 'tvOS[ /]?((?:9|1[0-9]|26)\.\d+(?:[_.]\d+)*);?' + name: 'tvOS' + version: '$1' -- regex: 'CFNetwork/811' - name: 'iOS' - version: '10.3' +- regex: 'AppleTV(?:/?(\d+[.\d]+))?' + name: 'tvOS' + version: '$1' -- regex: 'CFNetwork/808\.3' - name: 'iOS' - version: '10.3' +########## +# watchOS (https://developer.apple.com/watchos/) +########## +- regex: '(?:Watch1,[12]/|Watch OS,|watchOS[ /]?)(\d+[.\d]*)?' + name: 'watchOS' + version: '$1' +- regex: 'Apple Watch(?!;)' + name: 'watchOS' + version: '' -- regex: 'CFNetwork/808\.2' - name: 'iOS' - version: '10.2' +########## +# iPadOS (https://www.apple.com/ipados/) +########## +- regex: 'FBMD/iPad;.*FBSV/ ?(1[3-9]|26).(\d+[.\d]*);' + name: 'iPadOS' + version: '$1.$2' -- regex: 'CFNetwork/808\.1' - name: 'iOS' - version: '10.1' +- regex: 'iPad(?:OS)?[ /](1[3-9]|26)\.(\d+[.\d]*)' + name: 'iPadOS' + version: '$1.$2' -- regex: 'CFNetwork/808\.0' - name: 'iOS' - version: '10.0' +- regex: '^iPad(?:\d+[\,\d]*)/(1[3-9]|26)\.(\d+[.\d]*)' + name: 'iPadOS' + version: '$1.$2' -- regex: 'CFNetwork/808' - name: 'iOS' - version: '10' +- regex: 'iPad(?:; (?:iOS|iPadOS|iPhone OS)|.+CPU (?:iPad |iPhone )?OS) ((1[3-9]|26)+(?:[_.]\d+)*)' + name: 'iPadOS' + version: '$1' -- regex: 'CFNetwork/758\.4\.3' - name: 'iOS' - version: '9.3.2' +- regex: 'iOS/(1[3-9]|26)\.(\d+[.\d]*).+Apple/iPad' + name: 'iPadOS' + version: '$1.$2' -- regex: 'CFNetwork/758\.3\.15' - name: 'iOS' - version: '9.3' +- regex: 'iPhone OS,(1[3-9]|26)\.(\d+[.\d]*).+iPad' + name: 'iPadOS' + version: '$1.$2' -- regex: 'CFNetwork/758\.2\.[78]' - name: 'iOS' - version: '9.2' +- regex: 'iphoneos(1[3-9]|26)\.(\d+[.\d]*); iPad' + name: 'iPadOS' + version: '$1.$2' -- regex: 'CFNetwork/758\.1\.6' - name: 'iOS' - version: '9.1' +- regex: 'Pinterest for iOS/.*iPad.*; (\d(?:[\d.]*))[)]$' + name: 'iPadOS' + version: '$1' -- regex: 'CFNetwork/758\.0\.2' +########## +# iOS +########## +- regex: 'iPad/([89]|1[012])\.(\d+[.\d]*)' name: 'iOS' - version: '9.0' + version: '$1.$2' -- regex: 'CFNetwork/711\.5\.6' +- regex: '^(?:iPad|iPhone)(?:\d+[\,\d]*)[/_](\d+[.\d]+)' name: 'iOS' - version: '8.4.1' + version: '$1' -- regex: 'CFNetwork/711\.4\.6' +- regex: 'iphoneos(1[3-9]|26)\.(\d+[.\d]*); iPhone' name: 'iOS' - version: '8.4' + version: '$1.$2' -- regex: 'CFNetwork/711\.3\.18' +- regex: 'Pinterest for iOS/.*iPhone.*; (\d(?:[\d.]*))[)]$' name: 'iOS' - version: '8.3' + version: '$1' -- regex: 'CFNetwork/711\.2\.23' +- regex: 'iOS (\d+[.\d]+)\)' name: 'iOS' - version: '8.2' + version: '$1' -- regex: 'CFNetwork/711\.1\.1[26]' +- regex: 'iPhone OS ([0-9]{1})([0-9]{1})([0-9]{1})' name: 'iOS' - version: '8.1' + version: '$1.$2.$3' -- regex: 'CFNetwork/711\.0\.6' +- regex: '(?:CPU OS|iPh(?:one)?[ _]OS|iPhone.+ OS|PodMN.+iPhone|iOS)[ _/]19(?:[_.])?(\d+(?:[._]\d+)*)' name: 'iOS' - version: '8.0' + version: '26.$1' -- regex: 'CFNetwork/672\.1' +- regex: '(?:CPU OS|iPh(?:one)?[ _]OS|iPhone.+ OS|PodMN.+iPhone|iOS)[ _/](\d+(?:[_.]\d+)*)' name: 'iOS' - version: '7.1' + version: '$1' -- regex: 'CFNetwork/672\.0' +- regex: '(?:iPhone ?OS|iOS(?: Version)?)(?:/|; |,)(\d+[.\d]+)' name: 'iOS' - version: '7.0' + version: '$1' -- regex: 'CFNetwork/609\.1' +- regex: '^(?!com\.apple\.Safari\.SearchHelper|Safari|NetworkingExtension).*(?:CFNetwork|Mana)/.+ Darwin/(\d+[.\d]+)(?!.*(?:x86_64|i386|PowerMac|Power%20Macintosh))' name: 'iOS' - version: '6.1' - -- regex: 'CFNetwork/60[29]' + versions: + - regex: 'Darwin/25\.0\.0' + version: '26' + - regex: 'Darwin/24\.5\.0' + version: '18.5' + - regex: 'Darwin/24\.4\.0' + version: '18.4' + - regex: 'Darwin/24\.3\.0' + version: '18.3' + - regex: 'Darwin/24\.2\.0' + version: '18.2' + - regex: 'Darwin/24\.1\.0' + version: '18.1' + - regex: 'Darwin/24\.0\.0' + version: '18.0' + - regex: 'Darwin/23\.6\.0' + version: '17.6' + - regex: 'Darwin/23\.5\.0' + version: '17.5' + - regex: 'Darwin/23\.4\.0' + version: '17.4' + - regex: 'Darwin/23\.3\.0' + version: '17.3' + - regex: 'Darwin/23\.2\.0' + version: '17.2' + - regex: 'Darwin/23\.1\.0' + version: '17.1' + - regex: 'Darwin/23\.0\.0' + version: '17.0' + - regex: 'Darwin/22\.6\.0' + version: '16.6' + - regex: 'Darwin/22\.5\.0' + version: '16.5' + - regex: 'Darwin/22\.4\.0' + version: '16.4' + - regex: 'Darwin/22\.3\.0' + version: '16.3' + - regex: 'Darwin/22\.2\.0' + version: '16.2' + - regex: 'Darwin/22\.1\.0' + version: '16.1' + - regex: 'Darwin/22\.0\.0' + version: '16.0' + - regex: 'Darwin/21\.6\.0' + version: '15.6' + - regex: 'Darwin/21\.5\.0' + version: '15.5' + - regex: 'Darwin/21\.4\.0' + version: '15.4' + - regex: 'Darwin/21\.3\.0' + version: '15.3' + - regex: 'Darwin/21\.2\.0' + version: '15.2' + - regex: 'Darwin/21\.1\.0' + version: '15.1' + - regex: 'Darwin/21\.0\.0' + version: '15.0' + - regex: 'Darwin/20\.6\.0' + version: '14.7' + - regex: 'Darwin/20\.5\.0' + version: '14.6' + - regex: 'Darwin/20\.4\.0' + version: '14.5' + - regex: 'Darwin/20\.3\.0' + version: '14.4' + - regex: 'Darwin/20\.2\.0' + version: '14.3' + - regex: 'Darwin/20\.1\.0' + version: '14.2' + - regex: 'Darwin/20\.0\.0' + version: '14.0' + - regex: 'Darwin/19\.6\.0' + version: '13.6' + - regex: 'Darwin/19\.5\.0' + version: '13.5' + - regex: 'Darwin/19\.4\.0' + version: '13.4' + - regex: 'Darwin/19\.3\.0' + version: '13.3.1' + - regex: 'Darwin/19\.2\.0' + version: '13.3' + - regex: 'Darwin/19\.0\.0' + version: '13.0' + - regex: 'Darwin/18\.7\.0' + version: '12.4' + - regex: 'Darwin/18\.6\.0' + version: '12.3' + - regex: 'Darwin/18\.5\.0' + version: '12.2' + - regex: 'Darwin/18\.2\.0' + version: '12.1' + - regex: 'Darwin/18\.0\.0' + version: '12.0' + - regex: 'Darwin/17\.7\.0' + version: '11.4.1' + - regex: 'Darwin/17\.6\.0' + version: '11.4' + - regex: 'Darwin/17\.5\.0' + version: '11.3' + - regex: 'Darwin/17\.4\.0' + version: '11.2.6' + - regex: 'Darwin/17\.3\.0' + version: '11.2' + - regex: 'CFNetwork/889' + version: '11.1' + - regex: 'CFNetwork/887' + version: '11.0' + - regex: 'CFNetwork/811' + version: '10.3' + - regex: 'CFNetwork/808\.3' + version: '10.3' + - regex: 'CFNetwork/808\.2' + version: '10.2' + - regex: 'CFNetwork/808\.1' + version: '10.1' + - regex: 'CFNetwork/808\.0' + version: '10.0' + - regex: 'CFNetwork/808' + version: '10' + - regex: 'CFNetwork/758\.5\.3' + version: '9.3.5' + - regex: 'CFNetwork/758\.4\.3' + version: '9.3.2' + - regex: 'CFNetwork/758\.3\.15' + version: '9.3' + - regex: 'CFNetwork/758\.2\.[78]' + version: '9.2' + - regex: 'CFNetwork/758\.1\.6' + version: '9.1' + - regex: 'CFNetwork/758\.0\.2' + version: '9.0' + - regex: 'CFNetwork/711\.5\.6' + version: '8.4.1' + - regex: 'CFNetwork/711\.4\.6' + version: '8.4' + - regex: 'CFNetwork/711\.3\.18' + version: '8.3' + - regex: 'CFNetwork/711\.2\.23' + version: '8.2' + - regex: 'CFNetwork/711\.1\.1[26]' + version: '8.1' + - regex: 'CFNetwork/711\.0\.6' + version: '8.0' + - regex: 'CFNetwork/672\.1' + version: '7.1' + - regex: 'CFNetwork/672\.0' + version: '7.0' + - regex: 'CFNetwork/609\.1' + version: '6.1' + - regex: 'CFNetwork/60[29]' + version: '6.0' + - regex: 'CFNetwork/548\.1' + version: '5.1' + - regex: 'CFNetwork/548\.0' + version: '5.0' + - regex: 'CFNetwork/485\.13' + version: '4.3' + - regex: 'CFNetwork/485\.12' + version: '4.2' + - regex: 'CFNetwork/485\.10' + version: '4.1' + - regex: 'CFNetwork/485\.2' + version: '4.0' + - regex: 'CFNetwork/467\.12' + version: '3.2' + - regex: 'CFNetwork/459' + version: '3.1' + +- regex: '(?:iPhone|iPod_touch)/(\d+[.\d]*)(?: hw)?/' name: 'iOS' - version: '6.0' + version: '$1' -- regex: 'CFNetwork/548\.1' +- regex: 'iOS(\d+\.\d+\.\d+)' name: 'iOS' - version: '5.1' + version: '$1' -- regex: 'CFNetwork/548\.0' +- regex: 'iOS(\d+)\.(\d+)0' name: 'iOS' - version: '5.0' + version: '$1.$2' -- regex: 'CFNetwork/485\.13' +- regex: 'FBMD/iPhone;.*FBSV/ ?(\d+[.\d]+);' name: 'iOS' - version: '4.3' + version: '$1' -- regex: 'CFNetwork/485\.12' +- regex: '(?:FBIOS|Messenger(?:Lite)?ForiOS).*FBSV/ ?(\d+[.\d]*);' name: 'iOS' - version: '4.2' + version: '$1' -- regex: 'CFNetwork/485\.10' +- regex: 'iPhone OS,([\d.]+).+(?:iPhone|iPod)' name: 'iOS' - version: '4.1' + version: '$1' -- regex: 'CFNetwork/485\.2' +- regex: 'iPad.+; (\d+[.\d]+);' name: 'iOS' - version: '4.0' + version: '$1' -- regex: 'CFNetwork/467\.12' +- regex: 'iPhone.+; Version (\d+[.\d]+)' name: 'iOS' - version: '3.2' + version: '$1' -- regex: 'CFNetwork/459' +- regex: 'OS=iOS;OSVer=(\d+[.\d]+);' name: 'iOS' - version: '3.1' + version: '$1' -- regex: '(?:CPU OS|iPh(?:one)?[ _]OS|iOS)[ _/](\d+(?:[_\.]\d+)*)' +- regex: 'os=Apple-iOS.+osversion=(\d+[.\d]+)/' name: 'iOS' version: '$1' -- regex: 'FBIOS.*FBSV/(\d+[\.\d]*);' +- regex: '(?:Apple-)?(?