ua-parser2
Version:
An improved user agent parser.
1,849 lines (1,696 loc) • 237 kB
YAML
update_url: 'https://raw.github.com/commenthol/ua-parser2/master/regexes.yaml'
# replacement pattern
pattern:
__VERSION__: '(\d{1,10})(?:\.(\d{1,10})|)(?:\.([a-z\d]{1,20})|)'
__VERSION_2_DIGITS__: '(\d{1,10})\.(\d{1,10})(?:\.(\d{1,10})|)'
__VERSION_3_DIGITS__: '(\d{1,10})\.(\d{1,10})\.(\d{1,10})'
__VERSION_DIGITS__: '(\d{1,10})(?:\.(\d{1,10})|)(?:\.(\d{1,10})|)'
__VERSION_DIGITS_UNDERSCORE__: '(\d{1,10})(?:[._](\d{1,10})|)(?:[._](\d{1,10})|)'
__VERSION_MOZILLA__: '(\d{1,10})(?:\.(\d{1,10})|)(?:\.?([a-z\d]{1,111})|)'
__VERSION_OS__: '(\d{1,10})(?:\.(\d{1,10})|)(?:\.(\d{1,10})|)(?:\.(\d{1,10})|)'
__VERSION_OS_UNDERSCORE__: '(\d{1,10})(?:[._](\d{1,10})|)(?:[._](\d{1,10})|)'
__BUILD__: '(?: Build|[;)])'
__LOCALE__: '[A-Za-z]{2}[_\-][A-Za-z]{0,2}'
#### Browser ####
user_agent_parsers:
### iOS / OSX Applications
- regex: '\b(CFNetwork|CaptiveNetworkSupport)'
group:
- regex: '^((?:(?! CFNetwork|/).){1,111})(?:/(\d{1,10})(?:\.([a-z\d]{1,111})|)(?:\.([a-z\d]{1,111})|)(?:.{1,300}|)|) CFNetwork/'
type: 'app'
- regex: '(CFNetwork)(?:/__VERSION__|.|$)'
type: 'app'
- regex: '(CaptiveNetworkSupport)-(\d{1,10})'
type: 'app'
#### Bots ####
- regex: "(\
^FDM|\
^insomnia|\
^integrity|\
@|\
Acoon|\
ai-agent|\
adbeat|\
AHC|\
aggregator|\
analyzer|\
anonymous|\
ApacheBench|\
Arachmo|\
archiver|\
aws-|\
[a-z]{3,30}\\.com|\
Azureus|\
BDFetch|\
BingWeb|\
BingPreview|\
blog|\
BlogBridge|\
\\bNG\\b|\
bot|\
boost|\
catalog|\
insomnia|\
Cerberian Drtrs|\
charlotte|\
check|\
checker|\
Clarsentia|\
cloud|\
crawl|\
Datanyze|\
diagnostic|\
\\bdig\\b|\
discovery|\
Download Demon|\
Evidon|\
ExaleadCloudview|\
explorer|\
extract|\
facebookexternalhit|\
faviconGenieo|\
FavOrg|\
GigablastOpenSource|\
gomezagent|\
google|\
GTmetrix|\
HatenaScreenshot|\
health|\
history|\
http[^:]{0,2}?://|\
httpunit|\
indexer|\
inspect|\
InternetSeer\\.com|\
intraVnews|\
ips-agent|\
JetBrains|\
JetS3t|\
Jigsaw|\
JNLP|\
KHTE|\
KTXN|\
larbin|\
link|\
LinkAlarm|\
lycos|\
Mail\\.Ru|\
marketing|\
MetaURI API|\
Microsoft URL Control|\
monitor|\
Moozilla|\
MovableType|\
netcraft|\
Neustar WPM|\
NING|\
\\boBot|\
PAN GlobalProtect|\
PayPal|\
Photon|\
Pingdom|\
Pinterest|\
pompos|\
Powermarks|\
probe|\
proxy|\
PRTG|\
PTST|\
QQDownload|\
Reaper|\
NewRelicPinger|\
Retreiver|\
Rival IQ|\
Robozilla|\
s3fs|\
scan|\
Scooter|\
scope|\
scrap|\
screenshot|\
search|\
seek|\
Shelob|\
site|\
sitecon|\
slurp|\
snap|\
Snoopy|\
SpaceBison|\
spider|\
Squrl Java|\
StackRambler|\
StatusCake|\
StumbleUpon|\
survey|\
synthetic|\
Tableau|\
teoma|\
TLSProber|\
Tumblr|\
validator|\
vortex|\
voyager|\
web-capture.net|\
WebMon|\
Webster Pro|\
WhatsApp/|\
WhatWeb|\
WinHTTP|\
WordPress|\
www[.-]|\
Xenu|\
zyborg\
)"
regex_flag: 'i'
group:
# Pingdom
- regex: '(Pingdom\.com_bot_version_)(\d{1,10})\.(\d{1,10})'
family: 'PingdomBot'
type: 'bot'
# Google Plus
- regex: 'Google.{0,300}/\+/web/snippet'
family: 'GooglePlusBot'
type: 'bot'
# Pinterestbot
- regex: '(Pinterest(?:bot|))\/(\d{1,10})(?:\.(\d{1,10})|[^\.]).{0,300}https?:\/\/'
type: 'bot'
# Add loadbalancer, monitoring, health-checks
- regex: '(ELB-HealthChecker|SiteScope)(?:[/ ]__VERSION__|.|$)'
regex_flag: 'i'
type: 'bot::healthcheck'
- regex: "(\
PRTG Network Monitor|\
PAN GlobalProtect|\
PingdomTMS\
)(?:[/ ]__VERSION__|.|$)"
regex_flag: 'i'
type: 'bot::monitor'
# AWS S3 Clients
- regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(?:__VERSION__|)'
type: 'bot'
- regex: '(PTST)[/ ]__VERSION__'
family: 'SpeedCurve WebPage Test'
type: 'bot'
- regex: '(NAVER)\(inapp; search(?:; \d{1,10}|)(?:; __VERSION_DIGITS__|)[;)]'
type: 'app'
- regex: '^(PHP) '
type: 'bot'
- regex: 'aggregator:(\\w{1,111})'
type: 'bot'
- regex: '/(Nutch)-__VERSION_2_DIGITS__'
type: 'bot'
# sort by length
# BAD REGEX
- regex: "(\
Ask ?Jeeves/Teoma|\
^teoma|\
(?:[a-z]{1,20}-|)Googlebot(?:-[a-z]{1,20}|)|\
Microsoft Windows Network Diagnostics|\
Microsoft [A-Za-z ]{6,50} Discovery|\
BoardReader Favicon Fetcher\\s{0,5}|\
BoardReader Blog Indexer|\
baidu[a-z]{0,20}(?:spider|Mobaider)|\
Netcraft (?:Web|SSL) Server Survey|\
Sogou \\w{1,20} (?:Robot|Spider)|\
AdsBot-Google(?:-[a-z]{1,20}|)|\
Automattic Analytics Crawler|\
Google Page Speed Insights|\
SynapticSearch/AI Crawler|\
msnbot(?:-media\\s{0,5}|)|\
IlTrovatore(?:-Setaccio|)|\
XaxisSemanticsClassifier|\
www\\.WebSearch.com\\.au|\
HubSpot Marketing Grader|\
Google-Site-Verification|\
\\bYeti(?:-[a-z]{0,20}|)|\
Advanced Email Extractor|\
Xenu(?:.s|) Link Sleuth|\
Google-HTTP-Java-Client|\
Daumoa(?:-feedfetcher|)|\
collection@infegy\\.com|\
Yahoo[a-z]{0,20}Seeker|\
Slackbot-LinkExpanding|\
NetShelter ContentScan|\
Free ScreenShotService|\
SEARCHALOT(?:\\.COM|)|\
SafariBookmarkChecker|\
Peeplo Screenshot Bot|\
Microsoft URL Control|\
Google Search Console|\
FlipboardBrowserProxy|\
Flamingo_SearchEngine|\
\\b\\w{0,33}favicon\\w{0,33}\\b|\
BrokenLinkCheck\\.com|\
Y!J(?:-[A-Z]{1,30}|)|\
Windows Phone Search|\
websitepulse checker|\
TrialPay URL checker|\
Rackspace Monitoring|\
Mediapartners-Google|\
Google-SearchByImage|\
archive.{0,30}\\.org_bot|\
ZeBot_www\\.ze\\.bz|\
Yahoo! SearchMonkey|\
www\\.alertra\\.com|\
RetrevoPageAnalyzer|\
NetcraftSurveyAgent|\
GigablastOpenSource|\
facebookexternalhit|\
Catchpoint(?: bot|)|\
CloudEndure Scanner|\
shrinktheweb\\.com|\
Shoppimon Analyzer|\
PlantyNet_WebRobot|\
NetLyzer FastProbe|\
mixed-content-scan|\
Mail\\.RU(?:_Bot|)|\
Innovazion Crawler|\
ichiro(?:/mobile|)|\
Google Web Preview|\
Comodo SSL Checker|\
1470\\.net crawler|\
WEB\\.DE MailCheck|\
Siteimprove\\.com|\
seoscanners\\.net|\
semanticdiscovery|\
notifyninja\\.com|\
Microsoft .{0,30} Bot|\
IP2[a-z]{1,20}Bot|\
CostaCider Search|\
SeznamEmailProxy|\
sureseeker\\.com|\
Offline Explorer|\
^Nutch[^/]{0,30}|\
Newneon BlogBorg|\
InternetSeer.com|\
HatenaScreenshot|\
GoogleImageProxy|\
ExaleadCloudview|\
AppEngine-Google|\
web-capture.net|\
Thumbshots\\.ru|\
SiteTruth\\.com|\
searchuk.comBot|\
panscient\\.com|\
Minstrel-Browse|\
JemmaTheTourist|\
InternetArchive|\
Google SketchUp|\
Ghost Inspector|\
Feed Seeker Bot|\
fast-webcrawler|\
Cerberian Drtrs|\
agentslug\\.com|\
Adsense-Snapshot-Google|\
Accoona-AI-Agent|\
Amazon CloudFront|\
8bo Crawler Bot|\
WorldWideWeb-X|\
trendictionbot|\
Slack-ImgProxy|\
SearchIt\\.Bot|\
RuxitSynthetic|\
PaxleFramework|\
PagesInventory|\
NewsGator[^/]{0,33}|\
FollowSite Bot|\
FlipboardProxy|\
Download Demon|\
dataparksearch|\
ConveraCrawler|\
Buscaplus Robi|\
NewRelicPinger|\
WWW-Mechanize|\
YottaaMonitor|\
WDG_Validator|\
voila(?:bot|)|\
ThumbShotsBot|\
socbot search|\
ObjectsSearch|\
http%20client|\
GoogleToolbar|\
Bot-TailTrend|\
boitho.com-dc|\
BlogPulseLive|\
YFSJ crawler|\
Yahoo! Slurp|\
WeSEE:Search|\
WASALive.Bot|\
TheUsefulbot|\
StackRambler|\
search:robot|\
Read%20Later|\
masidani_bot|\
Isara-Search|\
HistoryHound|\
BilgiBetaBot|\
adbeat\\.com|\
Webster Pro|\
StumbleUpon|\
Websearch4u|\
Taringa UGC|\
searchsight|\
SearchByUsa|\
robotgenius|\
Neustar WPM|\
netresearch|\
MSIECrawler|\
MovableType|\
MnoGoSearch|\
MetaURI API|\
LinkedInBot|\
Linkchecker|\
Linguee Bot|\
HttpMonitor|\
BoardReader|\
BingPreview|\
ApacheBench|\
Add Catalog|\
LinkWalker|\
Powermarks|\
Yandex\\w{1,111}|\
YahooYSMcm|\
TwitterBot|\
StatusCake|\
Squrl Java|\
SpaceBison|\
QQDownload|\
PayPal IPN|\
PagePeeker|\
KiwiStatus|\
^integrity|\
intraVnews|\
GuzzleHttp|\
GomezAgent|\
Discordbot|\
Clarsentia|\
Checklinks|\
BlogBridge|\
\\bKTXN\\b|\
\\bKHTE\\b|\
^anonymous|\
A6-Indexer|\
WordPress|\
Votay bot|\
TLSProber|\
Site-Shot|\
Robozilla|\
RMSnapKit|\
Retreiver|\
RedCarpet|\
Popdexter|\
NG-Search|\
LinkAlarm|\
LesnikBot|\
JetBrains|\
^insomnia|\
i?seekbot|\
ips-agent|\
findlinks|\
DareBoost|\
charlotte|\
Butterfly|\
BuiltWith|\
Altresium|\
altavista|\
Datanyze|\
WebThumb|\
^voyager|\
ShopWiki|\
ScoutJet|\
Rival IQ|\
Qwantify|\
OSSProxy|\
Netvibes|\
NerdyBot|\
MuckRack|\
Moozilla|\
mogimogi|\
Lite Bot|\
IQSearch|\
InfuzApp|\
IconSurf|\
Icarus6j|\
httpunit|\
HooWWWer|\
heritrix|\
GTmetrix|\
clumboot|\
\\bNG\\b|\
blitzbot|\
archiver|\
adidxbot|\
AcoonBot|\
Tableau|\
ZooShot|\
WinHTTP|\
WhatWeb|\
^vortex|\
URL2PNG|\
Spinn3r|\
SiteCon|\
Semager|\
scrubby|\
scooter|\
Riddler|\
polybot|\
Plukkie|\
^Photon|\
Orbiter|\
openbot|\
NetSurf|\
masscan|\
Lsearch|\
jbot\\b|\
^INGRID|\
gigabot|\
furlbot|\
Filangy|\
BotSeer|\
\\boBot|\
BingWeb|\
bingbot|\
BDFetch|\
Azureus|\
Arachmo|\
50\\.nu|\
ZyBorg|\
zimeno|\
Wotbox|\
WebMon|\
^Tumblr|\
speedy|\
Snoopy|\
snappy|\
Shelob|\
Scrapy|\
Reaper|\
pompos|\
^Oblio|\
msrbot|\
mozDex|\
m65bot|\
larbin|\
Kurzor|\
Kraken|\
Jigsaw|\
holmes|\
GomezA|\
Genieo|\
FavOrg|\
Evidon|\
EasyDL|\
\\b008|\
Slurp|\
Nutch|\
^NING|\
lycos|\
Llaut|\
htdig|\
Giant|\
Evaal|\
^ECCP|\
DeuSu|\
Argus|\
Acoon|\
^zao|\
Yepi|\
WIRE|\
JNLP|\
^FDM|\
^AHC\
)(?:[ /-]__VERSION__|)"
regex_flag: 'i'
type: 'bot'
- regex: '^(bot)[^a-z](?:__VERSION__|)'
regex_flag: 'i'
type: 'bot'
- regex: "^.{0,200}?(\
(?:[a-z][a-z. _-]{0,50}|)\
(?:\
crawler|crawl|scraper|spider|indexer|webbot|analyzer|whatsapp|robot\\b|\
(?:(?!cubot)[\\w-]{2})bot\\b|\
[\\w.]{1,10} bot\\b| bot(?=@)\\b\
)\
)(?:[ /-]__VERSION__|)"
regex_flag: 'i'
type: 'bot'
- regex: "; (Daum)/__VERSION__"
type: 'bot'
- regex: 'MSIE \d{1,10}\..{0,100}?https?://((?:[\w\d-]{1,111}\.|)[\w\d-]{1,111}\.\w{1,111})'
type: 'bot'
### iOS / OSX Applications
- regex: '\b(iPhone|iPad|iPod)'
group:
- regex: '^([^/]{1,111})/__VERSION__ \((?:iPhone|iPad|iPod); iOS [0-9\.]{1,111}; Scale/[0-9\.]{1,111}\)'
type: 'app'
- regex: '^([^/]{1,111})/__VERSION__ iOS/[0-9\.]{1,111} model/(?:iPhone|iPad|iPod)'
type: 'app'
### Mail
- regex: "(\
[Mm]ail|\
Barca|\
\\bBat|\
DAV|\
ownCloud|\
Nextcloud|\
Exchange|\
Eudora|\
Evolution|\
Framabird|\
Icedove|\
Lightning|\
Lotus-Notes|\
MSOffice|\
Microsoft Office|\
Outlook|\
Shredder|\
Sparrow|\
Spicebird|\
Superhuman|\
Thunderbird|\
YahooMailProxy|\
YahooMobileMail|\
(?:Macintosh.{0,300} AppleWebKit|MailBar|Postbox|HipChat)\
)"
group:
# Outlook 2007
- regex: 'Microsoft Office Outlook 12\.\d{1,10}\.\d{1,10}|MSOffice 12'
family: 'Outlook'
v1: '2007'
type: 'mail'
# Outlook 2010
- regex: 'Microsoft Outlook 14\.\d{1,10}\.\d{1,10}|MSOffice 14'
family: 'Outlook'
v1: '2010'
type: 'mail'
# Outlook 2013
- regex: 'Microsoft Outlook 15\.\d{1,10}\.\d{1,10}'
family: 'Outlook'
v1: '2013'
type: 'mail'
# Outlook 2016
- regex: 'Microsoft Outlook (?:Mail |)16\.\d{1,10}\.\d{1,10}|MSOffice 16'
family: 'Outlook'
v1: '2016'
type: 'mail'
# Windows Live Mail
- regex: 'Outlook-Express\/7\.0.{0,300}'
family: 'Windows Live Mail'
type: 'mail'
# Mail Agents with version
- regex: "(\
Evolution\
)/__VERSION__"
type: 'mail'
# Other Mail Agents
- regex: "(\
Barca(?:Pro|)|\
Eudora|\
ExchangeServicesClient|\
ExchangeWebServices|\
Framabird|\
FossaMail|\
HipChat|\
kmail2|\
Lotus-Notes|\
MacOutlook|\
MailBar|\
Mail Free|\
Microsoft Outlook|\
Outlook-Express|\
Outlook-iOS-Android|\
Pocomail|\
Postbox|\
Slack_SSB|\
Sparrow|\
Superhuman|\
The Bat!(?: Voyager|)|\
YahooMailProxy|\
YahooMobileMail\
)(?:[/ ]__VERSION__|)"
type: 'mail'
# Apple Air Mail
- regex: '(Airmail) __VERSION__'
type: 'mail'
- regex: '(Shredder|Spicebird)/__VERSION__'
type: 'mail'
# Apple Mail
- regex: '^Mozilla\/5\.0 \(.{0,300} Mac OS X.{0,300}\(KHTML, like Gecko\)(?: Mobile\/[\S]{0,33}|)$'
family: 'Apple Mail'
type: 'mail'
# Lightning (for Thunderbird) http://www.mozilla.org/projects/calendar/lightning/
- regex: 'Gecko/\d{1,10} (Lightning)/__VERSION_MOZILLA__'
type: 'mail'
# Thunderbird
- regex: '(Thunderbird|Icedove)/__VERSION_MOZILLA__'
family: 'Thunderbird'
type: 'mail'
- regex: '(mobmail) android __VERSION__'
type: 'mail'
# DAV
- regex: '(mirall)/__VERSION__.{0,300}Nextcloud'
family: 'Nextcloud'
type: 'app::webdav'
- regex: '(WEBDAV Client)'
type: 'app::webdav'
- regex: "\\b(\
RCM CardDAV plugin|\
DAVdroid|\
ownCloud-android|\
Microsoft-WebDAV-MiniRedir\
)/__VERSION__"
type: 'app::webdav'
- regex: '(Microsoft Office) \(Word\) (2014)'
family: 'Microsoft Office Word'
type: 'app'
# Feedreader
- regex: "\\b(\
AideRSS|\
Akregator|\
Apple-PubSub|\
Bloglovin|\
CITA RSS Aggregator|\
Custom-Feed Reader|\
Digg Feed Fetcher|\
Feedbin |\
FeedBlitz|\
FeedDa?emon|\
Feeddler|\
FeedForAll|\
Feedreader|\
JetBrains Omea Reader|\
Liferea|\
NetNewsWire|\
Mtps Feed Aggregation System|\
newsbeuter|\
newspaper|\
NewsBlur|\
Pulp|\
ReadKit|\
ReederForMac|\
RssBar|\
RSS Junkie|\
RSS Menu|\
RSSOwl|\
(?:RSS|Rss)Bandit|\
SimplePie|\
SimpleRSS|\
Stringer|\
Tiny Tiny RSS|\
UniversalFeedParser|\
Windows-RSS-Platform|\
Wizz RSS News Reader\
)(?:[ /]__VERSION__|)"
type: 'feedreader'
# podcast
- regex: "(AppleCoreMedia)/__VERSION__"
type: 'app'
- regex: "\\b(\
AntennaPod|\
BashPodder|\
BeyondPod|\
bPod|\
DoggCatcher|\
Doppler|\
Downcast|\
ESPN Radio|\
Fancy Cloud Music|\
FancyMusic|\
gPodder|\
GoldenPod|\
iPodder|\
jPodder|\
Juice|\
MediaGo|\
Overcast|\
Peapod|\
philpodder|\
Player FM|\
PodCruncher|\
PocketTunes|\
Podcasts|\
Podkicker(?: Classic| Pro|)|\
podracer|\
RSS_?Radio\
)\\b(?:(?: v ?|[ /])__VERSION__|)"
type: 'podcast'
# mediaplayers
- regex: "\\b(
AlexaMediaPlayer|\
Banshee|\
Clementine|\
ExoPlayerLib|\
FlyCast|\
foobar2000|\
HTC Streaming Player|\
Instacast|\
iTunes(?:-iP\\w{1,111}(?:-\\w{1,111}|)|)|\
Kodi|\
LG Player|\
MediaMonkey|\
Nightingale|\
NSPlayer|\
RebelMouse|\
Songbird|\
spmc|\
Spotify|\
SubStream|\
vlc|\
VLC|\
amarok|\
VOX Music Player|\
Windows-Media-Player(?:-\\w{1,111}|)|\
WMPlayer|\
XBMC|\
Zune\
)\\b(?:[ /](\\d{1,10})(?:\\.(\\d{1,10})(?:\\.(\\d{1,10})|)(-[A-Z\\d]{1,111}|)|)|)"
v3: '$4$5'
type: 'mediaplayer'
- regex: '(Lavf|Miro)/?__VERSION__'
type: 'mediaplayer'
- regex: '(QuickTime)(?:(?:(?:.{1,300}qtver=)|(?:(?: E-|)[\./]))__VERSION__|)'
type: 'mediaplayer'
# social networks
- regex: 'Pinterest|\[FB'
group:
# Facebook
- regex: '\[FB[^/]{1,5}?/(Groups|Messenger|FBPageAdmin)[^;]{0,10}?;FBAV/__VERSION__'
regex_flag: 'i'
family: 'Facebook $1'
type: 'app'
- regex: '\[FB.{0,300};(FB(?:AV|Version))/__VERSION__'
family: 'Facebook'
type: 'app'
- regex: '\[FB.{0,300}/FB'
family: 'Facebook'
type: 'app'
# Pinterest
- regex: '\[(Pinterest)/[^\]]{1,10}\]'
type: 'app'
- regex: '(Pinterest)(?: for Android(?: Tablet|)|)/__VERSION__'
type: 'app'
# Apps
- regex: '\b(MicroMessenger)/__VERSION__'
family: 'WeChat'
type: 'app'
- regex: "\\b(\
^Dalvik|\
1Password|\
AdobeAIR|\
Alltop|\
baiduboxapp|\
BacaBerita App|\
Box|\
BoxNotes|\
Box Sync|\
Coursera-Mobile|\
CreativeCloud|\
Crowsnest|\
Cyberdog|\
Cyberduck|\
DDG-Android|\
Deezer|\
Dreamweaver|\
DuckDuckGo|\
Instagram|\
iWeb|\
kioclient|\
Kurio|\
Line|\
Microsoft Office|\
Microsoft Office Excel|\
Microsoft Office Mobile|\
Microsoft Office OneNote|\
Microsoft Office PowerPoint|\
Microsoft Office SyncProc|\
Microsoft Office Upload Center|\
Microsoft Office Visio|\
Microsoft Office Word|\
Microsoft Office Word|\
Mobicip|\
MS ?FrontPage|\
NewsArticle|\
NewsFire|\
OpenOffice|\
PowerPoint|\
Prince|\
RedFlagDealsApp|\
RobloxStudio|\
Sandvox|\
Snapchat|\
SohuNews|\
SoundCloud-Android|\
WebClip|\
Windows-Update-Agent|\
WindowsPowerShell\
)[ /-]__VERSION__"
type: 'app'
# Apps wo Version
- regex: "\\b(\
AndroidDownloadManager|\
bingipadclient|\
Coda|\
David Client|\
Evernote|\
iBooks|\
LibreOffice|\
NewsFire|\
Raptr|\
Reddit|\
Sandvox|\
TubeTV|\
wkhtmltoimage|\
YJApp-ANDROID|\
wkhtmltopdf\
)\\b"
type: 'app'
# Weibo
- regex: '_(weibo)_{1,2}__VERSION__'
family: 'Weibo'
type: 'app'
#### SPECIAL CASES TOP ####
# Gecko group
- regex: 'Gecko|Treco|FxiOS|Cheshire'
group:
# Old Opera hides as Firefox
- regex: '(Opera) __VERSION__'
# Browsers using Gecko; must go before Firefox
- regex: "Mozilla.{0,300}\\b(\
Beonex|\
Camino|\
Cheshire|\
Chimera|\
CometBird|\
Firebird(?: Browser|)|\
Fireweb Navigator|\
Flock|\
IceDragon|\
K-Ninja|\
KMLite|\
Light|\
lolifox|\
MultiZilla|\
Navigator|\
[Pp]rism|\
SailfishBrowser|\
SeaMonkey|\
Vonkeror\
)/__VERSION_MOZILLA__"
- regex: '(MultiZilla) v__VERSION_MOZILLA__'
# Firefox
- regex: '(Fennec)/__VERSION_MOZILLA__'
family: 'Firefox Mobile'
- regex: '(?:Mobile[:;]|Tablet;).{0,300}(Firefox)/__VERSION_MOZILLA__'
family: 'Firefox Mobile'
- regex: '\b(BonEcho|GranParadiso|Lorentz|Minefield|Namoroka|Pale[Mm]oon|Shiretoko)/__VERSION_MOZILLA__'
- regex: '(Firefox).{0,300}Tablet browser __VERSION_MOZILLA__'
family: 'MicroB'
- regex: '(MozillaDeveloperPreview)/__VERSION_MOZILLA__'
- regex: '(FxiOS)/__VERSION_MOZILLA__'
family: 'Firefox iOS'
# Swiftfox
- regex: '(Firefox)/__VERSION__ \(Swiftfox\)'
family: 'Swiftfox'
# Waterfox
- regex: '(Waterfox)/__VERSION__'
- regex: '(Firefox)/__VERSION_MOZILLA__ (Classilla)'
family: '$5'
- regex: '(Firefox)/__VERSION_MOZILLA__'
- regex: '(MyIBrow)/__VERSION__'
family: 'My Internet Browser'
# UC Browser (needs to be checked before Opera Mini)
- regex: '(UC? ?Browser|UCWEB|\bU3)[ /]?(\d{1,10})\.(\d{1,10})\.(\d{1,10})'
family: 'UC Browser'
# Opera group
- regex: 'Opera|OPR|OPiOS|Coast| MMS/'
group:
# Opera will stop at 9.80 and hide the real version in the Version string.
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
- regex: '(Opera Tablet).{0,300}Version/__VERSION_DIGITS__'
- regex: '(Opera Mini)(?:/att|)/__VERSION_DIGITS__'
- regex: '(Opera Mini)'
- regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/__VERSION_DIGITS__'
family: 'Opera Mobile'
- regex: '(Opera)/__VERSION__.{1,100}Opera Mobi'
family: 'Opera Mobile'
- regex: 'Opera Mobi.{1,100}(Opera)(?:\/|\s{1,2})__VERSION_DIGITS__'
family: 'Opera Mobile'
- regex: 'Opera Mobi'
family: 'Opera Mobile'
- regex: '(Opera)/9\.80.{0,300}Version/__VERSION_DIGITS__'
# Opera 14 for Android uses a WebKit render engine.
- regex: '(?:Mobile Safari).{1,300}( OPR)/__VERSION__'
family: 'Opera Mobile'
- regex: '(?:Android).{1,300}( OPR)/__VERSION__'
family: 'Opera Mobile'
# Opera 15 for Desktop is similar to Chrome but includes an "OPR" Version string.
- regex: '(?:Safari|Chrome).{1,300}( OPR)/__VERSION__'
family: 'Opera'
# Opera Neon
- regex: 'Chrome/.{1,300}( MMS)/__VERSION__'
family: 'Opera Neon'
# Opera Coast
- regex: '(Coast)/__VERSION__'
family: 'Opera Coast'
# Opera Mini for iOS (from version 8.0.0)
- regex: '(OPiOS)/__VERSION__'
family: 'Opera Mini'
# Palm WebOS looks a lot like Safari.
- regex: '(hpw|web)OS/__VERSION__'
family: 'webOS Browser'
# LuaKit has no version info.
# ref: http://luakit.org/projects/luakit/
- regex: '(luakit)'
family: 'LuaKit'
# Rekonq
- regex: '(rekonq)(?:/__VERSION__ Safari|)'
family: 'Rekonq'
# Conkeror lowercase/uppercase
# ref: http://conkeror.org/
- regex: '([Cc]onkeror)/__VERSION__'
family: 'Conkeror'
# catches lower case konqueror
- regex: '([Kk]onqueror)/__VERSION__'
family: 'Konqueror'
- regex: '(WeTab)-Browser'
- regex: '(Comodo[ _]Dragon)/__VERSION__'
family: 'Comodo Dragon'
- regex: '(Symphony) (\d{1,10})\.(\d{1,10})'
# Yandex Browser
- regex: '(YaBrowser)/__VERSION__'
family: 'Yandex Browser'
- regex: '(2345Explorer|2345chrome)(?:[ /]| v)__VERSION__'
family: 2345Explorer
- regex: '(NetFront NX) __VERSION__'
family: 'NetFront NX'
- regex: '(Nintendo Switch.{1,300}? NF)(?:/__VERSION__|)'
family: 'NetFront NF'
# PlayStation Vita should go before Amazon Silk
- regex: '(PLAYSTATION 3.{1,300}WebKit|Nintendo 3DS|PlayStation Vita|AppleWebKit.{1,300} NX)(?:/__VERSION__|)'
family: 'NetFront NX'
- regex: '(PlayStation 4) __VERSION__'
family: 'PlayStation Browser'
# Amazon Silk, should go before Chrome Mobile and Safari
- regex: '(Silk)/(\d{1,10})\.(\d{1,10})(?:\.([0-9\-]{1,111})|)'
family: 'Amazon Silk'
# Coc Coc browser, based on Chrome (used in Vietnam)
- regex: '(coc_coc_browser|CoRom)/(\d{1,10})\.(\d{1,10})(?:\.(\d{1,10})|)'
family: 'Coc Coc'
# Edge Mobile
- regex: 'Windows Phone .{0,200}(Edge)/(\d{1,10})\.(\d{1,10})'
family: 'Edge Mobile'
- regex: '\b(GSA|Listia|Flipboard)/__VERSION__'
type: 'app'
# HbbTV Group
- regex: 'HbbTV'
group:
- regex: '(Web0S); Linux/SmartTV'
family: 'LG Browser'
- regex: '(Samsung;SmartTV)__VERSION__'
family: 'Samsung SmartTV'
- regex: '(Panasonic;VIERA )__VERSION__'
family: 'SmartViera'
- regex: 'Panasonic;(DIGA WebKit) M__VERSION__'
- regex: '(Skykid)/__VERSION__'
# QQ Browsers
- regex: 'QQBrowser'
group:
- regex: '(MQQBrowser/Mini)(?:__VERSION__|)'
family: 'QQ Browser Mini'
- regex: '(MQQBrowser)(?:/__VERSION__|)'
family: 'QQ Browser Mobile'
- regex: '(QQBrowser)(?:/__VERSION__|)'
family: 'QQ Browser'
# Edge
- regex: '\b(EdgA|EdgiOS)/__VERSION__'
family: 'Edge'
# Partly Chrome Based Browsers
- regex: '\b(baidubrowser|BaiduHD|Focus|OculusBrowser|SamsungBrowser)/__VERSION__'
- regex: '\bbd(browser_i18n|browserhd_i18n|browser_mini)/__VERSION__'
family: 'baidu$1'
- regex: '(MAXTHON|Maxthon|MxBrowser)[ /]__VERSION__'
family: 'Maxthon'
- regex: '(ACHEETAHI)[ /]__VERSION__'
family: 'CM Browser'
# Seznam.cz browser (based on WebKit)
- regex: '(SznProhlizec)/__VERSION__'
family: 'Seznam.cz'
# Chrome Mobile - Chrome based
- regex: 'CrMo|CriOS|Chrom|chromeframe'
group:
- regex: '\b(MiuiBrowser|Mint Browser)/__VERSION__'
# Headless Chrome
# https://chromium.googlesource.com/chromium/src/{1,111}/lkgr/headless/README.md
- regex: '(HeadlessChrome)(?:/(\d{1,10})\.(\d{1,10})\.?(\d{1,10}|)|)'
type: 'headless'
- regex: ' (Nichrome)/self/(\d{1,10})'
# Chrome Based Browsers
- regex: "\\b(\
AlohaBrowser|\
Beamrise|\
BlueBrowser|\
Chedot|\
Chromium|\
Crosswalk|\
Diglo|\
Maxthon|\
Mb2345Browser|\
MobileIron|\
MxNitro|\
OverwolfClient|\
Polarity|\
Puffin|\
Qiyu|\
SamsungBrowser/CrossApp|\
SogouMobileBrowser|\
Superbird|\
SurfBrowser|\
Tenta|\
Whale|\
WhiteHat Aviator\
)/__VERSION__"
# IE Mobile - strange MS ua contains Chrome
- regex: '(IEMobile)/__VERSION__'
family: 'IE Mobile'
- regex: '(CrMo)/__VERSION__'
family: 'Chrome Mobile'
- regex: '(CriOS)/__VERSION__'
family: 'Chrome Mobile iOS'
- regex: '; wv\).{1,300}(Chrome)/__VERSION__.{1,300}\bMobile\b'
family: 'Chrome Mobile Webview'
- regex: '\b(Chrome)/__VERSION__.{1,300}\bMobile\b'
family: 'Chrome Mobile'
- regex: '\bMobile\b.{1,300}(Chrome)/__VERSION__'
family: 'Chrome Mobile'
# Chrome Frame must come before MSIE.
- regex: '(chromeframe)/__VERSION__'
family: 'Chrome Frame'
# Mail.ru Amigo/Internet Browser (Chromium-based)
- regex: '(Chrome)/__VERSION__.{0,100} MRCHROME'
family: 'Mail.ru Chromium Browser'
# Iron Browser ~since version 50
- regex: '(Chrome)/__VERSION__[\d.]{0,100} Iron[^/]'
family: 'Iron'
# Chrome based
- regex: '\b(Chrome)\/__VERSION__.{0,100}\b(JuziBrowser|Salam Browser)\b'
family: '$5'
- regex: '\b(Chedot)\b.{0,100}\bChrome\/__VERSION__'
family: '$1'
# Tizen Browser (second case included in browser/major.minor regex)
- regex: '(Tizen|SLP) Browser/__VERSION__'
family: 'Tizen Browser'
# Sogou Explorer 2.X
- regex: '(SE 2\.X) MetaSr __VERSION__'
family: 'Sogou Explorer'
# Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
- regex: '(FlyFlow)/__VERSION__'
family: 'Baidu Explorer'
# Baidu Spark
- regex: '((?:BD|)Spark|BIDUBrowser)[ /]__VERSION__'
family: 'Baidu Spark'
# AOL Browser
- regex: '(AOL)[/ ](\d{1,10})\.(\d{1,10});? AOL(?:Build|BUILD)[ /]\d{1,10}'
- regex: '(ADM)/'
family: 'AOL'
# OmniWeb
- regex: '(OmniWeb)/v?__VERSION__'
# Netscape
- regex: '\b(Navigator|Netscape6)/(\d{1,10})(?:\.(\d{1,10})(?:\.?([ab]?\d{1,10}[a-z]{0,33})|)|)'
family: 'Netscape'
# Windows 10 IE version uses "Edge" and "Chrome"
- regex: '\b(Edge)/(\d{1,10})(?:\.(\d{1,10})|)'
family: 'Edge'
# iOS Versions of Browsers
- regex: '(Mercury|Puffin)/(\d{3,5})'
# no version
- regex: '\b(JuziBrowser)\b'
# Browser/major_version.minor_version(.beta_version)
# @note: Phoenix needs separate regex as conflicts with device "Fly Phoenix 2"
- regex: '(Phoenix)/__VERSION__'
# @note ArcGis
- regex: 'ArcGIS|QGIS|JOSM|GeoEvent Server|FME'
group:
# ESRI Server products
- regex: '(GeoEvent Server) (\d{1,111})(?:\.(\d{1,111})(?:\.(\d{1,111})|)|)'
# ESRI ArcGIS Desktop Products
- regex: '(ArcGIS Pro)(?: (\d{1,111})\.(\d{1,111})\.([^ ]{1,111})|)'
- regex: 'ArcGIS Client Using WinInet'
family: 'ArcMap'
- regex: '(OperationsDashboard)-(?:Windows)-__VERSION_3_DIGITS__'
family: 'Operations Dashboard for ArcGIS'
- regex: '(arcgisearth)/__VERSION_2_DIGITS__'
family: 'ArcGIS Earth'
- regex: 'com.esri.(earth).phone/__VERSION_2_DIGITS__'
family: 'ArcGIS Earth'
# ESRI ArcGIS Mobile Products
- regex: '(arcgis-explorer)/__VERSION_3_DIGITS__'
family: 'Explorer for ArcGIS'
- regex: 'arcgis-(collector|aurora)/__VERSION_3_DIGITS__'
family: 'Collector for ArcGIS'
- regex: '(arcgis-workforce)/__VERSION_3_DIGITS__'
family: 'Workforce for ArcGIS'
- regex: '(Collector|Explorer|Workforce)-(?:Android|iOS)-__VERSION_2_DIGITS__'
family: '$1 for ArcGIS'
# ESRI ArcGIS Runtimes
- regex: 'ArcGISRuntime-(Android|iOS|NET|Qt)/__VERSION_2_DIGITS__'
family: 'ArcGIS Runtime SDK for $1'
- regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)__VERSION_2_DIGITS__'
family: 'ArcGIS Runtime SDK for $1'
- regex: 'ArcGIS\.Runtime\.(Qt)\.__VERSION_2_DIGITS__'
family: 'ArcGIS Runtime SDK for $1'
# SAFE FME
- regex: '(FME)\/(\d{1,111}\.\d{1,111})\.(\d{1,111})\.(\d{1,111})'
# QGIS
- regex: '(QGIS)\/(\d)\.?0?(\d{1,2})\.?0?(\d{1,2})'
# JOSM
- regex: '(JOSM)/(\d{1,111})\.(\d{1,111})'
# Other browsers
- regex: "(\
115Browser|\
1stBrowser|\
7Star|\
Abrowser|\
amaya|\
Amiga-AWeb|\
AmigaVoyager|\
ANTFresco|\
ANTGalio|\
Arora|\
AviraScout|\
BlackHawk|\
Bolt|\
BOLT|\
brave|\
Bunjalloo|\
Cent|\
Chedot|\
ChromePlus|\
Contiki|\
CoolNovo|\
Crazy Browser|\
Demeter|\
Dillo|\
Dolfin|\
Dolphin http client|\
Dorado WAP-Browser|\
Dragon|\
Electron|\
Epiphany|\
Espial|\
EspialTVBrowser|\
Fennec|\
FireWeb|\
Fluid|\
Fresco|\
Galeon|\
Google Earth(?: EC|)|\
hdplusinteraktiv|\
HotJava|\
IBrowse|\
iCab|\
Iceape|\
ICE Browser|\
IceCat|\
Ice[Ww]easel|\
iRider|\
Iris|\
Iron|\
Jasmine|\
Kapiko|\
Kazehakase|\
Kindle|\
Kinza|\
K-Meleon|\
Kuaiso|\
LG Browser|\
Lobo|\
Lunascape|\
Lynx|\
MacAppStore|\
Maemo Browser|\
mDolphin|\
Mercury|\
Midori|\
MiniBrowserMobile|\
Minimo|\
MiuiBrowser|\
MobileIron|\
mogimogi|\
Net[Ff]ront|\
NetFrontLifeBrowser|\
NetPositive|\
Netscape|\
NetSurf|\
NTENTBrowser|\
OmniWeb|\
OneBrowser|\
Opera|\
Opera Mini|\
Orca|\
Otter|\
PaleMoon|\
Planetweb|\
Polaris|\
Puffin|\
PyAMF|\
QtWebkit|\
Qt|\
QuickLook|\
QupZilla|\
qutebrowser|\
Raven for Mac|\
Roccat|\
RockMelt|\
SailfishBrowser|\
SalesforceMobileSDK|\
SeaMonkey|\
SecondLife|\
Seznam\\.cz|\
Shiira|\
Shrook|\
SkipStone|\
Skyfire|\
Sleipnir|\
Slimjet|\
Snowshoe|\
SogouMobileBrowser|\
Space Bison|\
SputnikBrowser|\
Stainless|\
Sunrise|\
SunriseBrowser|\
ThunderBrowse|\
TinyBrowser|\
TizenBrowser|\
ToshibaTP|\
TungstenBrowser|\
UP\\.Browser|\
Valve (?:Client|Steam \\w{1,111})|\
Vienna|\
Viera|\
Vivaldi|\
WebPilot|\
WebPirate|\
WebPositive|\
Whale|\
YoloBrowser|\
Xiino|\
zdesktop\
)[/ ]__VERSION_DIGITS__"
# VmWare Airwatch
- regex: '(AirWatch Browser) v__VERSION__'
# Browser without version
- regex: '(QIHU 360[SE]E|Sunrise|DiigoBrowser)'
# Chrome needs to come after as it hides a lot of browsers from previous regex
- regex: '(Chrome)[/ ]__VERSION__'
- regex: '(Galeon|UP\.Browser)(?:[ /]__VERSION__|)'
- regex: '(Openwave)(?:/__VERSION__|)'
family: 'UP.Browser'
# Dolphin Browser
# @ref: http://www.dolphin.com
- regex: '\b(Dolphin)(?: |/|HDCN/|/INT\-)__VERSION__'
# @note: NexPlayer needs to come after "Dolfin" as part of Samsung Bada UAs
- regex: '\b(stagefright)/__VERSION_DIGITS__'
type: 'mediaplayer'
- regex: '\b(NexPlayer)(?:[ /]?__VERSION__|)'
type: 'mediaplayer'
# IE Xbox
# @ref: http://msdn.microsoft.com/en-us/library/ie/jj883727%28v=vs.85%29.aspx
- regex: '(MSIE) __VERSION__.{0,100}Xbox[^\-]'
family: 'IE Xbox'
# IE Mobile
- regex: '(IEMobile)[ /]__VERSION__'
family: 'IE Mobile'
# desktop mode
# http://www.anandtech.com/show/3982/windows-phone-7-review
- regex: '(MSIE) __VERSION__.{0,100}XBLWP7'
family: 'IE Large Screen'
#### END MAIN CASES ####
#### SPECIAL CASES ####
- regex: '(Obigo|OBIGO|Teleca)(?:InternetBrowser|\-?Browser|)(?:[^\d]{0,33}0{0,33}(\d{1,10})(?:.(\d{1,10})|)|)'
family: 'Obigo'
- regex: '(Maxthon|MyIE2|Uzbl|Shiira)'
v1: '0'
- regex: '(PLAYSTATION 3|PlayStation Portable)'
family: 'NetFront'
- regex: '(XBMC)/(\d{1,10})\.(\d{1,10})[-\w\s]{1,111}(r\d{1,10})'
- regex: '(ABrowse) (\d{1,10})(?:\.(\d{1,10})|)'
- regex: '(Acoo Browser)(?: __VERSION__|)'
- regex: '(BrowseX) \(__VERSION__'
- regex: '(NCSA[ _]Mosaic)(?:/(\d{1,10})[.-](\d{1,10})(?:[.-]?([a-z]?\d{1,10})|)|)'
family: 'NCSA Mosaic'
# Polaris/d.d is above
- regex: '(POLARIS|Embider)/(\d{1,10})\.(\d{1,10})'
family: 'Polaris'
- regex: '(AvantGo) (\d{1,10})\.(\d{1,10})'
- regex: '(Avant)'
v1: '1'
# This is the Tesla Model S (see similar entry in device parsers)
- regex: '(QtCarBrowser)'
v1: '1'
- regex: 'ibrowse|iRAPP'
regex_flag: 'i'
group:
- regex: '^(iBrowser/Mini)(\d{1,10})\.(\d{1,10})'
family: 'iBrowser Mini'
- regex: '^(iBrowser|iRAPP)/(\d{1,10})\.(\d{1,10})'
- regex: '\b(IBrowse)(?:[ /](\d{1,10})\.(\d{1,10})|)'
# nokia browsers
# based on: http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
- regex: 'Series\d|Nokia|OviBrowser|BrowserNG'
group:
- regex: '(NokiaBrowser|BrowserNG)/(\d{1,10})\.__VERSION__'
family: 'Nokia Browser'
- regex: 'Symbian.{0,300}(Series60)/5\.0'
family: 'Nokia Browser'
v1: '7'
v2: '0'
- regex: '(S40OviBrowser)/__VERSION__(?:\.(\d{1,10})|)'
family: 'Ovi Browser'
- regex: '(Series60)/(\d{1,10})\.(\d{1,10}).{0,300}AppleWebKit'
family: 'Nokia OSS Browser'
- regex: '(Series60)/(\d{1,10})\.(\d{1,10})'
family: 'Nokia Services (WAP) Browser'
- regex: '^(Nokia)'
family: 'Nokia Services (WAP) Browser'
- regex: '(Series80|Series90)/(\d)\.(\d)'
family: 'Nokia $1 Browser'
# BlackBerry devices
- regex: '(PlayBook).{1,300}RIM Tablet OS __VERSION__'
family: 'BlackBerry WebKit'
- regex: '(Black[bB]erry|BB10).{1,300}Version/__VERSION__'
family: 'BlackBerry WebKit'
- regex: '(Black[bB]erry)\s?(\d{1,10})'
family: 'BlackBerry'
# Palm
- regex: 'Palm.{0,300}\b(Pre|Blazer|WebPro)\b(?:[ /](\d{1,10})(?:\.(\d{1,10})(?:\.(\d{1,10}[a-z]{0,33})|)|)|)'
family: 'Palm $1'
# Links/ Elinks
- regex: '\b(E?[Ll]inks)(?: \(|\/)__VERSION__'
- regex: '(QtWeb) Internet Browser/(\d{1,10})\.(\d{1,10})'
# Phantomjs, should go before Safari
- regex: '(PhantomJS|CocoonJS)/__VERSION__'
type: 'headless'
# AppleWebKit / WebKit Nightly
- regex: '(AppleWebKit)/(\d{1,10})\.?(\d{1,10}|)\+ .{0,100} Safari'
family: 'AppleWebKit'
- regex: '(Callpod Keeper) for Android __VERSION__'
type: 'app'
# Browser major_version.minor_version (space instead of slash)
- regex: '(Android) __VERSION__'
- regex: '(Odyssey Web Browser); rv:__VERSION__'
# iOS
- regex: '(iPod|iPhone|iPad|watchOS)'
group:
# @ref http://stackoverflow.com/questions/2143763/
- regex: '\b(GSA)/__VERSION__'
family: 'Google App'
- regex: '\b(bline|DaumApps)/__VERSION__'
family: '$1'
type: 'app'
- regex: '(?:iPod|iPhone|iPad).{1,200}Version/.{1,200}(MXiOS)/__VERSION__'
family: 'Maxthon Mobile Safari'
- regex: '(iPod|iPhone|iPad).{1,200}Version/__VERSION_2_DIGITS__.{0,200}[ +]Safari'
family: 'Mobile Safari'
- regex: '(?:iPod|iPhone|iPad).{1,200}?\b(AppleNews|News).{1,200}?Version/__VERSION_2_DIGITS__'
family: 'AppleNews'
type: 'app'
- regex: '(?:iPod|iPhone|iPad).{1,200}?\b(Mobicip).{1,200}?Version/__VERSION_2_DIGITS__'
family: 'AppleNews'
type: 'app'
- regex: '(iPod|iPhone|iPad).{1,200}Version/__VERSION_2_DIGITS__'
family: 'Mobile Safari UI/WKWebView'
type: 'app'
- regex: '(iPod|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +]__VERSION_DIGITS_UNDERSCORE__.{0,200}Mobile.{0,30}[ +]Safari'
family: 'Mobile Safari'
- regex: '(iPod|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +]__VERSION_DIGITS_UNDERSCORE__.{0,200}Mobile'
family: 'Mobile Safari UI/WKWebView'
type: 'app'
- regex: '(iPod|iPhone|iPad).{0,300}[ +]Safari'
family: 'Mobile Safari'
- regex: '(iPod|iPhone|iPad)'
family: 'Mobile Safari UI/WKWebView'
type: 'app'
- regex: 'watchOS.{0,300}(Watch)(\d{1,10}),(\d{1,10})'
family: 'Apple $1 App'
type: 'app'
# Safari
- regex: '(Version)/__VERSION__.{0,100}Safari/'
family: 'Safari'
# Safari didn't provide "Version/d.d.d" prior to 3.0
- regex: '(Safari)/\d{1,10}'
- regex: '(OLPC)/Update(\d{1,10})\.(\d{1,10})'
- regex: '(OLPC)/Update()\.(\d{1,10})'
v1: '0'
- regex: '(SEMC\-Browser)/(?:__VERSION__|)'
- regex: 'Trident(.{0,300})rv:(\d{1,10})\.(\d{1,10})'
family: 'IE'
# AFTER THE EDGE CASES ABOVE!
# AFTER IE11
# BEFORE all other IE
- regex: 'rv: ?(\d{1,10})\.(\d{1,10})\).{0,300}(Firefox)/[A-F0-9]{4}'
family: '$3'
v1: '$1'
v2: '$2'
v3: ''
- regex: '(Firefox)/(\d{1,10})(?:\.(\d{1,10})(?:\.?(pre|[ab]?\d{1,10}[a-z]{0,33})|)|)'
# Internet Explorer
- regex: '(TeomaBar) (\d{1,10})\.0?(\d{1,10})'
- regex: '(?:MS|)(IE)[ /](\d{1,10})\.(\d{1,10})'
# AppleWebKit / WebKit Nightly
- regex: '(AppleWebKit)/__VERSION__'
family: 'AppleWebKit'
# ViaFree streaming app https://www.viafree.{dk|se|no}
- regex: '^(ViaFree|Viafree)-(?:tvOS-|)[A-Z]{2}/__VERSION_DIGITS__'
family: 'ViaFree'
type: app
- regex: '(OC)/__VERSION__\.\d{1,10} \(Skype for Business\)'
family: 'Skype'
# headless agents
- regex: '(Phantom)/V(\d{1,10})\.(\d{1,10})'
family: 'Phantom Browser'
type: 'headless'
- regex: '(?:^|^Mozilla/\d{1,10}\.\d{1,10} (?:\([^\)]{1,111}\) |))(Java)[ /]?__VERSION__'
type: 'headless'
- regex: "\\b(\
akka-http|\
axios|\
aiohttp|\
Apache-Http(?:Async|)Client|\
BitTorrent|\
curl|\
fetch libfetch|\
Ghost|\
got|\
Go-http-client|\
HTMLParser|\
HTTrack|\
Jakarta Commons-HttpClient|\
jupdate|\
libcurl-agent|\
libwww-perl|\
lua-resty-http|\
lwp-trivial|\
Microsoft-CryptoAPI|\
Microsoft SkyDriveSync|\
node-superagent|\
okhttp|\
OpenBSD ftp|\
PHP|\
[Pp]ython-[^/]{1,111}|\
PycURL|\
restify|\
SophosAgent|\
SophosUpdateManager|\
urlgrabber|\
unirest-(?:java|python|ruby|nodejs|php|net)|\
(?:\\w{1,111}) APT-HTTP|\
Wget|\
Zend_Http_Client\
)\\b(?:[ /]__VERSION__|)"
type: 'headless'
# Storage Clients
- regex: "\\b(\
ibm-cos-sdk-(?:core|java|js|python)|\
S3 Browser|\
S3Gof3r|\
rusoto|\
rclone\
)\\b(?:[ /]__VERSION__|)"
type: 'storage'
# Proxy
- regex: '\b(Hatena-Mobile-Gateway|Privoxy)/__VERSION__'
type: 'proxy'
- regex: '\b(Synapse)'
type: 'proxy'
# generic catcher for bots
- regex: '(binlar|lbot|visionutils|WebThumb)[_/]__VERSION__'
type: 'bot'
- regex: 'https?://((?:[\w\d-]{1,111}\.|)[\w\d-]{1,111}\.\w{1,111})'
type: 'bot'
- regex: 'Mozilla/[45]\.0 \(compatible;?\)'
family: compatible
type: 'bot'
#### Engine ####
engine_parsers:
# MSIE compatibility modes
- regex: 'Trident'
group:
# MSIE 8 !== Trident/4
- regex: 'MSIE ([^8])\.\d.{0,300} (Trident)[ /](4)\.(\d{1,10})(?:\.(\d{1,10})|)'
family: '$2'
v1: '$3'
v2: '$4'
v3: '$5'
type: 'mode::MSIE $1'
# MSIE 9 !== Trident/5
- regex: 'MSIE ([^9])\.\d.{0,300} (Trident)[ /](5)\.(\d{1,10})(?:\.(\d{1,10})|)'
family: '$2'
v1: '$3'
v2: '$4'
v3: '$5'
type: 'mode::MSIE $1'
# MSIE 10 !== Trident/6
- regex: 'MSIE ((?:(?!10)\d){1,111})\.\d.{0,300} (Trident)[ /](6)\.(\d{1,10})(?:\.(\d{1,10})|)'
family: '$2'
v1: '$3'
v2: '$4'
v3: '$5'
type: 'mode::MSIE $1'
# MSIE 11 !== Trident/7
- regex: 'MSIE ((?:(?!11)\d){1,111})\.\d.{0,300} (Trident)[ /](7)\.(\d{1,10})(?:\.(\d{1,10})|)'
family: '$2'
v1: '$3'
v2: '$4'
v3: '$5'
type: 'mode::MSIE $1'
- regex: '(Trident|Presto)[ /]__VERSION__'
- regex: 'Opera'
family: 'Presto'
# Windows 10 IE version uses "Edge" and "Chrome"
- regex: '\b(Edge)/(\d{1,10})(?:\.(\d{1,10})|)'
family: 'EdgeHTML'
# Edge for Android / iOS
- regex: '\b(EdgA|EdgiOS)/__VERSION__'
family: 'EdgeHTML'
- regex: 'QtWebEngine/__VERSION__'
family: 'Blink'
type: 'QtWebEngine'
- regex: '(Chrome)[/](\d{1,10})\.__VERSION__.{0,300}OPR/\d{1,10}'
family: 'Blink'
type: 'Opera'
- regex: 'SamsungBrowser[/].{0,300}(Chrome)[/]__VERSION__'
family: 'Blink'
type: 'Samsung'
- regex: 'Silk[/].{0,300}(Chrome)[/]__VERSION__'
family: 'Blink'
type: 'Silk'
# https://developer.chrome.com/multidevice/user-agent
- regex: '(?:; wv\) |)AppleWeb[Kk]it/.{0,300}Version/.{0,300}(Chrome)[/]__VERSION__'
family: 'Blink'
type: 'WebView'
- regex: '(Chrome)[/]__VERSION__'
family: 'Blink'
- regex: '(HeadlessChrome)'
family: 'Blink'
- regex: '(TDEHTML)/__VERSION__'
family: 'TDEHTML'
- regex: '(KHTML|Konqueror)/__VERSION__'
family: 'KHTML'
# http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
- regex: '(Silk)/__VERSION__'
family: 'Webkit'
type: 'Silk'
- regex: 'Web[Kk]it.{0,300}(NokiaBrowser|BrowserNG)/__VERSION__'
family: 'Webkit'
type: 'Nokia'
- regex: '^Mozilla.{0,300}Android\b.{0,300}SAMSUNG.{0,300}(AppleWeb[Kk]it)/?__VERSION__'
family: 'Webkit'
type: 'Samsung'
- regex: 'Android\b.{0,300}(AppleWeb[Kk]it)/?__VERSION__'
family: 'Webkit'
type: 'Android'
- regex: 'DirectFB\b.{0,300}(AppleWeb[Kk]it)/?__VERSION__'
family: 'Webkit'
type: 'LG'
- regex: '(AppleWeb[Kk]it)/?__VERSION__.{0,300}\b(NetCast|LG Browser)'
family: 'Webkit'
type: 'LG'
- regex: 'Smart-?TV\b.{0,300}(AppleWeb[Kk]it)/?__VERSION__'
family: 'Webkit'
type: 'Samsung'
- regex: '(Goanna)/.{0,300}PaleMoon/__VERSION__'
- regex: '(rv:)(\d{1,10})\.(\d{1,10}[ab]?)\.?([ab]?\d{1,10}[a-z]{0,5}|)\.?(\d{1,10}[a-z]{0,5}|)[;\)].{0,300} Gecko(?:[ /]|$)'
family: 'Gecko'
- regex: '(Gecko)/20\d{6}'
- regex: '(AppleWeb[Kk]it)(?:/__VERSION__|[ ,]|$)'
family: 'Webkit'
type: 'Apple'
- regex: '(Web[Kk]it)(?:/__VERSION__|[ ,]|$)'
family: 'Webkit'
- regex: '(Net[Ff]ront)[ /]?__VERSION__'
family: 'Netfront'
- regex: '(UCBrowser)/__VERSION__'
#### OS ####
os_parsers:
- regex: 'UCWEB|JUC'
group:
# UCWEB
- regex: '^UCWEB.{0,300}; (Adr) (\d{1,10})\.(\d{1,10})(?:[.\-]([a-z0-9]{1,50})|);'
family: 'Android'
- regex: '^UCWEB.{0,300}; (iPa?d|iPh) OS __VERSION_OS_UNDERSCORE__;'
family: 'iOS'
- regex: '^UCWEB.{0,300}; (wds) __VERSION__;'
family: 'Windows Phone'
# JUC
- regex: '^(JUC).{0,300}; ?U; ?(?:Android|)(\d{1,10})\.(\d{1,10})(?:[\.\-]([a-z0-9]{1,50})|)'
family: 'Android'
##########
# Chrome OS
# if version 0.0.0, probably this stuff:
# http://code.google.com/p/chromium-os/issues/detail?id=11573
# http://code.google.com/p/chromium-os/issues/detail?id=13790
##########
- regex: 'CrOS|CitrixChromeApp'
group:
- regex: '(CrOS) [a-z0-9_]{1,50} __VERSION__'
family: 'Chrome OS'
# Citrix Chrome App on Chrome OS
- regex: '(x86_64|aarch64) __VERSION_DIGITS__.{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
family: 'Chrome OS'
##########
# Windows
# http://en.wikipedia.org/wiki/Windows_NT#Releases
# possibility of false positive when different marketing names share same NT kernel
# e.g. windows server 2003 and windows xp
# lots of ua strings have Windows NT 4.1 !?!?!?!? !?!? !? !????!?! !!! ??? !?!?! ?
# (very) roughly ordered in terms of frequency of occurence of regex (win xp currently most frequent, etc)
##########
- regex: 'Win|CYGWIN'
group:
# @note: Xbox also spoofs NT 6.1/Windows Phone (see http://msdn.microsoft.com/en-us/library/ie/jj883728(v=vs.85).aspx)
# @note: Xbox spoofs "Xbox LIVE/2.5.1704 CFNetwork/672.0.8 /14.0.0" iPhone App
- regex: '\b(Xbox)\b(?:(?!Darwin).){0,100}$'
# ie mobile desktop mode
# spoofs nt 6.1. must come before windows 7
- regex: '(XBLWP7)'
family: 'Windows Phone'
# @note: These need to come before Windows NT 6.1
- regex: '(Windows Phone) (?:OS[ /]|)(\d{1,10})\.(\d{1,10})'
- regex: '(Windows ?Mobile)'
family: 'Windows Mobile'
- regex: '(Windows ?CE)'
family: 'Windows CE'
- regex: '(Windows NT 6\.4)'
family: 'Windows 10'
- regex: '(Windows NT 10\.0|Windows 10\.0)'
family: 'Windows 10'
- regex: '(Windows NT 6\.3; ARM;)'
family: 'Windows RT 8.1'
- regex: '(Windows NT 6\.3|CYGWIN_NT-6\.3|Windows 8\.1)'
family: 'Windows 8.1'
- regex: '(Windows NT 6\.2; ARM;)'
family: 'Windows RT'
- regex: