ua-parser

A port of Browserscope's user agent parser.

ua-parser

ua-parser is a multi-language port of BrowserScope's user agent string parser.

The crux of the original parser--the data collected by Steve Souders over the years--has been extracted into a separate YAML file so as to be reusable as is by implementations in other programming languages.

ua-parser is just a small wrapper around this data, along with ongoing improvements to the definitions.

Please read the contributors' guide

There are a few other libraries which make use of ua-parser's patterns. These include:

whatsmyua.info shows what ua-parser reports for your current user agent/OS/device, or for any arbitrary user agent string.

Usage :: node.js

var http = require('http');
 
http.createServer(function (reqres) {
 
  var r = require('ua-parser').parse(req.headers['user-agent']);
 
  console.log(r.ua.toString());        // -> "Safari 5.0.1" 
  console.log(r.ua.toVersionString()); // -> "5.0.1" 
  console.log(r.ua.family)             // -> "Safari" 
  console.log(r.ua.major);             // -> "5" 
  console.log(r.ua.minor);             // -> "0" 
  console.log(r.ua.patch);             // -> "1" 
 
  console.log(r.os.toString());        // -> "iOS 5.1" 
  console.log(r.os.toVersionString()); // -> "5.1" 
  console.log(r.os.family)             // -> "iOS" 
  console.log(r.os.major);             // -> "5" 
  console.log(r.os.minor);             // -> "1" 
  console.log(r.os.patch);             // -> null 
 
  console.log(r.device.family);        // -> "iPhone" 
 
}).listen(3000);

Note 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.:

var http = require('http'),
    p = require('ua-parser');
 
http.createServer(function (reqres) {
 
  var userAgent = req.headers['user-agent'];
 
  console.log(p.parseUA(userAgent).toString());
  // -> "Safari 5.0.1" 
  console.log(p.parseOS(userAgent).toString());
  // -> "iOS 5.1" 
  console.log(p.parseDevice(userAgent).toString());
  // -> "iPhone" 
 
}).listen(3000);

You can install ua-parser by running:

pip install pyyaml ua-parser

And here's how to use it:

from ua_parser import user_agent_parser
 
# On the server, you could use a WebOB request object. 
user_agent_string = request.META.get('HTTP_USER_AGENT')
 
# For demonstration purposes, though an iPhone ... 
user_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'
 
# Get back a big dictionary of all the goodies. 
result_dict = user_agent_parser.Parse(user_agent_string)
 
print result_dict['user_agent']
# {'major': '5', 'minor': '1', 'family': 'Mobile Safari', 'patch': None} 
 
print result_dict['os']
# {'major': '5', 'patch_minor': None, 'minor': '1', 'family': 'iOS', 'patch': None} 
 
print result_dict['device']
# {'family': 'iPhone'} 
import ua_parser.Parser;
import ua_parser.Client;
 
...
 
  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";
 
  Parser uaParser = new Parser();
  Client c = uaParser.parse(uaString);
 
  System.out.println(c.userAgent.family); // => "Mobile Safari" 
  System.out.println(c.userAgent.major);  // => "5" 
  System.out.println(c.userAgent.minor);  // => "1" 
 
  System.out.println(c.os.family);        // => "iOS" 
  System.out.println(c.os.major);         // => "5" 
  System.out.println(c.os.minor);         // => "1" 
 
  System.out.println(c.device.family);    // => "iPhone" 

For Pig there are UDFs for getting a single value and UDFs for getting a tuple with all values for either Device, Os of UserAgent. For most usecases the tuple UDFs will be the most useful.

REGISTER ua-parser-pig-0.1-SNAPSHOT-job.jar
 
DEFINE Device           ua_parser.pig.Device;
DEFINE Os               ua_parser.pig.Os;
DEFINE UserAgent        ua_parser.pig.UserAgent;
 
UserAgents =
    Load 'useragents.txt' AS (useragent:chararray);
 
AgentSpecs =
    FOREACH UserAgents
    GENERATE
             Device(useragent)              AS Device,
             Os(useragent)                  AS Os,
             UserAgent(useragent)           AS UserAgent,
 
             useragent                      AS Useragent;
 
DESCRIBE AgentSpecs;
DUMP AgentSpecs;

The versions that return only a single value:

REGISTER ua-parser-pig-0.1-SNAPSHOT-job.jar
 
DEFINE DeviceFamily     ua_parser.pig.device.Family;
DEFINE OsFamily         ua_parser.pig.os.Family;
DEFINE OsMajor          ua_parser.pig.os.Major;
DEFINE OsMinor          ua_parser.pig.os.Minor;
DEFINE OsPatch          ua_parser.pig.os.Patch;
DEFINE OsPatchMinor     ua_parser.pig.os.PatchMinor;
DEFINE UseragentFamily  ua_parser.pig.useragent.Family;
DEFINE UseragentMajor   ua_parser.pig.useragent.Major;
DEFINE UseragentMinor   ua_parser.pig.useragent.Minor;
DEFINE UseragentPatch   ua_parser.pig.useragent.Patch;
 
UserAgents =
    Load 'useragents.txt' AS (useragent:chararray);
 
AgentSpecs =
    FOREACH  UserAgents
    GENERATE DeviceFamily(useragent)    AS DeviceFamily:chararray,
 
             OsFamily(useragent)        AS OsFamily:chararray,
             OsMajor(useragent)         AS OsMajor:chararray,
             OsMinor(useragent)         AS OsMinor:chararray,
             OsPatch(useragent)         AS OsPatch:chararray,
             OsPatchMinor(useragent)    AS OsPatchMinor:chararray,
 
             UseragentFamily(useragent) AS UseragentFamily:chararray,
             UseragentMajor(useragent)  AS UseragentMajor:chararray,
             UseragentMinor(useragent)  AS UseragentMinor:chararray,
             UseragentPatch(useragent)  AS UseragentPatch:chararray,
 
             useragent                  AS Useragent;
 
DUMP AgentSpecs;
require_once 'vendor/autoload.php';
use UAParser\Parser;
 
$ua = "Mozilla/5.0 (Macintosh; Intel Ma...";
 
$parser = Parser::create();
$result = $parser->parse($ua);
 
print $result->ua->family;            // Safari
print $result->ua->major;             // 6
print $result->ua->minor;             // 0
print $result->ua->patch;             // 2
print $result->ua->toString();        // Safari 6.0.2
print $result->ua->toVersion();       // 6.0.2
 
print $result->os->family;            // Mac OS X
print $result->os->major;             // 10
print $result->os->minor;             // 7
print $result->os->patch;             // 5
print $result->os->patchMinor;        // [null]
print $result->os->toString();        // Mac OS X 10.7.5
print $result->os->toVersion();       // 10.7.5
 
print $result->device->family;        // Other
 
print $result->toString();            // Safari 6.0.2/Mac OS X 10.7.5
print $result->uaOriginal;            // Mozilla/5.0 (Macintosh; Intel Ma...

More information is available in the README in the PHP directory

import UaParser;
 
import std.stdio;
 
void main() {
    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");
    std.stdio.writeln(agent.browser.family); // Mobile Safari
    std.stdio.writeln(agent.browser.major);  // 5
    std.stdio.writeln(agent.browser.minor);  // 1
    std.stdio.writeln(agent.browser.patch);  // 0
    std.stdio.writeln(agent.browser.toString); // Mobile Safari 5.1.0
    std.stdio.writeln(agent.browser.toVersionString); // 5.1.0
 
    std.stdio.writeln(agent.os.family); // iOS
    std.stdio.writeln(agent.os.major);  // 5
    std.stdio.writeln(agent.os.minor);  // 1
    std.stdio.writeln(agent.os.patch);  // 1
    std.stdio.writeln(agent.os.toString); // iOS 5.1.1
    std.stdio.writeln(agent.os.toVersionString); // 5.1.1
 
    std.stdio.writeln(agent.toFullString); // Mobile Safari 5.1.0/iOS 5.1.1
 
    std.stdio.writeln(agent.device.family); // iPhone
 
    std.stdio.writeln(agent.isMobile); // true
    std.stdio.writeln(agent.isSpider); // false
}

Install the NuGet package

Install-Package UAParser

Sample Usage:

using System;
 
namespace UAParser.ConsoleApp
{
  class Program
  {
    static void Main(string[] args)
    {
      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";
 
      Parser uaParser = Parser.GetDefault();
 
      ClientInfo c = uaParser.Parse(uaString);
 
      Console.WriteLine(c.UserAgent);  //Safari 5.0.2
      Console.WriteLine(c.OS); // Mac OS X 10.6.5
      Console.WriteLine(c.Device); //
 
      Console.ReadLine();
    }
  }
}
use HTTP::UA::Parser;
my $r = HTTP::UA::Parser->new();
 
print $r->ua->toString();         # -> "Safari 5.0.1" 
print $r->ua->toVersionString();  # -> "5.0.1" 
print $r->ua->family;             # -> "Safari" 
print $r->ua->major;              # -> "5" 
print $r->ua->minor;              # -> "0" 
print $r->ua->patch;              # -> "1" 
 
print $r->os->toString();         # -> "iOS 5.1" 
print $r->os->toVersionString();  # -> "5.1" 
print $r->os->family              # -> "iOS" 
print $r->os->major;              # -> "5" 
print $r->os->minor;              # -> "1" 
print $r->os->patch;              # -> undef 
 
print $r->device->family;         # -> "iPhone" 
 
More information is available in the README in the perl directory

Install the package:

cabal update
cabal install ua-parser

Sample Usage:

{-# LANGUAGE OverloadedStrings #-}
 
module Main where
 
import Web.UAParser
 
test_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"
 
main = do
    print $ parseUA test_string
    print $ parseOS test_string

Result of running this program:

-- Result from user agent parse
Just (UAResult {uarFamily = "Mobile Safari", uarV1 = Just "5", uarV2 = Just "1", uarV3 = Nothing})
 
-- Result from operating system parse
Just (OSResult {osrFamily = "iOS", osrV1 = Just "5", osrV2 = Just "1", osrV3 = Nothing, osrV4 = Nothing})

Please refer to Haddocks for more info; the API is pretty straightforward.

Install the package:

go get "github.com/tobie/ua-parser/go/uaparser"

Sample Usage

package main
 
import (
  "github.com/tobie/ua-parser/go/uaparser"
  "fmt"
)
 
func main() {
  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"
  regexFile := "../../regexes.yaml"
  parser := uaparser.New(regexFile)
  client := parser.Parse(testStr)
  fmt.Println(client.UserAgent.Family)  // "Amazon Silk"
  fmt.Println(client.UserAgent.Major)   // "1"
  fmt.Println(client.UserAgent.Minor)   // "1"
  fmt.Println(client.UserAgent.Patch)   // "0-80"
  fmt.Println(client.Os.Family)         // "Android"
  fmt.Println(client.Os.Major)          // ""
  fmt.Println(client.Os.Minor)          // ""
  fmt.Println(client.Os.Patch)          // ""
  fmt.Println(client.Os.PatchMinor)     // ""
  fmt.Println(client.Device.Family)     // "Kindle Fire"
}

More information is available in the README in the Go directory

The data contained in regexes.yaml is Copyright (c) 2009 Google Inc. and other contributors, and available under the Apache License, Version 2.0.

The original python code is Copyright (c) 2008 Google Inc. and other contributors,and is available under the Apache License, Version 2.0.

The JS port is Copyright (c) 2010 Tobie Langel and other contributors, and is available under your choice of MIT or Apache Version 2.0 license.

The PHP port is Copyright (c) 2011-2012 Dave Olsen and other contributors, and is available under the MIT license.

The Java port is Copyright (c) 2012 Twitter, Inc and other contributors, and is available under the Apache License, Version 2.0.

The D port is Copyright (c) 2012 Shripad K and other contributors, and is available under the MIT license.

The C# port is Copyright (c) 2012 Søren Enemærke and other contributors, and is available under the Apache License, Version 2.0.

The Perl port is Copyright (c) 2012 Mamod Mehyar and other contributors, and is available under the Perl License, Version 5.10.1.

The Pig port is Copyright (c) 2013 Niels Basjes and other contributors, and is available under the Apache License, Version 2.0.

The Go port is Copyright (c) 2013 Yihuan Zhou and other contributors, and is available under the MIT License.