ユーザーエージェントパーサー:ブラウザとデバイス情報を解読する

· 12分で読めます

目次

ユーザーエージェントを理解する

ウェブサイトにアクセスするたびに、ブラウザは「ユーザーエージェント文字列」と呼ばれる小さなテキストを送信します。この文字列は、ブラウザ、オペレーティングシステム、そのバージョンの情報を描き出します。これは単なるランダムな文字列ではなく、文字列の各部分にはそれぞれの役割があります。

ウェブアプリだと想像してみてください。訪問者がChromeを使っているのか、Safariを使っているのか知りたいですよね?これにより、ウェブサイトはブラウザの機能に合わせてコンテンツを表示できます。例えば、サイトはアニメーションをうまくサポートしていないブラウザに対してアニメーションを無効にし、パフォーマンスとユーザーエクスペリエンスを向上させることができます。

もう一つの重要な情報はオペレーティングシステムです。ウェブサイトは、WindowsユーザーかMacユーザーかによって異なる機能を提供する場合があります。例えば、ある機能が最新バージョンのMacOSでのみ互換性がある場合、オペレーティングシステムを知ることで、ウェブサイトは問題をトラブルシューティングしたり、潜在的な不一致についてユーザーに直接通知したりできます。

ユーザーのデバイスタイプ(スマートフォンやタブレットなど)を理解することは、スピーチをする前に場の雰囲気を読むようなものです。効果的にアプローチを調整するための重要な鍵です。モバイルユーザーはデスクトップユーザーとは異なるインタラクションを期待しており、レスポンシブデザインの決定は正確なデバイス検出に依存することがよくあります。

クイックヒント:ユーザーエージェント文字列は、User-Agentヘッダーで全てのHTTPリクエストと共に自動的に送信されます。アクセスするために特別なことをする必要はありません。サーバーログや分析ツールにすでに存在しています。

ユーザーエージェントパーサーとは?

ここでユーザーエージェントパーサーの登場です。この文字列を取得し、あなたのために意味を理解します。誰かがどのブラウザとデバイスを使用しているかを把握するためのデコーダーリングのようなものだと考えてください。

これは単なるオタクな技術的なものではありません。分析、ユーザーエクスペリエンスのカスタマイズ、エラーの修正に非常に役立ちます。インターネットユーザーの72%が、デバイスで見栄えが良くない場合、ウェブサイトを完全に放棄することを考慮してください。そこでユーザーのデバイスを知ることが重要になります。

ユーザーエージェントパーサーは、次のような生の文字列を取得します:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36

そして、それを構造化された実用的なデータに変換します:

パーサーは、パターンマッチング、バージョン抽出、デバイス分類の重労働を行います。これがなければ、複雑な正規表現を書いたり、ブラウザシグネチャの無限のリストを維持したりすることになります。これは開発者が対処したくない悪夢です。

ユーザーエージェント解析が重要な理由

開発者や企業がユーザーエージェント解析に依存する理由は次のとおりです:

ユーザーエージェント文字列の構造

ユーザーエージェント文字列は半標準化された形式に従っていますが、年々ますます複雑になっています。通常遭遇するコンポーネントを分解してみましょう。

基本構造

ほとんどのユーザーエージェント文字列には、これらの要素が含まれています:

  1. プロダクトトークン:歴史的な理由から通常「Mozilla/5.0」で始まります
  2. プラットフォーム情報:括弧内のオペレーティングシステムとアーキテクチャの詳細
  3. エンジン情報:レンダリングエンジン(WebKitやGeckoなど)
  4. ブラウザ情報:実際のブラウザ名とバージョン

実際の例を分解してみましょう:

Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1
コンポーネント 意味
プロダクト Mozilla/5.0 レガシー互換性トークン
プラットフォーム iPhone; CPU iPhone OS 17_2 デバイスはiOS 17.2を実行しているiPhone
エンジン AppleWebKit/605.1.15 WebKitレンダリングエンジンのバージョン
ブラウザ Safari/604.1 Safariブラウザのバージョン

ブラウザ間の一般的なパターン

異なるブラウザには、ユーザーエージェント文字列のフォーマット方法に独自の癖があります。いくつかの例を示します:

Windows上のChrome:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36

macOS上のFirefox:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:122.0) Gecko/20100101 Firefox/122.0

Windows上のEdge:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0

ChromeとEdgeがほぼ同じに見えることに気づきましたか?それは、EdgeがChromiumベースで構築されているためです。唯一の違いは、最後の「Edg」トークンです。

プロのヒント:「Mozilla/5.0」プレフィックスは、歴史的な互換性の理由で存在します。初期のウェブ時代、サーバーはNetscape以外のブラウザをブロックしていたため、他のブラウザは差別を避けるためにMozillaのふりをし始めました。このレガシーは今日まで続いています。

ユーザーエージェント文字列を解読する方法

ユーザーエージェント文字列を手動で解読するのは面倒でエラーが発生しやすいです。そのため、専用のパーサーまたはツールを使用することが賢明なアプローチです。手動と自動の両方の方法を見てみましょう。

手動解析(推奨されません)

正規表現を書いて情報を抽出することもできますが、このアプローチには深刻な欠点があります:

JavaScriptでの手動解析の簡単な例を次に示します:

const userAgent = navigator.userAgent;

// ブラウザを検出(非常に簡略化)
let browser = 'Unknown';
if (userAgent.includes('Firefox')) browser = 'Firefox';
else if (userAgent.includes('Edg')) browser = 'Edge';
else if (userAgent.includes('Chrome')) browser = 'Chrome';
else if (userAgent.includes('Safari')) browser = 'Safari';

// OSを検出(非常に簡略化)
let os = 'Unknown';
if (userAgent.includes('Windows')) os = 'Windows';
else if (userAgent.includes('Mac')) os = 'macOS';
else if (userAgent.includes('Linux')) os = 'Linux';
else if (userAgent.includes('Android')) os = 'Android';
else if (userAgent.includes('iOS')) os = 'iOS';

このコードは脆弱で、無数のエッジケースを見逃しています。本番環境では使用しないでください。

ユーザーエージェントパーサーツールの使用

より良いアプローチは、専用のパーサーを使用することです。私たちのユーザーエージェントパーサーツールは、コーディングなしで即座に正確な解析を提供します。

ユーザーエージェント文字列を貼り付けるだけで、次の情報が得られます:

これは、迅速な分析、デバッグ、またはユーザーが実際にサイトにアクセスするために使用しているものを理解するのに最適です。

パーサーライブラリの使用

アプリケーションでのプログラマティックな解析には、いくつかの優れたライブラリが存在します:

JavaScript/Node.js:

Python:

PHP:

ユーザーエージェント解析の実装

さまざまなプログラミング言語とフレームワークにわたる実用的な実装例を見てみましょう。

JavaScript実装

人気のあるua-parser-jsライブラリを使用:

import UAParser from 'ua-parser-js';

const parser = new UAParser();
const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...';

parser.setUA(userAgent);

const result = parser.getResult();

console.log(result.browser.name);    // "Chrome"
console.log(result.browser.version); // "121.0.0.0"
console.log(result.os.name);         // "Windows"
console.log(result.os.version);      // "10"
console.log(result.device.type);     // undefined(デスクトップ)

ウェブアプリケーションでは、現在のユーザーのエージェントに直接アクセスできます:

const parser = new UAParser(navigator.userAgent);
const result = parser.getResult();

// デバイスに基づいてエクスペリエンスをカスタマイズ
if (result.device.type === 'mobile') {
  // モバイル最適化されたアセットを読み込む
  loadMobileUI();
} else {
  // デスクトップエクスペリエンスを読み込む
  loadDesktopUI();
}

サーバーサイド実装(Node.js/Express)

受信リクエストからユーザーエージェントを解析:

import express from 'express';
import UAParser from 'ua-parser-js';

const app = express();

app.get('/api/device-info', (req, res) => {
  const parser = new UAParser(req.headers['user-agent']);
  const result = parser.getResult();
  
  res.json({
    browser: result.browser,
    os: result.os,
    device: result.device
  });
});

// すべてのリクエストに解析されたUAを追加するミドルウェア
app.use((req, res, next) => {
  req.userAgent = new UAParser(req.headers['user-agent']).getResult();
  next();
});

Python実装

user-agentsライブラリを使用:

from user_agents import parse

user_agent_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X)...'
user_agent = parse(user_agent_string)

print(user_agent.browser.family)  # "Mobile Safari"
print(user_agent.browser.version_string)  # "17.2"
print(user_agent.os.family)  # "iOS"
print(user_agent.os.version_string)  # "17.2"
print(user_agent.is_mobile)  # True
print(user_agent.is_tablet)  # False
print(user_agent.is_pc)  # False

PHP実装

WhichBrowser/Parserを使用:

<?php
require 'vendor/autoload.php';

use WhichBrowser\Parser;

$userAgent = $_SERVER['HTTP_USER_AGENT'];
$result = new Parser($userAgent);

echo $result->browser->name;     // "Chrome"
echo $result->browser->version;  // "121.0"
echo $result->os->name;          // "Windows"
echo $result->os->version;       // "10"
echo $result->device->type;      // "desktop"

if ($result->isMobile()) {
    // モバイルコンテンツを提供
}
?>

プロのヒント:可能な限り、解析されたユーザーエージェントの結果をキャッシュしてください。解析は計算コストが低いですが、無料ではありません。トラフィックの多いアプリケーションでは、各一意のユーザーエージェント文字列の解析結果をキャッシュして、パフォーマンスを向上させてください。

📚 You May Also Like

Cron Parser Online: Understand and Visualize Cron Expressions DNS Lookup: Resolve Domain Names to IP Addresses MAC Address Lookup: Find Vendor Information for MAC Addresses SSL Checker: Verify Your SSL Certificate Installation