Skip to content

A multi-language port of Browserscope's user agent parser.

License

Notifications You must be signed in to change notification settings

ubivent-seuffert/ua-parser

 
 

Repository files navigation

ua-parser Build Status

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.

Maintainers

Communication channels

  • irc (#ua-parser on freenode) irc://chat.freenode.net#ua-parser
  • mailing list

Contributing Changes to regexes.yaml

Please read the contributors' guide

Other ua-parser Libraries

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

See ua-parser in action

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 (req, res) {

  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 (req, res) {

  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);

Usage :: python

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'}

Usage :: java

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"

Usage :: Pig

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;

Usage :: php

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

Usage :: D

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
}

Usage :: C#

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();
    }
  }
}

Usage :: Perl

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

Usage :: Haskell

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.

Usage :: Go

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

License

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.

About

A multi-language port of Browserscope's user agent parser.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 18.1%
  • Perl 17.6%
  • PHP 16.6%
  • C# 11.2%
  • Python 8.9%
  • C++ 8.4%
  • Other 19.2%