Googlebooks は Android 技術スタック上に構築され、ChromeOS のデスクトップ基盤と組み合わされています。ほとんどのウェブ アプリケーションは、Googlebooks で他のデスクトップ デバイスと同じように動作し、ChromeOS と同じユーザー エージェント文字列を参照します。
Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0; Safari/537.36
たとえば、アナリティクスで Googlebooks をより正確に識別したり、互換性のある Android アプリをダウンロードするようユーザーに促したりするには、Platform と Mobile の 2 つの User-Agent Client Hints をリクエストする必要があります。どちらも低エントロピー ヒントであり、User-Agent 文字列と同様に、追加のリクエストや権限なしで取得できます。既存の検出に直接組み込むことができます。
| UA-CH ヘッダー | Google ブックスの価値 |
|---|---|
Sec-CH-UA-Platform |
"Android" |
Sec-CH-UA-Mobile |
?0(False) |
ブラウザでこれを検出するには、navigator.userAgentData API を使用します。
const isGooglebook = window?.navigator?.userAgentData?.platform === 'Android' && window?.navigator?.userAgentData?.mobile === false;
ユーザー エージェント文字列削減により、Googlebook 固有のプラットフォームが Platform Client Hints またはユーザー エージェント文字列に追加されなかったため、Googlebook と以前のバージョンの ChromeOS を区別するために、Client Hints が "Android" に変更され、Googlebook が Android アプリと互換性があることが反映されました。
サーバーサイド検出
これらはどちらも低エントロピーのクライアント ヒントであるため、クライアントからの最初のリクエストでサーバーに送信されます。次のいずれかの方法で取得できます。
Node.js
const platform = req.headers['sec-ch-ua-platform'] || 'Not Sent';
const mobile = req.headers['sec-ch-ua-mobile'] || 'Not Sent';
const cleanPlatform = platform.replace(/"/g, '');
const isGooglebook = cleanPlatform === 'Android' && mobile === '?0';
Java
String platform = exchange.getRequestHeaders().getFirst("Sec-CH-UA-Platform");
if (platform == null) platform = "Not Sent";
String mobile = exchange.getRequestHeaders().getFirst("Sec-CH-UA-Mobile");
if (mobile == null) mobile = "Not Sent";
String cleanPlatform = platform.replace("\"", "");
boolean isGooglebook = cleanPlatform.equals("Android") && mobile.equals("?0");
Ruby
mobile = req['Sec-CH-UA-Mobile'] || 'Not Sent'
clean_platform = platform.gsub('"', '')
is_googlebook = clean_platform == 'Android' && mobile == '?0'
Python
platform = self.headers.get('Sec-CH-UA-Platform', 'Not Sent')
mobile = self.headers.get('Sec-CH-UA-Mobile', 'Not Sent')
clean_platform = platform.replace('"', '')
is_googlebook = clean_platform == 'Android' and mobile == '?0'
PHP
$mobile = $_SERVER['HTTP_SEC_CH_UA_MOBILE'] ?? 'Not Sent';
$cleanPlatform = str_replace('"', '', $platform);
$isGooglebook = ($cleanPlatform === 'Android' && $mobile === '?0');
Go
platform := r.Header.Get("Sec-CH-UA-Platform")
if platform == "" {
platform = "Not Sent"
}
mobile := r.Header.Get("Sec-CH-UA-Mobile")
if mobile == "" {
mobile = "Not Sent"
}
cleanPlatform := strings.ReplaceAll(platform, "\"", "")
isGooglebook := cleanPlatform == "Android" && mobile == "?0"
その他の有用なクライアント ヒント
Platform と Mobile のクライアント ヒントで、ユーザーが Googlebook を使用していることを確認できますが、デバイスに関する詳細情報が必要になることもあります。[Sec-CH-UA](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Sec-CH-UA) クライアント ヒントは、デバイスに関連付けられている主要なブラウザ バージョンとその他のブランドのカンマ区切りのリストを返します。これは、User-Agent 文字列から解析するよりも簡単です。Form Factors Client Hints(Sec-CH-UA-Form-Factors)もあります。これは、指定されたデバイスのフォーム ファクタ(パソコン、タブレット、モバイル、Automotive など)のカンマ区切りのリストを提供する高エントロピー ヒントです。多くの場合、これは単一のフォーム ファクタですが、該当するすべてのフォーム ファクタを含めることができるため、たとえば、取り外し可能なデバイスは "Desktop", "Tablet" を返す可能性があります。ユーザーが使用しているフォーム ファクタがモバイル Android デバイスではないことだけでなく、そのフォーム ファクタを正確に把握することが重要な場合は、Critical-CH ヘッダーを使用できます。
GET / HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Content-Type: text/html
Accept-CH: Sec-CH-UA-Form-Factors
Vary: Sec-CH-UA-Form-Factors
Critical-CH: Sec-CH-UA-Form-Factors
Accept-CH ヘッダーの処理後にクライアントが Critical Hints を含める場合、クライアントはリクエストを再試行します。これにより、最初のレスポンスではなく最適化されたページを提供できます。これにより、追加の往復が発生するため、重要な情報を必要とする意味のあるページ変更にのみ使用してください。