{"id":15145768,"url":"https://github.com/soundcloud/ua-parser","last_synced_at":"2025-09-29T15:31:06.664Z","repository":{"id":52845640,"uuid":"21233415","full_name":"soundcloud/ua-parser","owner":"soundcloud","description":"A multi-language port of Browserscope's user agent parser.","archived":false,"fork":true,"pushed_at":"2023-04-09T20:58:36.000Z","size":4015,"stargazers_count":3,"open_issues_count":0,"forks_count":4,"subscribers_count":106,"default_branch":"master","last_synced_at":"2024-09-27T11:42:35.132Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Perl","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"tobie/ua-parser","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/soundcloud.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-06-26T08:22:30.000Z","updated_at":"2021-12-14T09:21:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/soundcloud/ua-parser","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soundcloud%2Fua-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soundcloud%2Fua-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soundcloud%2Fua-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soundcloud%2Fua-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soundcloud","download_url":"https://codeload.github.com/soundcloud/ua-parser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234635007,"owners_count":18863987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-26T11:42:40.815Z","updated_at":"2025-09-29T15:31:01.014Z","avatar_url":"https://github.com/soundcloud.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"ua-parser [![Build Status](https://secure.travis-ci.org/tobie/ua-parser.png?branch=master)](https://travis-ci.org/tobie/ua-parser)\n=========\n\n`ua-parser` is a multi-language port of [BrowserScope][2]'s [user agent string parser][3].\n\nThe crux of the original parser--the data collected by [Steve Souders][4] over the years--has been extracted into a separate [YAML file][5] so as to be reusable _as is_ by implementations in other programming languages.\n\n`ua-parser` is just a small wrapper around this data.\n\nMaintainers\n-----------\n\n* C#: [Søren Enemærke](https://github.com/enemaerke) ([@sorenenemaerke](https://twitter.com/sorenenemaerke))\n* D: [Shripad K](https://github.com/shripadk) ([@24shri](https://twitter.com/24shri))\n* Go: [Yihuan Zhou](https://github.com/yihuanz) ([@yihuanz](https://twitter.com/yihuanz))\n* Haskell: [Ozgun Ataman](https://github.com/ozataman) ([@ozataman](https://twitter.com/ozataman))\n* Java: [Steve Jiang](https://github.com/sjiang) ([@sjiang](https://twitter.com/sjiang))\n* JavaScript: [Tobie Langel](https://github.com/tobie) ([@tobie](https://twitter.com/tobie))\n* Perl: [Mamod Mehyar](https://github.com/mamod) ([@mamod](https://twitter.com/mamod))\n* PHP: [Lars Strojny](https://github.com/lstrojny) ([@lstrojny](https://twitter.com/lstrojny))\n* Pig: [Niels Basjes](https://github.com/nielsbasjes) ([@nielsbasjes](https://twitter.com/nielsbasjes))\n* Python: [Lindsey Simon](https://github.com/elsigh) ([@elsigh](https://twitter.com/elsigh))\n* `regexes.yaml`: Lindsey Simon \u0026 Tobie Langel\n\nirc channel\n-----------\n\n[#ua-parser on freenode](irc://chat.freenode.net#ua-parse).\n\nContributing Changes to regexes.yaml\n------------------------------------\n\nPlease read the [contributors' guide](https://github.com/tobie/ua-parser/blob/master/CONTRIBUTING.md)\n\nOther ua-parser Libraries\n-------------------------\n\nThere are a few other libraries which make use of ua-parser's patterns. These include:\n\n* Ruby - [user_agent_parser](https://github.com/toolmantim/user_agent_parser)\n\nSee ua-parser in action\n-----------------------\n\n[whatsmyua.info](http://www.whatsmyua.info) shows what ua-parser reports for\nyour current user agent/OS/device, or for any arbitrary user agent string.\n\nUsage :: [node.js][1]\n---------------------\n```js\nvar http = require('http');\n\nhttp.createServer(function (req, res) {\n\n  var r = require('ua-parser').parse(req.headers['user-agent']);\n\n  console.log(r.ua.toString());        // -\u003e \"Safari 5.0.1\"\n  console.log(r.ua.toVersionString()); // -\u003e \"5.0.1\"\n  console.log(r.ua.family)             // -\u003e \"Safari\"\n  console.log(r.ua.major);             // -\u003e \"5\"\n  console.log(r.ua.minor);             // -\u003e \"0\"\n  console.log(r.ua.patch);             // -\u003e \"1\"\n\n  console.log(r.os.toString());        // -\u003e \"iOS 5.1\"\n  console.log(r.os.toVersionString()); // -\u003e \"5.1\"\n  console.log(r.os.family)             // -\u003e \"iOS\"\n  console.log(r.os.major);             // -\u003e \"5\"\n  console.log(r.os.minor);             // -\u003e \"1\"\n  console.log(r.os.patch);             // -\u003e null\n\n  console.log(r.device.family);        // -\u003e \"iPhone\"\n\n}).listen(3000);\n```\n\nNote if you're only interested in one of the `ua`, `device` or `os` objects, you will getter better performance by using the more specific methods (`uaParser.parseUA`, `uaParser.parseOS` and `uaParser.parseDevice` respectively), e.g.:\n\n```js\nvar http = require('http'),\n    p = require('ua-parser');\n\nhttp.createServer(function (req, res) {\n\n  var userAgent = req.headers['user-agent'];\n\n  console.log(p.parseUA(userAgent).toString());\n  // -\u003e \"Safari 5.0.1\"\n  console.log(p.parseOS(userAgent).toString());\n  // -\u003e \"iOS 5.1\"\n  console.log(p.parseDevice(userAgent).toString());\n  // -\u003e \"iPhone\"\n\n}).listen(3000);\n```\n\nUsage :: python\n---------------\nYou can install `ua-parser` by running:\n\n```python\npip install pyyaml ua-parser\n```\n\nAnd here's how to use it:\n\n```python\nfrom ua_parser import user_agent_parser\n\n# On the server, you could use a WebOB request object.\nuser_agent_string = request.META.get('HTTP_USER_AGENT')\n\n# For demonstration purposes, though an iPhone ...\nuser_agent_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3'\n\n# Get back a big dictionary of all the goodies.\nresult_dict = user_agent_parser.Parse(user_agent_string)\n\nprint result_dict['user_agent']\n# {'major': '5', 'minor': '1', 'family': 'Mobile Safari', 'patch': None}\n\nprint result_dict['os']\n# {'major': '5', 'patch_minor': None, 'minor': '1', 'family': 'iOS', 'patch': None}\n\nprint result_dict['device']\n# {'family': 'iPhone'}\n```\n\n\nUsage :: java\n-------------\n```java\nimport ua_parser.Parser;\nimport ua_parser.Client;\n\n...\n\n  String uaString = \"Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3\";\n\n  Parser uaParser = new Parser();\n  Client c = uaParser.parse(uaString);\n\n  System.out.println(c.userAgent.family); // =\u003e \"Mobile Safari\"\n  System.out.println(c.userAgent.major);  // =\u003e \"5\"\n  System.out.println(c.userAgent.minor);  // =\u003e \"1\"\n\n  System.out.println(c.os.family);        // =\u003e \"iOS\"\n  System.out.println(c.os.major);         // =\u003e \"5\"\n  System.out.println(c.os.minor);         // =\u003e \"1\"\n\n  System.out.println(c.device.family);    // =\u003e \"iPhone\"\n```\n\n\nUsage :: Pig\n-------------\nFor Pig there are UDFs for getting a single value and UDFs for getting a tuple with all values for either Device, Os of UserAgent.\nFor most usecases the tuple UDFs will be the most useful.\n\n```pig\nREGISTER ua-parser-pig-0.1-SNAPSHOT-job.jar\n\nDEFINE Device           ua_parser.pig.Device;\nDEFINE Os               ua_parser.pig.Os;\nDEFINE UserAgent        ua_parser.pig.UserAgent;\n\nUserAgents =\n    Load 'useragents.txt' AS (useragent:chararray);\n\nAgentSpecs =\n    FOREACH UserAgents\n    GENERATE\n             Device(useragent)              AS Device,\n             Os(useragent)                  AS Os,\n             UserAgent(useragent)           AS UserAgent,\n\n             useragent                      AS Useragent;\n\nDESCRIBE AgentSpecs;\nDUMP AgentSpecs;\n```\n\nThe versions that return only a single value:\n\n```pig\nREGISTER ua-parser-pig-0.1-SNAPSHOT-job.jar\n\nDEFINE DeviceFamily     ua_parser.pig.device.Family;\nDEFINE OsFamily         ua_parser.pig.os.Family;\nDEFINE OsMajor          ua_parser.pig.os.Major;\nDEFINE OsMinor          ua_parser.pig.os.Minor;\nDEFINE OsPatch          ua_parser.pig.os.Patch;\nDEFINE OsPatchMinor     ua_parser.pig.os.PatchMinor;\nDEFINE UseragentFamily  ua_parser.pig.useragent.Family;\nDEFINE UseragentMajor   ua_parser.pig.useragent.Major;\nDEFINE UseragentMinor   ua_parser.pig.useragent.Minor;\nDEFINE UseragentPatch   ua_parser.pig.useragent.Patch;\n\nUserAgents =\n    Load 'useragents.txt' AS (useragent:chararray);\n\nAgentSpecs =\n    FOREACH  UserAgents\n    GENERATE DeviceFamily(useragent)    AS DeviceFamily:chararray,\n\n             OsFamily(useragent)        AS OsFamily:chararray,\n             OsMajor(useragent)         AS OsMajor:chararray,\n             OsMinor(useragent)         AS OsMinor:chararray,\n             OsPatch(useragent)         AS OsPatch:chararray,\n             OsPatchMinor(useragent)    AS OsPatchMinor:chararray,\n\n             UseragentFamily(useragent) AS UseragentFamily:chararray,\n             UseragentMajor(useragent)  AS UseragentMajor:chararray,\n             UseragentMinor(useragent)  AS UseragentMinor:chararray,\n             UseragentPatch(useragent)  AS UseragentPatch:chararray,\n\n             useragent                  AS Useragent;\n\nDUMP AgentSpecs;\n```\n\n\nUsage :: php\n------------\n\n```php\nrequire_once 'vendor/autoload.php';\nuse UAParser\\Parser;\n\n$ua = \"Mozilla/5.0 (Macintosh; Intel Ma...\";\n\n$parser = Parser::create();\n$result = $parser-\u003eparse($ua);\n\nprint $result-\u003eua-\u003efamily;            // Safari\nprint $result-\u003eua-\u003emajor;             // 6\nprint $result-\u003eua-\u003eminor;             // 0\nprint $result-\u003eua-\u003epatch;             // 2\nprint $result-\u003eua-\u003etoString();        // Safari 6.0.2\nprint $result-\u003eua-\u003etoVersion();       // 6.0.2\n\nprint $result-\u003eos-\u003efamily;            // Mac OS X\nprint $result-\u003eos-\u003emajor;             // 10\nprint $result-\u003eos-\u003eminor;             // 7\nprint $result-\u003eos-\u003epatch;             // 5\nprint $result-\u003eos-\u003epatchMinor;        // [null]\nprint $result-\u003eos-\u003etoString();        // Mac OS X 10.7.5\nprint $result-\u003eos-\u003etoVersion();       // 10.7.5\n\nprint $result-\u003edevice-\u003efamily;        // Other\n\nprint $result-\u003etoString();            // Safari 6.0.2/Mac OS X 10.7.5\nprint $result-\u003euaOriginal;            // Mozilla/5.0 (Macintosh; Intel Ma...\n```\n\n[More information is available in the README](https://github.com/tobie/ua-parser/tree/master/php) in the PHP directory\n\nUsage :: D\n-------------\n```d\nimport UaParser;\n\nimport std.stdio;\n\nvoid main() {\n    auto agent = UaParser.parse(\"Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3\");\n    std.stdio.writeln(agent.browser.family); // Mobile Safari\n    std.stdio.writeln(agent.browser.major);  // 5\n    std.stdio.writeln(agent.browser.minor);  // 1\n    std.stdio.writeln(agent.browser.patch);  // 0\n    std.stdio.writeln(agent.browser.toString); // Mobile Safari 5.1.0\n    std.stdio.writeln(agent.browser.toVersionString); // 5.1.0\n\n    std.stdio.writeln(agent.os.family); // iOS\n    std.stdio.writeln(agent.os.major);  // 5\n    std.stdio.writeln(agent.os.minor);  // 1\n    std.stdio.writeln(agent.os.patch);  // 1\n    std.stdio.writeln(agent.os.toString); // iOS 5.1.1\n    std.stdio.writeln(agent.os.toVersionString); // 5.1.1\n\n    std.stdio.writeln(agent.toFullString); // Mobile Safari 5.1.0/iOS 5.1.1\n\n    std.stdio.writeln(agent.device.family); // iPhone\n\n    std.stdio.writeln(agent.isMobile); // true\n    std.stdio.writeln(agent.isSpider); // false\n}\n```\n\nUsage :: C#\n-------------\nInstall the NuGet package\n\n\tInstall-Package UAParser\n\nSample Usage:\n\n```csharp\nusing System;\n\nnamespace UAParser.ConsoleApp\n{\n  class Program\n  {\n    static void Main(string[] args)\n    {\n      String uaString = \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-us) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\";\n\n      Parser uaParser = Parser.GetDefault();\n\n      ClientInfo c = uaParser.Parse(uaString);\n\n      Console.WriteLine(c.UserAgent);  //Safari 5.0.2\n      Console.WriteLine(c.OS); // Mac OS X 10.6.5\n      Console.WriteLine(c.Device); //\n\n      Console.ReadLine();\n    }\n  }\n}\n```\n\nUsage :: Perl\n-------------\n```perl\nuse HTTP::UA::Parser;\nmy $r = HTTP::UA::Parser-\u003enew();\n\nprint $r-\u003eua-\u003etoString();         # -\u003e \"Safari 5.0.1\"\nprint $r-\u003eua-\u003etoVersionString();  # -\u003e \"5.0.1\"\nprint $r-\u003eua-\u003efamily;             # -\u003e \"Safari\"\nprint $r-\u003eua-\u003emajor;              # -\u003e \"5\"\nprint $r-\u003eua-\u003eminor;              # -\u003e \"0\"\nprint $r-\u003eua-\u003epatch;              # -\u003e \"1\"\n\nprint $r-\u003eos-\u003etoString();         # -\u003e \"iOS 5.1\"\nprint $r-\u003eos-\u003etoVersionString();  # -\u003e \"5.1\"\nprint $r-\u003eos-\u003efamily              # -\u003e \"iOS\"\nprint $r-\u003eos-\u003emajor;              # -\u003e \"5\"\nprint $r-\u003eos-\u003eminor;              # -\u003e \"1\"\nprint $r-\u003eos-\u003epatch;              # -\u003e undef\n\nprint $r-\u003edevice-\u003efamily;         # -\u003e \"iPhone\"\n\nMore information is available in the README in the perl directory\n```\n\nUsage :: Haskell\n---------------\n\nInstall the package:\n\n    cabal update\n    cabal install ua-parser\n\nSample Usage:\n\n```haskell\n{-# LANGUAGE OverloadedStrings #-}\n\nmodule Main where\n\nimport Web.UAParser\n\ntest_string = \"Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3\"\n\nmain = do\n    print $ parseUA test_string\n    print $ parseOS test_string\n```\n\nResult of running this program:\n\n```haskell\n-- Result from user agent parse\nJust (UAResult {uarFamily = \"Mobile Safari\", uarV1 = Just \"5\", uarV2 = Just \"1\", uarV3 = Nothing})\n\n-- Result from operating system parse\nJust (OSResult {osrFamily = \"iOS\", osrV1 = Just \"5\", osrV2 = Just \"1\", osrV3 = Nothing, osrV4 = Nothing})\n```\n\nPlease refer to Haddocks for more info; the API is pretty straightforward.\n\nUsage :: Go\n------------\n\nInstall the package:\n\n    go get \"github.com/tobie/ua-parser/go/uaparser\"\n\nSample Usage\n\n```\npackage main\n\nimport (\n  \"github.com/tobie/ua-parser/go/uaparser\"\n  \"fmt\"\n)\n\nfunc main() {\n  testStr := \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true\"\n  regexFile := \"../../regexes.yaml\"\n  parser := uaparser.New(regexFile)\n  client := parser.Parse(testStr)\n  fmt.Println(client.UserAgent.Family)  // \"Amazon Silk\"\n  fmt.Println(client.UserAgent.Major)   // \"1\"\n  fmt.Println(client.UserAgent.Minor)   // \"1\"\n  fmt.Println(client.UserAgent.Patch)   // \"0-80\"\n  fmt.Println(client.Os.Family)         // \"Android\"\n  fmt.Println(client.Os.Major)          // \"\"\n  fmt.Println(client.Os.Minor)          // \"\"\n  fmt.Println(client.Os.Patch)          // \"\"\n  fmt.Println(client.Os.PatchMinor)     // \"\"\n  fmt.Println(client.Device.Family)     // \"Kindle Fire\"\n}\n```\n\n[More information is available in the README](https://github.com/tobie/ua-parser/tree/master/go/uaparser) in the Go directory\n\nLicense\n-------\n\nThe data contained in `regexes.yaml` is Copyright (c) 2009 Google Inc. and [other contributors][6], and available under the [Apache License, Version 2.0][7].\n\nThe original python code is Copyright (c) 2008 Google Inc. and [other contributors][8],and is available under the [Apache License, Version 2.0][9].\n\nThe JS port is Copyright (c) 2010 Tobie Langel and [other contributors][10], and is available under [your choice of MIT or Apache Version 2.0 license][11].\n\nThe PHP port is Copyright (c) 2011-2012 Dave Olsen and [other contributors][12], and is available under the [MIT license][13].\n\nThe Java port is Copyright (c) 2012 Twitter, Inc and [other contributors][14], and is available under the [Apache License, Version 2.0][7].\n\nThe D port is Copyright (c) 2012 Shripad K and [other contributors][15], and is available under the [MIT license][16].\n\nThe C# port is Copyright (c) 2012 Søren Enemærke and [other contributors][17], and is available under the [Apache License, Version 2.0][18].\n\nThe Perl port is Copyright (c) 2012 Mamod Mehyar and [other contributors][19], and is available under the [Perl License, Version 5.10.1][20].\n\nThe Pig port is Copyright (c) 2013 Niels Basjes and [other contributors][21], and is available under the [Apache License, Version 2.0][22].\n\nThe Go port is Copyright (c) 2013 Yihuan Zhou and [other contributors][23], and is available under the [MIT License][24].\n\n\n[1]: http://nodejs.org\n[2]: http://www.browserscope.org\n[3]: http://code.google.com/p/ua-parser/\n[4]: http://stevesouders.com/\n[5]: https://raw.github.com/tobie/ua-parser/master/regexes.yaml\n[6]: https://github.com/tobie/ua-parser/commits/master/regexes.yaml\n[7]: http://www.apache.org/licenses/LICENSE-2.0\n[8]: https://github.com/tobie/ua-parser/commits/master/py\n[9]: https://raw.github.com/tobie/ua-parser/master/py/LICENSE\n[10]: https://github.com/tobie/ua-parser/commits/master/js\n[11]: https://raw.github.com/tobie/ua-parser/master/js/LICENSE\n[12]: https://github.com/tobie/ua-parser/commits/master/php\n[13]: https://raw.github.com/tobie/ua-parser/master/php/LICENSE\n[14]: https://github.com/tobie/ua-parser/commits/master/java\n[15]: https://github.com/tobie/ua-parser/commits/master/d\n[16]: https://raw.github.com/tobie/ua-parser/master/d/LICENSE\n[17]: https://github.com/tobie/ua-parser/commits/master/csharp\n[18]: https://raw.github.com/tobie/ua-parser/master/csharp/LICENSE\n[19]: https://github.com/tobie/ua-parser/commits/master/perl\n[20]: http://dev.perl.org/licenses\n[21]: https://github.com/tobie/ua-parser/commits/master/pig\n[22]: https://raw.github.com/tobie/ua-parser/master/pig/LICENSE.txt\n[23]: https://github.com/tobie/ua-parser/commits/master/go\n[24]: https://raw.github.com/tobie/ua-parser/master/go/uaparser/LICENSE.md\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoundcloud%2Fua-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoundcloud%2Fua-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoundcloud%2Fua-parser/lists"}