PHPでユーザーエージェントの情報を簡単に取得出来るライブラリ「php-browser-detector」 の紹介です。
クライアント(ユーザー)がHTTPサーバーにアクセスすると、サーバー側には"HTTP_USER_AGENT"という形で下記の様にブラウザやOSの情報が送信されます。
# OS: Mac OS X, Version 10.11.5
# Browser: Chrome, Version 51.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36
ログインが絡むサービスだとユーザーエージェントをデータベースに保存することはよくありますが、そのままだと文字列を加工する必要があるため、OSやブラウザの固有情報を取り出すのに手間が掛かります。
そんなユーザーエージェントを簡単に取り出すことが出来るライブラリが「php-browser-detector」です。
このライブラリを使うと " os -> name " " browser -> version "の様に簡単にクライアントの情報が取り出せるようになります。
それではphp-browser-detectorを使ってみましょう!
パッケージのインストールにはcomposerを使います。プロジェクトのホームディレクトリ上から下記のコマンドを打つとライブラリのインストールが開始されます。
# インストールコマンド
composer require sinergi/browser-detector
インストールが完了すると、下記のようにuse構文でクラスをインポートするとライブラリが使用できます。提供されている機能はブラウザ、OS、デバイス、言語の4種類。
use Sinergi\BrowserDetector\Browser;
use Sinergi\BrowserDetector\Os;
use Sinergi\BrowserDetector\Device;
use Sinergi\BrowserDetector\Language;
// php 7では下記のようにも書けます
// use Sinergi\BrowserDetector\{
// Browser,
// Os,
// Device,
// Language
// };
// ブラウザ用
$browser = new Browser();
$browser->getName(); // ブラウザ名を取得
// output: Chrome
// OS用
$os = new Os();
$os->getName(); // OS名を取得
// output: OS X
// go on ...
下記がブラウザ用に用意されている機能。ユーザーエージェントから情報を抜き出すだけではなく、アクセスがFacebook経由のWebViewなのか判別出来たりもします。
use Sinergi\BrowserDetector\Browser;
$browser = new Browser();
$browser->getName(); // ブラウザ名の取得
$browser->getVersion(); // ブラウザのバージョンを取得
// return: bool (true OR false)
$browser->isChromeFrame(); // chrome frame判別
$browser->isRobot(); // Robotからのアクセスなのか判別
$browser->isBrowser(); // ブラウザからアクセスなのか判別
$browser->isFacebookWebView(); // Facebook WebViewなのか判別
ブラウザ判別用のクラス定数も沢山用意されているので、if文などの条件式の時も自分で文字列をいれる必要がありません。
use Sinergi\BrowserDetector\Browser;
$browser = new Browser();
// ブラウザによって条件をつける場合の定数
if($browser->getName() == Browser::CHROME)
{
// do something.
}
# 用意されているブラウザ用のクラス定数
# 使い方: Browser::OPERA, Browser:: SAFARI ...
/*
"UNKNOWN" => "unknown"
"VIVALDI" => "Vivaldi"
"OPERA" => "Opera"
"OPERA_MINI" => "Opera Mini"
"WEBTV" => "WebTV"
"IE" => "Internet Explorer"
"POCKET_IE" => "Pocket Internet Explorer"
"KONQUEROR" => "Konqueror"
"ICAB" => "iCab"
"OMNIWEB" => "OmniWeb"
"FIREBIRD" => "Firebird"
"FIREFOX" => "Firefox"
"SEAMONKEY" => "SeaMonkey"
"ICEWEASEL" => "Iceweasel"
"SHIRETOKO" => "Shiretoko"
"MOZILLA" => "Mozilla"
"AMAYA" => "Amaya"
"LYNX" => "Lynx"
"SAFARI" => "Safari"
"CHROME" => "Chrome"
"NAVIGATOR" => "Navigator"
"GOOGLEBOT" => "GoogleBot"
"SLURP" => "Yahoo! Slurp"
"W3CVALIDATOR" => "W3C Validator"
"BLACKBERRY" => "BlackBerry"
"ICECAT" => "IceCat"
"NOKIA_S60" => "Nokia S60 OSS Browser"
"NOKIA" => "Nokia Browser"
"MSN" => "MSN Browser"
"MSNBOT" => "MSN Bot"
"NETSCAPE_NAVIGATOR" => "Netscape Navigator"
"GALEON" => "Galeon"
"NETPOSITIVE" => "NetPositive"
"PHOENIX" => "Phoenix"
"GSA" => "Google Search Appliance"
"YANDEX" => "Yandex"
"EDGE" => "Edge"
"VERSION_UNKNOWN" => "unknown"
*/
続いてOS用。OS名とバージョンが取得出来る関数が用意されています。
use Sinergi\BrowserDetector\Os;
$os = new Os();
$os->getName(); // OS名を取得
$os->getVersion(); // OSのバージョンを取得
// return: bool
$os->isMobile(); // モバイルOSか判別 e.x.p Android, iOS ...
# 用意されているOS用のクラス定数
# Os::OSX, Os::Windows ... etc
/*
"UNKNOWN" => "unknown"
"OSX" => "OS X"
"IOS" => "iOS"
"SYMBOS" => "SymbOS"
"WINDOWS" => "Windows"
"ANDROID" => "Android"
"LINUX" => "Linux"
"NOKIA" => "Nokia"
"BLACKBERRY" => "BlackBerry"
"FREEBSD" => "FreeBSD"
"OPENBSD" => "OpenBSD"
"NETBSD" => "NetBSD"
"OPENSOLARIS" => "OpenSolaris"
"SUNOS" => "SunOS"
"OS2" => "OS2"
"BEOS" => "BeOS"
"WINDOWS_PHONE" => "Windows Phone"
"CHROME_OS" => "Chrome OS"
"VERSION_UNKNOWN" => "unknown"
*/
最後にモバイルデバイス用と、言語の判別用のクラス。
use Sinergi\BrowserDetector\{Device, Language};
$device = Device();
$device->getName(); // deviceを取得
# デバイス用のクラス定数
/*
"UNKNOWN" => "unknown"
"IPAD" => "iPad"
"IPHONE" => "iPhone"
"WINDOWS_PHONE" => "Windows Phone"
*/
$lang = Language();
$lang->getLanguage(); // 言語を取得
以上がphp-browser-detectorの紹介でした。
アクセスログ等をデータベースに保存する時や、テンプレートエンジン内で使えば、特定ブラウザやOSに向けて機能を制限したリなど一味変わったことができそうですね。
sinergi/php-browser-detector