Парсинг User-Agent с использованием c # - PullRequest
2 голосов
/ 25 мая 2010

У меня большой список строк User-agent. Для аналитической панели мне нужно разобрать их и разделить на:

  1. Имя браузера, версия. 2. Название платформы, версия

Если есть готовое решение или код для этого? Как там: http://useragentstring.com/

Ответы [ 2 ]

3 голосов
/ 26 марта 2013

Я знаю, что это ужасно, но я не мог найти ничего лучше,

public static class UserAgentParser
{
    /// <summary>
    /// Extracts human readible Operating system name.
    /// </summary>
    /// <param name="userAgent">User Agent string from Request.</param>
    /// <returns>Human readible Operating system name.</returns>
    public static string GetOperatingSystem(string userAgent)
    {
        var clientOsName = string.Empty;
        if (userAgent.Contains("Windows 98"))
            clientOsName = "Windows 98";
        else if (userAgent.Contains("Windows NT 5.0"))
            clientOsName = "Windows 2000";
        else if (userAgent.Contains("Windows NT 5.1"))
            clientOsName = "Windows XP";
        else if (userAgent.Contains("Windows NT 6.0"))
            clientOsName = "Windows Vista";
        else if (userAgent.Contains("Windows NT 6.1"))
            clientOsName = "Windows 7";
        else if (userAgent.Contains("Windows NT 6.2"))
            clientOsName = "Windows 8";
        else if (userAgent.Contains("Windows"))
        {
            clientOsName = GetOsVersion(userAgent, "Windows");
        }
        else if (userAgent.Contains("Android"))
        {
            clientOsName = GetOsVersion(userAgent, "Android");
        }
        else if (userAgent.Contains("Linux"))
        {
            clientOsName = GetOsVersion(userAgent, "Linux");
        }
        else if (userAgent.Contains("iPhone"))
        {
            clientOsName = GetOsVersion(userAgent, "iPhone");
        }
        else if (userAgent.Contains("iPad"))
        {
            clientOsName = GetOsVersion(userAgent, "iPad");
        }
        else if (userAgent.Contains("Macintosh"))
        {
            clientOsName = GetOsVersion(userAgent, "Macintosh");
        }
        else
        {
            clientOsName = "Unknown OS";
        }

        return clientOsName;
    }

    private static string GetOsVersion(string userAgent, string osName)
    {
        if (userAgent.Split(new[] {osName}, StringSplitOptions.None)[1].Split(new[]{';',')'}).Length != 0)
            {
                return string.Format("{0}{1}", osName,userAgent.Split(new[] { osName }, StringSplitOptions.None)[1].Split(new[] { ';', ')' })[0]);
            }

        return osName;
    }
}

[TestFixture]
public class UserAgentParserTest
{

    public IEnumerable<TestCaseData> UserAgentStringTestData()
    {
        yield return new TestCaseData("Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3", "iPhone");
        yield return new TestCaseData("Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3", "iPad");
        yield return new TestCaseData("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.04 Chromium/17.0.963.56 Chrome/17.0.963.56 Safari/535.11", "Linux x86_64");
        yield return new TestCaseData("Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Linux i686");
        yield return new TestCaseData("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Windows 7");
        yield return new TestCaseData("Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Windows Vista");
        yield return
            new TestCaseData(
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4", "Windows 8");
        yield return
            new TestCaseData(
                "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Windows XP");
        yield return
            new TestCaseData(
                "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0",
                "Windows 2000");
        yield return
            new TestCaseData(
                "Mozilla/5.0 (compatible; MSIE 7.0; Windows 98; SpamBlockerUtility 6.3.91; SpamBlockerUtility 6.2.91; .NET CLR 4.1.89;GB)", "Windows 98");
        yield return
            new TestCaseData(
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13",
                "Macintosh");
        yield return
            new TestCaseData(
                "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
                "Unknown OS");
        yield return
            new TestCaseData(
                "Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
                "Android 4.0.3");
        yield return
            new TestCaseData("Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)", "Windows 3.1");
    }

    [Test]
    [TestCaseSource("UserAgentStringTestData")]
    public void UserAgentParsesOs(string userAgent, string expectedOs)
    {
        Assert.AreEqual(expectedOs, UserAgentParser.GetOperatingSystem(userAgent));
    }
}
2 голосов
/ 10 июня 2010

Посмотрите на RFC 1945 и RFC 2068 для синтаксиса строки агента пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...