ウェブサイトの訪問者のデバイスとブラウザを検出する方法

出版日: 2024年1月9日

ウェブサイトの訪問者のデバイスとブラウザを検出する方法

このようなウェブサイト(danyelkoca.com)を運営する場合、訪問者のインサイトを得ることは非常に重要です。

測定しないものを改善することはできません。

ピーター・ドラッカー

ユーザーに関する重要な情報の1つは、彼らがサイトを訪れているときに使用しているデバイスとブラウザです。

なぜなら、この情報は次のような行動によってサイトを改善するのに役立つからです:

  1. 最も一般的に使用されているデバイスとブラウザに関する洞察を得て、サイトを適切に最適化する
  2. マイノリティデバイス&ブラウザ(例:タブレットデバイス、オペラブラウザ)だけに利益をもたらすアクションを優先度付けする
  3. 特定のデバイス&ブラウザに固有のパターンを特定する(例:Safariで特定の機能が使用されていない)

それでは、コードの詳細を見てみましょう!

1. デバイス検出

デバイスを特定するために、JavaScriptでwindow.navigator.userAgent関数を使用します。 この関数は以下のように文字列を返します:

console.log(window.navigator.userAgent);
// >> Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

結果は私のコンピュータで見えるものであり、これはChromeブラウザを使用したMacBook Proです。

出力を分析してみましょう:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

この関数がデバイスだけでなく、以下のような他の情報も返すことがわかります:

Mozilla/5.0, AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

今のところ、デバイスを示す出力の部分に焦点を当ててみましょう:

Macintosh; Intel Mac OS X 10_15_7

この関数を使用してデバイスを特定する場合、デバイスのモデルやデバイスで実行されているOSなど、情報が誤解を招く可能性があるため、デバイスを推測するだけで十分です。

userAgent文字列を使用して、このStackOverflowの回答に基づいて、ユーザーのデバイスをモバイルまたはデスクトップに分類するための正規表現を書くことができます。

let userAgentString = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
	
function deviceDetection(userAgentString) {
	let device = 'デスクトップ';

	if (
		/(android|bbd+|meego).+mobile|avantgo|bada/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)/|plucker|pocket|psp|series(4|6)0|symbian|treo|up.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(
			userAgentString
		)
	) {
		device = 'モバイル';
	}

	return device;
}

console.log(browserDetection(userAgentString));
// >> デスクトップ

2. ブラウザ検出

次に、ブラウザを示す出力の部分に焦点を当ててみましょう:

Mozilla/5.0, AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

userAgentを介したブラウザの検出は非常に複雑であり、この出力自体に3つのブラウザが含まれています:

  1. Mozilla/5.0(Firefox?)
  2. Chrome/120.0.0.0
  3. Safari/537.36

MDN Web Docsによると、UserAgent文字列を使用してブラウザについて推測するために以下の表が使用される可能性があります:

エンジン 含まれている必要があるもの 含まれていない必要があるもの
Firefox Firefox/xyz Seamonkey/xyz
Seamonkey Seamonkey/xyz
Chrome Chrome/xyz Chromium/xyzまたはEdg.*\/xyz
Chromium Chromium/xyz
Safari Safari/xyz Chromium/xyzまたはEdg.*\/xyz
Opera 15+(Blinkベースのエンジン) OPR/xyz
Opera 15+(Prestoベースのエンジン) Opera/xyz

したがって、MDNの条件に基づいてブラウザを定義するための正規表現を書いてみましょう。

let userAgentString = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';

function browserDetection(userAgentString) {
	let browser = 'unknown';

	if (/Firefox/.*/.test(userAgentString) && !/Seamonkey/.*/.test(userAgentString))
		browser = 'Firefox';
	else if (/Seamonkey/.*/.test(userAgentString)) browser = 'Seamonkey';
	else if (
		/Chrome/.*/.test(userAgentString) &&
		!/Chromium/.*/.test(userAgentString) &&
		!/Edg.*/.*/.test(userAgentString)
	)
		browser = 'Chrome';
	else if (/Chromium/.*/.test(userAgentString)) browser = 'Chromium';
	else if (
		/Safari/.*/.test(userAgentString) &&
		!/Chromium/.*/.test(userAgentString) &&
		!/Edg.*/.*/.test(userAgentString)
	)
		browser = 'Safari';
	else if (/OPR/.*/.test(userAgentString)) browser = 'Opera 15+ (Blink-based engine)';
	else if (/Opera/.*/.test(userAgentString)) browser = 'Opera 15+ (Presto-based engine)';

	return browser;
}

console.log(browserDetection(userAgentString));
// >> Chrome

私たちは、私のブラウザを正しく分類し、実際にChromeであることがわかりました。しかし、注意深い人々は、私のuserAgent文字列がSafariの条件も満たしていることに気付くでしょう。Chromeの条件がSafariよりも先にテストされるため、ブラウザはChromeと分類されますが、ChromeをSafariよりも先にテストすることが常に期待される結果をもたらすかどうかについては、さらなるテストが必要です。

3. 結論

上記の2つの関数、deviceDetectionbrowserDetectionを使用することで、ユーザーのデバイスとブラウザを正常に分類できます。注意すべき点として、window.navigator.userAgentはすべてのモダンブラウザと 互換性がありますので、安全に使用できます。ご質問がある場合は、以下のコメントセクションでお知らせください。

Happy hacking!

このブログは英語からChatGPTによって翻訳されました。不明な点がある場合は、お問い合わせページからご連絡ください。

コメントを残す

コメント

その他のブログ

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

2024/06/19

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

JavaScriptSvelteTooltip動的シンプルツールチップフロントエンド
JavaScriptを用いて東京都のインタラクティブな地図を作成する

2024/06/17

JavaScriptを用いて東京都のインタラクティブな地図を作成する

SvelteSVGJavaScriptTailwindインタラクティブな地図東京市区町村23区地図
Matplotlibで日本語文字化けを解決できる簡単な方法

2024/06/14

Matplotlibで日本語文字化けを解決できる簡単な方法

MatplotlibグラフチャートPython日本語文字化け問題バグ
書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

2024/06/13

書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

書評トーキング・トゥ・ストレンジャーズ「よく知らない人」について私たちが知っておくべきことマルコム・グラッドウェル
日本語で最もよく使われる3000字の漢字

2024/06/07

日本語で最もよく使われる3000字の漢字

3000よく使う準漢字使用回数漢字日本語漢字リスト漢字普及率日本語能力試験独学勉強単語
VSCodeでRegexを使用してReplaceする方法

2024/06/07

VSCodeでRegexを使用してReplaceする方法

VSCodeRegex検索置き換える条件付き置換FindReplaceConditional Replace
SvelteではReadable Storeを使用するな

2024/06/06

SvelteではReadable Storeを使用するな

SvelteReadableWritableステート管理ストアStore速度メモリファイルサイズ
GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

2024/06/05

GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

Gzip圧縮PakoWebサイトローディング速度SvelteKit
JavaScriptを使用してWebページ上でマウスが指している単語を特定する

2024/05/31

JavaScriptを使用してWebページ上でマウスが指している単語を特定する

JavascriptマウスPointerHoverWeb開発
SvelteとSVGを用いてインタラクティブな地図を作成する

2024/05/29

SvelteとSVGを用いてインタラクティブな地図を作成する

SvelteSVGインタラクティブな地図フロントエンド
書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

2024/05/28

書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

書評Originals誰もが「人と違うこと」ができる時代アダム・グラント & シェリル・サンドバーグ
Javascriptを使用して数独を解く方法

2024/05/27

Javascriptを使用して数独を解く方法

数独を解くアルゴリズムJavaScriptコーディング
ウェブサイトへのトラフィックを1か月で10倍に増やした方法

2024/05/26

ウェブサイトへのトラフィックを1か月で10倍に増やした方法

ウェブサイトへのトラフィック増加クリックインプレッションGoogle Search Console
人生はサイクリングに似ている

2024/05/24

人生はサイクリングに似ている

サイクリング人生哲学成功
JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

2024/05/19

JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

数独バックトラッキング・アルゴリズム完全なグリッドJavaScript
Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

2024/05/16

Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

Tailwind素晴らしいフロントエンドWeb開発
PythonとGitフックを使用してサイトマップを自動的に生成する

2024/05/15

PythonとGitフックを使用してサイトマップを自動的に生成する

GitフックPythonサイトマップSvelteKit
書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

2024/05/14

書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

書評Range (レンジ)David Epstein (デイビッド・エプスタイン)知識の「幅」が最強の武器になる
SvelteとSvelteKitはなんですか?

2024/05/13

SvelteとSvelteKitはなんですか?

SvelteSvelteKitFront-endVite
SvelteKitで国際化(多言語化)

2024/05/12

SvelteKitで国際化(多言語化)

国際化多言語SvelteKitI18N
SvelteでCachingを用いてDeploy時間を短縮する方法

2024/05/11

SvelteでCachingを用いてDeploy時間を短縮する方法

SvelteEnhanced ImageCachingDeploy Time
SvelteとIntersection Oberverによるレイジーローディング

2024/05/10

SvelteとIntersection Oberverによるレイジーローディング

レイジーローディングウェブサイト速度の最適化SvelteIntersection Observer
遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

2024/05/10

遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

株式書状ポートフォリ最適化遺伝的アルゴリズムPython
Pythonを用いてShapeFileをSVGに変換できる方法

2024/05/09

Pythonを用いてShapeFileをSVGに変換できる方法

ShapeFileSVGPythonGeoJSON
Svelteの反応性:変数、バインディング、およびキー関数

2024/05/08

Svelteの反応性:変数、バインディング、およびキー関数

Svelte反応性バインディングキー関数
書評 | 孫子の兵法

2024/05/07

書評 | 孫子の兵法

書評The Art Of War (兵法)Sun Tzu (孫子)Thomas Cleary
スペシャリストは終了。ゼネラリスト万歳!

2024/05/06

スペシャリストは終了。ゼネラリスト万歳!

専門家ジェネラリストパラダイムシフトソフトウエア・エンジニアリング
トルコ人の有権者の投票行動をPythonでの分析

2024/05/03

トルコ人の有権者の投票行動をPythonでの分析

トルコ投票者年齢分析国家投票有権者行動分析
Seleniumを用いてトルコ投票データベースを作る方法

2024/05/01

Seleniumを用いてトルコ投票データベースを作る方法

PythonSeleniumWeb Scrapingトルコ国家投票
SvelteとTailwindを使用してInfinite Scrollできる方法

2024/04/30

SvelteとTailwindを使用してInfinite Scrollできる方法

SvelteTailwindInfinite ScrollFront-end
1年間以内で日本語を駆使できるようになるための方法

2024/04/29

1年間以内で日本語を駆使できるようになるための方法

日本語短時間言語学習日本語能力試験ビジネス日本語
SvelteとTailwindを用いたWebサイトテンプレート

2024/04/25

SvelteとTailwindを用いたWebサイトテンプレート

Web開発フロントエンドSvelteTailwind
怠惰なエンジニアとひどいデザイン

2024/01/29

怠惰なエンジニアとひどいデザイン

怠け者エンジニア質の悪い製品StarbucksSBI証券
偉大さについて

2024/01/28

偉大さについて

雄大さ人生の意味満足できる人生目的
MacBook で PDF を PNG に変換する

2024/01/28

MacBook で PDF を PNG に変換する

PDFPNGMacBookAutomator
2023年振り返り:24冊の読んだ本のまとめ

2023/12/31

2023年振り返り:24冊の読んだ本のまとめ

読書 2023振り返り
Python PILを使用して写真コラージュを作成する方法

2023/12/30

Python PILを使用して写真コラージュを作成する方法

PythonPIL画像処理コラージュ
ChatGPT回答の解析

2024/01/19

ChatGPT回答の解析

ChatGPT大規模言語モデル機械学習生成AI