user_agent_parser 2.17.0 → 2.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/vendor/uap-core/regexes.yaml +257 -44
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdc5b924cd5f11fa40712079c1bfa1aeed05171fcfe764293891d5692c0279c2
4
- data.tar.gz: fc490168e565d73ad85f278780536641ce519a1b45ab9a52391b85d33c45b171
3
+ metadata.gz: 4f3568ed026aa06885cc1d67ea64e40fb8e7de10e7c35498fea51d4a25f4f77e
4
+ data.tar.gz: f2f1fd7c123a683e324493668fb8ea62f89c6dfd49f7ccca86f3e4df1e8fce7a
5
5
  SHA512:
6
- metadata.gz: f6cbf21d3149089e420a32e2f97f205eac6ef6189767bd3b28e42f9c9189dbbcf46c83b02ebaad5916d621a1494e4300339bfc8e2da688c7017a810cab6430a2
7
- data.tar.gz: 967b44d72866580bbc24dcd772547e53b13def915207c3848c68035d07a621ffec3bd4da76e95218fe1639316cca3458b89206dd19a1e90b497d2cc5a3957a3a
6
+ metadata.gz: a848c7cab20b8e1e7ddbd6daba28e7b62b2cec8f6981f3a8e182a13860322994b5d12caa9c84f523665672ddc144d735607f9e7b97c8ae8532f9dc8b92241ac2
7
+ data.tar.gz: f08d60621c439105147f86698f7c45b16d92bbd39c651dbf1effa17dc9bade307a87fc7eaefa4a43452dd528817c0077356e568837f859a68968d8dfcdd5ef8c
@@ -148,11 +148,11 @@ user_agent_parsers:
148
148
  family_replacement: 'Pinterestbot'
149
149
 
150
150
  # Bots
151
- - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
151
+ - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|GoogleOther|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer|GPTBot|Google-InspectionTool)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
152
152
 
153
153
  # AWS S3 Clients
154
154
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
155
- - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
155
+ - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|go-v\d|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
156
156
 
157
157
  # SAFE FME
158
158
  - regex: '(FME)\/(\d+\.\d+)\.(\d+)\.(\d+)'
@@ -179,6 +179,9 @@ user_agent_parsers:
179
179
  - regex: '\[FB.{0,300};'
180
180
  family_replacement: 'Facebook'
181
181
 
182
+ # RecipeRadar crawler
183
+ - regex: '(RecipeRadar)/(\d+)\.(\d+)(?:\.(\d+)|)'
184
+
182
185
  # Bots General matcher 'name/0.0'
183
186
  - regex: '^.{0,200}?(?:\/[A-Za-z0-9\.]{0,50}|) {0,2}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
184
187
  # Bots containing bot(but not CUBOT)
@@ -215,6 +218,16 @@ user_agent_parsers:
215
218
  # Twitter
216
219
  - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
217
220
  family_replacement: 'Twitter'
221
+ # TikTok
222
+ - regex: '(musical_ly) app_version\/(\d+)\.(\d+)\.(\d+)'
223
+ family_replacement: 'TikTok'
224
+ - regex: '(musical_ly_)(\d+)\.(\d+)\.(\d+)'
225
+ family_replacement: 'TikTok'
226
+ - regex: '(BytedanceWebview)\/[a-z0-9]+'
227
+ family_replacement: 'TikTok'
228
+ # KakaoTalk
229
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(KAKAOTALK)/(\d+)\.(\d+)\.(\d+)'
230
+ family_replacement: 'KakaoTalk'
218
231
 
219
232
  # Phantom app
220
233
  - regex: 'Mozilla.{1,200}Mobile.{1,100}(Phantom\/ios|Phantom\/android).(\d+)\.(\d+)\.(\d+)'
@@ -378,6 +391,29 @@ user_agent_parsers:
378
391
  - regex: '(Nintendo 3DS)'
379
392
  family_replacement: 'NetFront NX'
380
393
 
394
+ # Huawei Browser, should go before Safari and Chrome Mobile
395
+ - regex: '(HuaweiBrowser)/(\d+)\.(\d+)\.(\d+)\.\d+'
396
+ family_replacement: 'Huawei Browser'
397
+
398
+ # AVG
399
+ - regex: '(AVG)/(\d+)\.(\d+)\.(\d+)\.\d+'
400
+ family_replacement: 'AVG'
401
+
402
+ # Avast
403
+ - regex: '(AvastSecureBrowser|Avast)/(\d+)\.(\d+)\.(\d+)'
404
+ family_replacement: 'Avast Secure Browser'
405
+
406
+ # Instabridge
407
+ - regex: '(Instabridge)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
408
+
409
+ # Aloha Browser
410
+ - regex: '(AlohaBrowser|ABB)/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
411
+ family_replacement: 'Aloha Browser'
412
+
413
+ # Brave Browser https://brave.com/ , should go before Safari and Chrome Mobile
414
+ - regex: '((?:B|b)rave(?:\sChrome)?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
415
+ family_replacement: 'Brave'
416
+
381
417
  # Amazon Silk, should go before Safari and Chrome Mobile
382
418
  - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)'
383
419
  family_replacement: 'Amazon Silk'
@@ -392,7 +428,7 @@ user_agent_parsers:
392
428
  family_replacement: 'Edge Mobile'
393
429
 
394
430
  # Oculus Browser, should go before Samsung Internet
395
- - regex: '(OculusBrowser)/(\d+)\.(\d+).0.0(?:\.([0-9\-]+)|)'
431
+ - regex: '(OculusBrowser)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)'
396
432
  family_replacement: 'Oculus Browser'
397
433
 
398
434
  # Samsung Internet (based on Chrome, but lacking some features)
@@ -407,12 +443,6 @@ user_agent_parsers:
407
443
  - regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+)|)'
408
444
  family_replacement: 'Coc Coc'
409
445
 
410
- # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
411
- - regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
412
- family_replacement: 'Baidu Browser'
413
- - regex: '(FlyFlow)/(\d+)\.(\d+)'
414
- family_replacement: 'Baidu Explorer'
415
-
416
446
  # MxBrowser is Maxthon. Must go before Mobile Chrome for Android
417
447
  - regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
418
448
  family_replacement: 'Maxthon'
@@ -441,6 +471,12 @@ user_agent_parsers:
441
471
  - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
442
472
  family_replacement: 'Google'
443
473
 
474
+ # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
475
+ - regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
476
+ family_replacement: 'Baidu Browser'
477
+ - regex: '(FlyFlow|flyflow|baiduboxapp)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
478
+ family_replacement: 'Baidu Explorer'
479
+
444
480
  # QQ Browsers
445
481
  - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
446
482
  family_replacement: 'QQ Browser Mini'
@@ -450,19 +486,38 @@ user_agent_parsers:
450
486
  family_replacement: 'QQ Browser'
451
487
 
452
488
  # DuckDuckGo
453
- - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)'
489
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(DuckDuckGo)/(\d+)'
490
+ family_replacement: 'DuckDuckGo Mobile'
491
+ - regex: 'Mozilla.{1,200}(DuckDuckGo)/(\d+)'
492
+ family_replacement: 'DuckDuckGo'
493
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Ddg)/(\d+)(?:\.(\d+)|)'
454
494
  family_replacement: 'DuckDuckGo Mobile'
495
+ - regex: 'Mozilla.{1,200}(Ddg)/(\d+)(?:\.(\d+)|)'
496
+ family_replacement: 'DuckDuckGo'
455
497
 
456
498
  # Tenta Browser
457
499
  - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
458
500
  family_replacement: 'Tenta Browser'
459
501
 
460
502
  # Ecosia on iOS / Android
461
- - regex: '(Ecosia) ios@(\d+)\.(\d+)\.(\d+)\.(\d+)'
503
+ - regex: '(Ecosia) ios@(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
462
504
  family_replacement: 'Ecosia iOS'
463
- - regex: '(Ecosia) android@(\d+)\.(\d+)\.(\d+)\.(\d+)'
505
+ - regex: '(Ecosia) android@(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
464
506
  family_replacement: 'Ecosia Android'
465
507
 
508
+ # VivoBrowser
509
+ - regex: '(VivoBrowser)\/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
510
+
511
+ # HiBrowser
512
+ - regex: '(HiBrowser)\/v(\d+)\.(\d+)\.(\d+)\.(\d+)'
513
+
514
+ # Weibo
515
+ # Must before Chrome Mobile WebView
516
+ - regex: '(weibo)__(\d+)\.(\d+)\.(\d+)'
517
+ family_replacement: 'Weibo'
518
+ - regex: '(WeiboliteiOS|WeiboIntliOS)'
519
+ family_replacement: 'Weibo'
520
+
466
521
  # Chrome Mobile
467
522
  - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
468
523
  family_replacement: 'Chrome Mobile WebView'
@@ -502,6 +557,8 @@ user_agent_parsers:
502
557
  # Yandex Browser
503
558
  - regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)'
504
559
  family_replacement: 'Yandex Browser'
560
+ - regex: '(YaSearchBrowser)/(\d+)\.(\d+)\.(\d+)'
561
+ family_replacement: 'Yandex Browser'
505
562
 
506
563
  # Mail.ru Amigo/Internet Browser (Chromium-based)
507
564
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
@@ -538,6 +595,89 @@ user_agent_parsers:
538
595
  - regex: '^(surveyon)/(\d+)\.(\d+)\.(\d+)'
539
596
  family_replacement: 'Surveyon'
540
597
 
598
+ # 115 Browser
599
+ - regex: '(115Browser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
600
+ family_replacement: '115 Browser'
601
+
602
+ # Avira
603
+ - regex: '(Avira)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
604
+ family_replacement: 'Avira'
605
+
606
+ # CCleaner Browser
607
+ - regex: '(CCleaner)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
608
+ family_replacement: 'CCleaner'
609
+
610
+ # Norton
611
+ - regex: '(Norton)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
612
+ family_replacement: 'Norton'
613
+
614
+ # Quark
615
+ - regex: '(Quark)/(\d+)\.(\d+)\.(\d+)'
616
+ family_replacement: 'Quark'
617
+ # Quark PC
618
+ - regex: '(QuarkPC)/(\d+)\.(\d+)\.(\d+)'
619
+ family_replacement: 'Quark PC'
620
+
621
+ # Smart Lenovo Browser
622
+ - regex: '(SLBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+) SLBChan/(\d+)'
623
+ family_replacement: 'Smart Lenovo Browser'
624
+
625
+ # Atom Browser
626
+ - regex: '(Atom)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
627
+ family_replacement: 'Atom Browser'
628
+
629
+ # 360 Secure Browser
630
+ - regex: '(Chrome)/\d+\.\d+\.\d+\.\d+ .* QIHU 360(?:SEi18n|ENT)'
631
+ family_replacement: '360 Secure Browser'
632
+
633
+ # Decentr Web3 Browser
634
+ - regex: '(Decentr)'
635
+ family_replacement: 'Decentr Web3 Browser'
636
+
637
+ # Sparrow Browser
638
+ - regex: '(Sparrow)'
639
+ family_replacement: 'Sparrow Browser'
640
+
641
+ # Chromium GOST Browser
642
+ - regex: '(Chromium GOST)'
643
+ family_replacement: 'Chromium GOST Browser'
644
+
645
+ # AOL Shield Browser
646
+ - regex: '(AOLShield)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
647
+ family_replacement: 'AOL Shield Browser'
648
+
649
+ # Hola Browser
650
+ - regex: '(Hola)/(\d+)\.(\d+)\.(\d+)'
651
+ family_replacement: 'Hola Browser'
652
+
653
+ # Craving Explorer Browser
654
+ - regex: '(CravingExplorer)/(\d+)\.(\d+)\.(\d+)'
655
+ family_replacement: 'Craving Explorer Browser'
656
+
657
+ # Talon Cyber Security Browser
658
+ - regex: '(Talon)'
659
+ family_replacement: 'Talon Cyber Security Browser'
660
+
661
+ # QAX Browser
662
+ - regex: '(Qaxbrowser)'
663
+ family_replacement: 'QAX Browser'
664
+
665
+ # AOL Desktop Gold Browser
666
+ - regex: '(ADG)/(\d+)\.(\d+)\.(\d+)'
667
+ family_replacement: 'AOL Desktop Gold Browser'
668
+
669
+ # Sber Browser
670
+ - regex: '(SberBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
671
+ family_replacement: 'Sber Browser'
672
+
673
+ # JiSu Browser
674
+ - regex: '(JiSu)/(\d+)\.(\d+)\.(\d+)'
675
+ family_replacement: 'JiSu Browser'
676
+
677
+ # Wolvic Browser
678
+ - regex: '(Wolvic)/(\d+)\.(\d+)\.(\d+)'
679
+ family_replacement: 'Wolvic Browser'
680
+
541
681
  #### END SPECIAL CASES TOP ####
542
682
 
543
683
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -606,18 +746,14 @@ user_agent_parsers:
606
746
  - regex: 'Superhuman'
607
747
  family_replacement: 'Superhuman'
608
748
 
609
- # Vivaldi uses "Vivaldi"
610
- - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
749
+ # Vivaldi
750
+ - regex: '(Vivaldi)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
611
751
 
612
752
  # Edge/major_version.minor_version
613
753
  # Edge with chromium Edg/major_version.minor_version.patch.minor_patch
614
754
  - regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
615
755
  family_replacement: 'Edge'
616
756
 
617
- # Brave Browser https://brave.com/
618
- - regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome'
619
- family_replacement: 'Brave'
620
-
621
757
  # Iron Browser ~since version 50
622
758
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
623
759
  family_replacement: 'Iron'
@@ -1118,6 +1254,29 @@ os_parsers:
1118
1254
  # Special case for new ArcGIS Mobile products
1119
1255
  - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
1120
1256
 
1257
+ ##########
1258
+ # Chromecast
1259
+ ##########
1260
+ # Ex: Mozilla/5.0 (Linux; Android 12.0; Build/STTL.240206.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.0 Safari/537.36 CrKey/1.56.500000 DeviceType/AndroidTV
1261
+ # These are the newer Android-based "Google TV" Chromecast devices.
1262
+ # Google stopped updating the Chromecast firmware version in these, so they always say CrKey/1.56.500000. Therefore we extract the more useful Android version instead.
1263
+ - regex: '(Android) (\d+)(?:\.(\d+)).*CrKey'
1264
+ os_replacement: 'Chromecast Android'
1265
+
1266
+ # Ex: Mozilla/5.0 (Fuchsia) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 CrKey/1.56.500000
1267
+ # These are some intermediate "Nest Hub" Chromecast devices running Fuchsia.
1268
+ - regex: 'Fuchsia.*(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
1269
+ os_replacement: 'Chromecast Fuchsia'
1270
+
1271
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/SmartSpeaker
1272
+ - regex: 'Linux.*(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|).*DeviceType/SmartSpeaker'
1273
+ os_replacement: 'Chromecast SmartSpeaker'
1274
+
1275
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/Chromecast
1276
+ # These are the oldest Chromecast devices that ran Linux.
1277
+ - regex: 'Linux.*(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
1278
+ os_replacement: 'Chromecast Linux'
1279
+
1121
1280
  ##########
1122
1281
  # Android
1123
1282
  # can actually detect rooted android os. do we care?
@@ -1281,6 +1440,10 @@ os_parsers:
1281
1440
  ##########
1282
1441
  - regex: '(Tizen)[/ ](\d+)\.(\d+)'
1283
1442
 
1443
+ # Chrome and Edge on iOS with desktop mode contains Mac OS X, so it must be before any Mac OS check
1444
+ - regex: 'Intel Mac OS X.+(CriOS|EdgiOS)/\d+'
1445
+ os_replacement: 'iOS'
1446
+
1284
1447
  ##########
1285
1448
  # Mac OS
1286
1449
  # @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
@@ -1334,6 +1497,13 @@ os_parsers:
1334
1497
  - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1335
1498
  os_replacement: 'Mac OS X'
1336
1499
 
1500
+ ##########
1501
+ # Hashicorp API
1502
+ # APN/1.0 HashiCorp/1.0 Terraform/1.8.0 (+https://www.terraform.io) terraform-provider-aws/4.67.0 (+https://registry.terraform.io/providers/hashicorp/aws) aws-sdk-go/1.44.261 (go1.19.8; darwin; arm64)
1503
+ ##########
1504
+ - regex: 'darwin; arm64'
1505
+ os_replacement: 'Mac OS X'
1506
+
1337
1507
  ##########
1338
1508
  # iOS
1339
1509
  # http://en.wikipedia.org/wiki/IOS_version_history
@@ -1618,29 +1788,27 @@ os_parsers:
1618
1788
  - regex: 'CFNetwork/.{0,100} Darwin/(21)\.\d+'
1619
1789
  os_replacement: 'iOS'
1620
1790
  os_v1_replacement: '15'
1621
- - regex: 'CFNetwork/.{0,100} Darwin/22\.0\.\d+'
1791
+ - regex: 'CFNetwork/.{0,100} Darwin/22\.([0-5])\.\d+'
1622
1792
  os_replacement: 'iOS'
1623
1793
  os_v1_replacement: '16'
1624
- os_v2_replacement: '0'
1625
- - regex: 'CFNetwork/.{0,100} Darwin/22\.1\.\d+'
1794
+ os_v2_replacement: '$1'
1795
+ - regex: 'CFNetwork/.{0,100} Darwin/(22)\.\d+'
1626
1796
  os_replacement: 'iOS'
1627
1797
  os_v1_replacement: '16'
1628
- os_v2_replacement: '1'
1629
- - regex: 'CFNetwork/.{0,100} Darwin/22\.2\.\d+'
1798
+ - regex: 'CFNetwork/.{0,100} Darwin/23\.([0-5])\.\d+'
1630
1799
  os_replacement: 'iOS'
1631
- os_v1_replacement: '16'
1632
- os_v2_replacement: '2'
1633
- - regex: 'CFNetwork/.{0,100} Darwin/22\.3\.\d+'
1800
+ os_v1_replacement: '17'
1801
+ os_v2_replacement: '$1'
1802
+ - regex: 'CFNetwork/.{0,100} Darwin/(23)\.\d+'
1634
1803
  os_replacement: 'iOS'
1635
- os_v1_replacement: '16'
1636
- os_v2_replacement: '3'
1637
- - regex: 'CFNetwork/.{0,100} Darwin/22\.4\.\d+'
1804
+ os_v1_replacement: '17'
1805
+ - regex: 'CFNetwork/.{0,100} Darwin/24\.([0-5])\.\d+'
1638
1806
  os_replacement: 'iOS'
1639
- os_v1_replacement: '16'
1640
- os_v2_replacement: '4'
1641
- - regex: 'CFNetwork/.{0,100} Darwin/(22)\.\d+'
1807
+ os_v1_replacement: '18'
1808
+ os_v2_replacement: '$1'
1809
+ - regex: 'CFNetwork/.{0,100} Darwin/(24)\.\d+'
1642
1810
  os_replacement: 'iOS'
1643
- os_v1_replacement: '16'
1811
+ os_v1_replacement: '18'
1644
1812
  - regex: 'CFNetwork/.{0,100} Darwin/'
1645
1813
  os_replacement: 'iOS'
1646
1814
 
@@ -1795,12 +1963,6 @@ os_parsers:
1795
1963
 
1796
1964
  - regex: '(WebTV)/(\d+).(\d+)'
1797
1965
 
1798
- ##########
1799
- # Chromecast
1800
- ##########
1801
- - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
1802
- os_replacement: 'Chromecast'
1803
-
1804
1966
  ##########
1805
1967
  # Misc mobile
1806
1968
  ##########
@@ -1841,13 +2003,28 @@ os_parsers:
1841
2003
  # Roku Digital-Video-Players https://www.roku.com/
1842
2004
  - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
1843
2005
 
2006
+ ##########
2007
+ # Amazon S3 client boto3
2008
+ # Hasicorp API
2009
+ # Boto3/1.28.62 md/Botocore#1.31.62 ua/2.0 os/macos#22.4.0 md/arch#arm64 lang/python#3.11.6 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.31.62
2010
+ # APN/1.0 HashiCorp/1.0 Terraform/1.8.1 (+https://www.terraform.io) terraform-provider-aws/4.67.0 (+https://registry.terraform.io/providers/hashicorp/aws) aws-sdk-go-v2/1.18.0 os/macos lang/go/1.19.8 md/GOOS/darwin md/GOARCH/arm64 api/identitystore/1.16.11
2011
+ ##########
2012
+ - regex: 'os\/macos[#]?(\d*)[.]?(\d*)[.]?(\d*)'
2013
+ os_replacement: 'Mac OS X'
2014
+ os_v1_replacement: '$1'
2015
+ os_v2_replacement: '$2'
2016
+ os_v3_replacement: '$3'
2017
+
2018
+ # Huawei HarmonyOS
2019
+ - regex: '(HarmonyOS)[\s;]+(\d+|)\.?(\d+|)\.?(\d+|)'
2020
+
1844
2021
  device_parsers:
1845
2022
 
1846
2023
  #########
1847
2024
  # Mobile Spiders
1848
2025
  # Catch the mobile crawler before checking for iPhones / Androids.
1849
2026
  #########
1850
- - regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.{0,200}iPhone)'
2027
+ - regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html|Google-InspectionTool)|AdsBot-Google-Mobile.{0,200}iPhone)'
1851
2028
  regex_flag: 'i'
1852
2029
  device_replacement: 'Spider'
1853
2030
  brand_replacement: 'Spider'
@@ -2434,6 +2611,39 @@ device_parsers:
2434
2611
  brand_replacement: 'ChangJia'
2435
2612
  model_replacement: '$1'
2436
2613
 
2614
+ ##########
2615
+ # Chromecast
2616
+ # @ref: https://en.wikipedia.org/wiki/Chromecast#Hardware_and_design
2617
+ ##########
2618
+ # Ex: Mozilla/5.0 (Linux; Android 12.0; Build/STTL.240206.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.0 Safari/537.36 CrKey/1.56.500000 DeviceType/AndroidTV
2619
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/SmartSpeaker
2620
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/Chromecast
2621
+ # These are the newer Chromecast devices, such as smart speakers, Google TVs, etc. that have an explicit device type.
2622
+ - regex: 'CrKey.*DeviceType/([^/]*)'
2623
+ brand_replacement: 'Google'
2624
+ device_replacement: 'Chromecast'
2625
+ model_replacement: '$1'
2626
+
2627
+ # Ex: Mozilla/5.0 (Fuchsia) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 CrKey/1.56.500000
2628
+ # These are some intermediate "Nest Hub" Chromecast devices running Fuchsia.
2629
+ - regex: 'Fuchsia.*CrKey'
2630
+ brand_replacement: 'Google'
2631
+ device_replacement: 'Chromecast'
2632
+ model_replacement: 'Nest Hub'
2633
+
2634
+ # Ex: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.47 Safari/537.36 CrKey/1.36.159268
2635
+ # These are the first generation of Chromecast devices that ran Linux. They don't specify a device type.
2636
+ - regex: 'Linux.*CrKey/1.36'
2637
+ brand_replacement: 'Google'
2638
+ device_replacement: 'Chromecast'
2639
+ model_replacement: 'First Generation'
2640
+
2641
+ # We have no data on the user agent strings of other models, except that they all report CrKey/
2642
+ - regex: 'CrKey/'
2643
+ brand_replacement: 'Google'
2644
+ device_replacement: 'Chromecast'
2645
+ model_replacement: 'Chromecast'
2646
+
2437
2647
  #########
2438
2648
  # Cloudfone
2439
2649
  # @ref: http://www.cloudfonemobile.com/
@@ -3016,7 +3226,7 @@ device_parsers:
3016
3226
  device_replacement: 'HTC $1'
3017
3227
  brand_replacement: 'HTC'
3018
3228
  model_replacement: '$1'
3019
- - regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
3229
+ - regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
3020
3230
  regex_flag: 'i'
3021
3231
  device_replacement: 'HTC $1 $2'
3022
3232
  brand_replacement: 'HTC'
@@ -3590,6 +3800,11 @@ device_parsers:
3590
3800
  # Meta
3591
3801
  # @ref: https://www.meta.com
3592
3802
  #########
3803
+ - regex: 'Quest 3'
3804
+ device_replacement: 'Quest'
3805
+ brand_replacement: 'Meta'
3806
+ model_replacement: 'Quest 3'
3807
+
3593
3808
  - regex: 'Quest 2'
3594
3809
  device_replacement: 'Quest'
3595
3810
  brand_replacement: 'Meta'
@@ -5415,7 +5630,6 @@ device_parsers:
5415
5630
  brand_replacement: 'Asus'
5416
5631
  model_replacement: '$1'
5417
5632
 
5418
-
5419
5633
  ##########
5420
5634
  # Bird
5421
5635
  ##########
@@ -5615,7 +5829,6 @@ device_parsers:
5615
5829
  brand_replacement: 'Motorola'
5616
5830
  model_replacement: '$2'
5617
5831
 
5618
-
5619
5832
  ##########
5620
5833
  # nintendo
5621
5834
  ##########
@@ -5819,7 +6032,7 @@ device_parsers:
5819
6032
  ##########
5820
6033
  # Spiders (this is a hack...)
5821
6034
  ##########
5822
- - regex: '^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
6035
+ - regex: '^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper|RecipeRadar|GPTBot|Google-InspectionTool)'
5823
6036
  regex_flag: 'i'
5824
6037
  device_replacement: 'Spider'
5825
6038
  brand_replacement: 'Spider'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: user_agent_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.17.0
4
+ version: 2.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Lucas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-24 00:00:00.000000000 Z
11
+ date: 2025-07-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  A simple, comprehensive Ruby gem for parsing user agent strings
@@ -48,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0'
50
50
  requirements: []
51
- rubygems_version: 3.5.6
51
+ rubygems_version: 3.5.22
52
52
  signing_key:
53
53
  specification_version: 4
54
54
  summary: Parsing user agent strings with the help of BrowserScope's UA database