1############### 2# Device Detector - The Universal Device Detection library for parsing User Agents 3# 4# @link https://matomo.org 5# @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later 6############### 7 8- regex: 'PhantomJS(?:/(\d+[.\d]+))?' 9 name: 'PhantomJS' 10 version: '$1' 11 url: 'https://phantomjs.org/' 12 13- regex: 'IPinfoClient/.*/(\d+[.\d]+)' 14 name: 'IPinfo' 15 version: '$1' 16 url: 'https://github.com/ipinfo' 17 18- regex: 'kiwi-tcms/(\d+[.\d]+)' 19 name: 'Kiwi TCMS' 20 version: '$1' 21 url: 'https://kiwitcms.org' 22 23- regex: 'tcms-api/(\d+[.\d]+)' 24 name: 'Kiwi TCMS API' 25 version: '$1' 26 url: 'https://kiwitcms.org' 27 28- regex: 'Fuzz Faster U Fool v(\d+[.\d]+)' 29 name: 'FFUF' 30 version: '$1' 31 url: 'https://github.com/ffuf/ffuf' 32 33- regex: 'Slim Framework' 34 name: 'Slim Framework' 35 version: '' 36 url: 'https://www.slimframework.com/' 37 38- regex: 'msray-plus' 39 name: 'Msray-Plus' 40 version: '' 41 url: 'https://github.com/super-l/msray' 42 43- regex: 'HTMLParser(?:/(\d+[.\d]+))?' 44 name: 'HTML Parser' 45 version: '$1' 46 url: 'https://htmlparser.sourceforge.net/' 47 48# got - a nodejs library 49- regex: '^got(?:/(\d+\.[.\d]+))? \(' 50 name: 'got' 51 version: '$1' 52 url: 'https://github.com/sindresorhus/got' 53 54# Typhoeus 55- regex: 'Typhoeus' 56 name: 'Typhoeus' 57 version: '' 58 url: 'https://github.com/typhoeus/typhoeus' 59 60# req 61- regex: 'req/v([.\d]+)' 62 name: 'req' 63 version: '$1' 64 url: 'https://github.com/imroc/req' 65 66# quic-go 67- regex: 'quic-go[ -]HTTP/3' 68 name: 'quic-go' 69 version: '' 70 url: 'https://github.com/lucas-clemente/quic-go' 71 72# Azure Data Factory 73- regex: 'azure-data-factory(?:/(\d+[.\d]+))?' 74 name: 'Azure Data Factory' 75 version: '$1' 76 url: 'https://azure.microsoft.com/en-us/products/data-factory/' 77 78# Dart 79- regex: 'Dart/(\d+[.\d]+)' 80 name: 'Dart' 81 version: '$1' 82 url: 'https://dart.dev/' 83 84# r-curl 85- regex: 'r-curl(?:/(\d+[.\d]+))?' 86 name: 'r-curl' 87 version: '$1' 88 url: 'https://github.com/jeroen/curl' 89 90# HTTPX 91- regex: 'python-httpx(?:/(\d+[.\d]+))?' 92 name: 'HTTPX' 93 version: '$1' 94 url: 'https://www.python-httpx.org/' 95 96# fasthttp 97- regex: 'fasthttp(?:/(\d+[.\d]+))?' 98 name: 'fasthttp' 99 version: '$1' 100 url: 'https://github.com/valyala/fasthttp' 101 102# GeoIP Update 103- regex: 'geoipupdate(?:/(\d+[.\d]+))?' 104 name: 'GeoIP Update' 105 version: '$1' 106 url: 'https://github.com/maxmind/geoipupdate' 107 108# PHP cURL Class 109- regex: 'PHP-Curl-Class(?:/(\d+[.\d]+))?' 110 name: 'PHP cURL Class' 111 version: '$1' 112 url: 'https://github.com/php-curl-class/php-curl-class' 113 114# cPanel HTTP Client 115- regex: 'Cpanel-HTTP-Client(?:/(\d+[.\d]+))?' 116 name: 'cPanel HTTP Client' 117 version: '$1' 118 url: 'https://www.cpanel.net/' 119 120# AnyEvent HTTP 121- regex: 'AnyEvent-HTTP(?:/(\d+[.\d]+))?' 122 name: 'AnyEvent HTTP' 123 version: '$1' 124 url: 'http://software.schmorp.de/pkg/AnyEvent' 125 126# SlimerJS 127- regex: 'SlimerJS/(\d+[.\d]+)' 128 name: 'SlimerJS' 129 version: '$1' 130 url: 'https://www.slimerjs.org/' 131 132# Jaunt 133- regex: 'Jaunt/(\d+[.\d]+)' 134 name: 'Jaunt' 135 version: '$1' 136 url: 'https://jaunt-api.com/' 137 138# Cypress 139- regex: 'Cypress/(\d+[.\d]+)' 140 name: 'Cypress' 141 version: '$1' 142 url: 'https://github.com/cypress-io/cypress' 143 144- regex: 'Wget(?:/(\d+[.\d]+))?' 145 name: 'Wget' 146 version: '$1' 147 148- regex: 'Guzzle(?:Http)?(?:/(\d+[.\d]+))?' 149 name: 'Guzzle (PHP HTTP Client)' 150 version: '$1' 151 152# symphony php http client 153- regex: '^Symfony HttpClient/' 154 name: 'Symfony' 155 version: '$1' 156 157- regex: '(?:lib)?curl(?:/(\d+[.\d]+))?' 158 name: 'curl' 159 version: '$1' 160 161- regex: 'python-requests(?:/(\d+[.\d]+))?' 162 name: 'Python Requests' 163 version: '$1' 164 165- regex: 'Python-httplib2(?:/(\d+[.\d]+))?' 166 name: 'httplib2' 167 version: '$1' 168 url: 'https://pypi.org/project/httplib2/' 169 170- regex: 'Python-urllib3?(?:/?(\d+[.\d]+))?' 171 name: 'Python urllib' 172 version: '$1' 173 174- regex: 'Apache-HttpClient(?:/?(\d+[.\d]+))?' 175 name: 'Apache HTTP Client' 176 version: '$1' 177 178- regex: 'Java-http-client(?:/?(\d+[.\d]+))?' 179 name: 'Java HTTP Client' 180 version: '$1' 181 182- regex: 'Java/?(\d+[.\d]+)' 183 name: 'Java' 184 version: '$1' 185 186- regex: '(?:perlclient|libwww-perl)(?:/?(\d+[.\d]+))?' 187 name: 'Perl' 188 version: '$1' 189 190- regex: 'grpc-java-okhttp/([\d.]+)' 191 name: 'gRPC-Java' 192 version: '$1' 193 url: 'https://github.com/grpc/grpc-java' 194 195# java library 196- regex: '(?:okhttp|network-okhttp3)/([\d.]+)' 197 name: 'OkHttp' 198 version: '$1' 199 200- regex: 'okhttp3-([\d.]+)' 201 name: 'OkHttp' 202 version: '$1' 203 204- regex: 'HTTP_Request2(?:/(\d+[.\d]+))?' 205 name: 'HTTP_Request2' 206 version: '$1' 207 url: 'https://pear.php.net/package/http_request2' 208 209- regex: 'Mechanize(?:/(\d+[.\d]+))?' 210 name: 'Mechanize' 211 version: '$1' 212 url: 'https://github.com/sparklemotion/mechanize' 213 214- regex: 'aiohttp(?:/(\d+[.\d]+))?' 215 name: 'aiohttp' 216 version: '$1' 217 218- regex: 'Google-HTTP-Java-Client(?:/(\d+[\.\w-]+))?' 219 name: 'Google HTTP Java Client' 220 version: '$1' 221 222- regex: 'WWW-Mechanize(?:/(\d+[.\d]+))?' 223 name: 'WWW-Mechanize' 224 version: '$1' 225 226- regex: 'Faraday(?: v(\d+[.\d]+))?' 227 name: 'Faraday' 228 version: '$1' 229 url: 'https://github.com/lostisland/faraday' 230 231- regex: '(?:Go-http-client|^Go )/?(?:(\d+[.\d]+))?(?: package http)?' 232 name: 'Go-http-client' 233 version: '$1' 234 235- regex: 'urlgrabber(?:/(\d+[.\d]+))?' 236 name: 'urlgrabber (yum)' 237 version: '$1' 238 239- regex: 'libdnf(?:/(\d+[.\d]+))?' 240 name: 'libdnf' 241 version: '$1' 242 243- regex: 'HTTPie(?:/(\d+[.\d]+))?' 244 name: 'HTTPie' 245 version: '$1' 246 247- regex: 'rest-client/(\d+\.[.\d]+) .*ruby' 248 name: 'REST Client for Ruby' 249 version: '$1' 250 251- regex: 'RestSharp/(\d+[.\d]+)' 252 name: 'RestSharp' 253 version: '$1' 254 url: 'https://github.com/restsharp/RestSharp' 255 256- regex: 'scalaj-http/(\d+[.\d]+)' 257 name: 'ScalaJ HTTP' 258 version: '$1' 259 url: 'https://github.com/scalaj/scalaj-http' 260 261- regex: 'REST::Client/(\d+)' 262 name: 'Perl REST::Client' 263 version: '$1' 264 url: 'https://metacpan.org/pod/REST::Client' 265 266- regex: 'node-fetch/?(\d+[.\d]+)?' 267 name: 'Node Fetch' 268 version: '$1' 269 url: 'https://github.com/node-fetch/node-fetch' 270 271- regex: 'electron-fetch/?(\d+[.\d]+)?' 272 name: 'Electron Fetch' 273 version: '$1' 274 url: 'https://github.com/arantes555/electron-fetch' 275 276- regex: 'ReactorNetty/(\d+[.\d]+)' 277 name: 'ReactorNetty' 278 version: '$1' 279 url: 'https://github.com/reactor/reactor-netty' 280 281- regex: 'PostmanRuntime(?:/(\d+[.\d]+))?' 282 name: 'Postman Desktop' 283 version: '$1' 284 url: 'https://github.com/postmanlabs/postman-runtime' 285 286- regex: 'insomnia(?:/(\d+[.\d]+))?' 287 name: 'Insomnia REST Client' 288 version: '$1' 289 url: 'https://insomnia.rest' 290 291- regex: 'Jakarta Commons-HttpClient/([.\d]+)' 292 name: 'Jakarta Commons HttpClient' 293 version: '$1' 294 url: 'https://hc.apache.org/httpclient-3.x' 295 296- regex: 'WinHttp\.WinHttpRequest.+([.\d]+)' 297 name: 'WinHttp WinHttpRequest' 298 version: '$1' 299 300- regex: 'WinHTTP' 301 name: 'Windows HTTP' 302 version: '' 303 304# THTTPClient in delphi 10+ default useragent 305- regex: 'Embarcadero URI Client/([.\d]+)' 306 name: 'Embarcadero URI Client' 307 version: '$1' 308 309- regex: 'Mikrotik/([.\d]+)' 310 name: 'Mikrotik Fetch' 311 version: '$1' 312 313- regex: 'GRequests(?:/(\d+[.\d]+))?' 314 name: 'GRequests' 315 version: '$1' 316 317# https://doc.akka.io/ 318- regex: 'akka-http/([.\d]+)' 319 name: 'Akka HTTP' 320 version: '$1' 321 322# this added need added tests 323- regex: 'aria2(?:/(\d+[.\d]+))?' 324 name: 'Aria2' 325 version: '$1' 326 327- regex: '(?:BTWebClient/|^uTorrent/)' 328 name: 'uTorrent' 329 version: '' 330 331- regex: 'gvfs/(?:(\d+[.\d]+))?' 332 name: 'gvfs' 333 version: '$1' 334 335# https://openwrt.org/packages/pkgdata/uclient-fetch 336- regex: 'uclient-fetch' 337 name: 'uclient-fetch' 338 version: '' 339 340# https://github.com/microsoft/cpprestsdk 341- regex: 'cpprestsdk/([.\d]+)' 342 name: 'C++ REST SDK' 343 version: '$1' 344 345- regex: 'lua-resty-http/([.\d]+).+ngx_' 346 name: 'LUA OpenResty NGINX' 347 version: '$1' 348 349# https://github.com/Kong/unirest-java 350- regex: 'unirest-java/([.\d]+)' 351 name: 'Unirest for Java' 352 version: '$1' 353 354# jsdom (https://github.com/jsdom/jsdom) 355- regex: 'jsdom/([.\d]+)' 356 name: 'jsdom' 357 version: '$1' 358 359# hackney (https://github.com/benoitc/hackney) (elixir) 360- regex: 'hackney/([.\d]+)' 361 name: 'hackney' 362 version: '$1' 363 364# Resty (https://github.com/go-resty/resty) 365- regex: 'go-resty/([.\d]+)' 366 name: 'Resty' 367 version: '$1' 368 369# Pa11y (https://pa11y.org/) 370- regex: 'pa11y/([.\d]+)' 371 name: 'Pa11y' 372 version: '$1' 373 374# Ultimate Sitemap Parser (https://github.com/mediacloud/ultimate-sitemap-parser) 375- regex: 'ultimate_sitemap_parser/([.\d]+)' 376 name: 'Ultimate Sitemap Parser' 377 version: '$1' 378 379# Container-related useragents 380 381# Artifactory (https://jfrog.com/de/artifactory/) 382- regex: 'Artifactory/([.\d]+)' 383 name: 'Artifactory' 384 version: '$1' 385 386# Open build service (https://build.opensuse.org/) 387- regex: 'BSRPC ([.\d]+)' 388 name: 'Open Build Service' 389 version: '$1' 390 391# Buildah (https://github.com/containers/buildah) 392- regex: 'Buildah/([.\d]+)' 393 name: 'Buildah' 394 version: '$1' 395 396# Buildkit (https://github.com/moby/buildkit) 397- regex: 'buildkit/v?([.\d]+)' 398 name: 'BuildKit' 399 version: '$1' 400 401# containerd (https://github.com/containerd/containerd) 402- regex: 'containerd/v?([.\d]+)' 403 name: 'Containerd' 404 version: '$1' 405 406# containers (https://github.com/containers/image) 407- regex: 'containers/([.\d]+)' 408 name: 'containers' 409 version: '$1' 410 411# cri-o (https://github.com/cri-o/cri-)o 412- regex: 'cri-o/([.\d]+)' 413 name: 'cri-o' 414 version: '$1' 415 416# docker (https://github.com/moby/moby) 417- regex: 'docker/([.\d]+)' 418 name: 'docker' 419 version: '$1' 420 421# gcr (https://github.com/google/go-containerregistry) 422- regex: 'go-containerregistry/v([.\d]+)' 423 name: 'go-container registry' 424 version: '$1' 425 426# libpod (https://github.com/dankohn/libpod) 427- regex: 'libpod/([.\d]+)' 428 name: 'libpod' 429 version: '$1' 430 431# skopeo (https://github.com/containers/skopeo) 432- regex: 'skopeo/([.\d]+)' 433 name: 'Skopeo' 434 version: '$1' 435 436# helm (https://github.com/helm/helm) 437- regex: 'Helm/([.\d]+)' 438 name: 'Helm' 439 version: '$1' 440 441# harbor client (https://goharbor.io/) 442- regex: 'harbor-registry-client' 443 name: 'Harbor registry client' 444 version: '' 445 446# axios http (https://axios-http.com/) 447- regex: 'axios(?:/?(\d+[.\d]+))?' 448 name: Axios 449 version: '$1' 450 451# Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks 452- regex: '^CarrierWave/(\d+\.[.\d]+)' 453 name: 'CarrierWave' 454 version: '$1' 455 456- regex: '^Deno/(\d+\.[.\d]+)' 457 name: 'Deno' 458 version: '$1' 459 460# Streaming downloads using net/http, http.rb, HTTPX or wget (ruby) 461- regex: '^Down/(\d+\.[.\d]+)' 462 name: 'Down' 463 version: '$1' 464 465# various programs can use this, like vlc, but the underlying lib is ffmpeg 466- regex: '^Lavf/' 467 name: 'ffmpeg' 468 version: '$1' 469 470- regex: '^FileDownloader/(\d+\.[.\d]+)' 471 name: 'FileDownloader' 472 version: '$1' 473 474# Allows managing large files with git, without storing the file contents in git 475- regex: '^git-annex/(\d+\.[.\d]+)' 476 name: 'git-annex' 477 version: '$1' 478 479- regex: '^GStreamer(?: souphttpsrc)[ /](\d+\.[.\d]+)?' 480 name: 'GStreamer' 481 version: '$1' 482 483# A small, simple, correct HTTP/1.1 client (Perl) 484- regex: '^HTTP-Tiny/(\d+\.[.\d]+)' 485 name: 'HTTP:Tiny' 486 version: '$1' 487 488- regex: 'KaiOS Downloader' 489 name: 'KaiOS Downloader' 490 version: '' 491 492# HTTP client/server library for GNOME 493- regex: '^libsoup/(\d+\.[.\d]+)' 494 name: 'libsoup' 495 version: '$1' 496 497- regex: '^Android\.LVLDM$' 498 name: 'Android License Verification Library' 499 version: '$1' 500 501# A file downloader library for Android with pause and resume support 502- regex: '^PRDownloader$' 503 name: 'PRDownloader' 504 version: '' 505 506# a rust http library 507- regex: '^reqwest/(\d+\.[.\d]+)' 508 name: 'reqwest' 509 version: '$1' 510 511# lua http library 512- regex: '^resty-requests' 513 name: 'resty-requests' 514 version: '' 515 516# ruby core lib http download 517- regex: '^Ruby' 518 name: 'ruby' 519 version: '' 520 521# SFSafariViewController, some safari service 522- regex: '^SafariViewService/(\d+\.[.\d]+)' 523 name: 'Safari View Service' 524 version: '$1' 525 526# a nodejs lib 527- regex: '^undici$' 528 name: 'undici' 529 version: '' 530 531# URL, an emacs plugin 532- regex: '^URL/Emacs Emacs/(\d+\.[.\d]+)' 533 name: 'Emacs' 534 version: '$1' 535 536- regex: '^FDM[ /]([\d.]+)' 537 name: 'Free Download Manager' 538 version: '$1' 539 540# 'https://github.com/lingochamp/okdownload' 541- regex: 'OkDownload/([\d.]+)' 542 name: 'OKDownload Library' 543 version: '$1' 544 545# podcast host https://libsyn.com (probably an importer) 546- regex: '^Libsyn4-?(?:peek|download)$' 547 name: 'Libsyn' 548 version: '' 549 550# any ios application that uses apple core media but doesn't set its user 551# agent will default to this, always with 1.0.0 version. 552# there was a time when (not even that long ago) apple didn't let you set 553# a user agent so a ton of random applications still identify themselves this way. 554- regex: 'AppleCoreMedia/1\.0\.0' 555 name: 'iOS Application' 556 version: '' 557 558- regex: 'cpp-httplib(?:/(\d+[.\d]+))?' 559 name: 'cpp-httplib' 560 version: '$1' 561 url: 'https://github.com/yhirose/cpp-httplib' 562 563- regex: 'Definitely-Not-Requests' 564 name: 'Requests' 565 version: '' 566 url: 'https://github.com/psf/requests' 567 568- regex: 'Stealer ([\d.]+)' 569 name: 'Stealer' 570 version: '$1' 571 url: 'https://github.com/hotrush/stealer/' 572 573- regex: 'Mandrill-PHP(?:/(\d+[.\d]+))?' 574 name: 'Mandrill PHP' 575 version: '$1' 576 url: 'https://bitbucket.org/mailchimp/mandrill-api-php/src/master/' 577 578- regex: '^Podgrab' 579 name: 'Podgrab' 580 version: '' 581 url: 'https://github.com/akhilrex/podgrab' 582 583- regex: '^Podcast Provider.*?Radio Downloader ([\d.]+)' 584 name: 'Radio Downloader' 585 version: '$1' 586 url: 'https://nerdoftheherd.com/tools/radiodld/' 587 588- regex: '^ESP32 HTTP Client/([\d.]+)' 589 name: 'ESP32 HTTP Client' 590 version: '$1' 591 url: 'https://github.com/espressif/arduino-esp32' 592 593- regex: 'babashka\.http-client(?:/(\d+[.\d]+))?' 594 name: 'Babashka HTTP Client' 595 version: '$1' 596 url: 'https://github.com/babashka/http-client' 597 598- regex: 'http\.rb(?:/(\d+[.\d]+))?' 599 name: 'http.rb' 600 version: '$1' 601 url: 'https://github.com/httprb/http' 602 603- regex: 'node-superagent(?:/(\d+[.\d]+))?' 604 name: 'superagent' 605 version: '$1' 606 url: 'https://github.com/ladjs/superagent' 607 608- regex: 'CakePHP' 609 name: 'CakePHP' 610 version: '' 611 url: 'https://www.cakephp.org/' 612 613- regex: 'request\.js' 614 name: 'request' 615 version: '' 616 url: 'https://github.com/request/request' 617 618- regex: 'qbhttp(?:/(\d+[.\d]+))?' 619 name: 'QbHttp' 620 version: '$1' 621 url: 'https://github.com/OpenQb/QbHttp' 622 623- regex: 'httprs(?:/(\d+[.\d]+))?' 624 name: 'httprs' 625 version: '$1' 626 url: 'https://github.com/http-server-rs/http-server' 627 628- regex: 'Boto3(?:/(\d+[.\d]+))?' 629 name: 'Boto3' 630 version: '$1' 631 url: 'https://github.com/boto/boto3' 632 633- regex: 'Python-xmlrpc(?:/(\d+[.\d]+))?' 634 name: 'XML-RPC' 635 version: '$1' 636 url: 'https://docs.python.org/3/library/xmlrpc.html' 637 638- regex: 'ICAP-Client-Library(?:/(\d+[.\d]+))?' 639 name: 'ICAP Client' 640 version: '$1' 641 url: 'https://github.com/Peoplecantfly/icapserver' 642 643- regex: 'Cygwin-Setup(?:/(\d+[.\d]+))?' 644 name: 'Cygwin' 645 version: '$1' 646 url: 'https://www.cygwin.com/' 647 648- regex: 'azsdk-python-storage-blob(?:/(\d+[.\d]+))?' 649 name: 'Azure Blob Storage' 650 version: '$1' 651 url: 'https://learn.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python' 652 653- regex: 'trafilatura(?:/(\d+[.\d]+))?' 654 name: 'trafilatura' 655 version: '$1' 656 url: 'https://github.com/adbar/trafilatura' 657 658- regex: 'sqlmap(?:/(\d+[.\d]+))?' 659 name: 'sqlmap' 660 version: '$1' 661 url: 'https://sqlmap.org/' 662 663- regex: 'vimeo\.php(?: (\d+[.\d]+))?' 664 name: 'vimeo.php' 665 version: '$1' 666 url: 'https://github.com/vimeo/vimeo.php' 667 668- regex: '^PHP/?(\d+[.\d]+)' 669 name: 'PHP' 670 version: '$1' 671 url: '' 672 673- regex: 'go-network-v(\d+[.\d]+)' 674 name: 'go-network' 675 version: '$1' 676 url: '' 677 678- regex: 'Bun/(\d+\.[.\d]+)' 679 name: 'Bun' 680 version: '$1' 681 url: 'https://bun.sh/' 682 683- regex: 'Apidog/(\d+\.[.\d]+)' 684 name: 'Apidog' 685 version: '$1' 686 url: 'https://apidog.com/' 687 688- regex: 'webchk v(\d+\.[.\d]+)' 689 name: 'webchk' 690 version: '$1' 691 url: 'https://github.com/amgedr/webchk' 692 693- regex: 'MatomoTrackerSDK/(\d+[.\d]+)' 694 name: 'MatomoTracker' 695 version: '$1' 696 url: 'https://github.com/matomo-org/matomo-sdk-ios' 697