npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ua-parser

v0.3.5

Published

A port of Browserscope's user agent parser.

Downloads

11,095

Readme

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

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.