Los Googlebooks se basan en la pila tecnológica de Android y se combinan con los fundamentos de escritorio de ChromeOS. La mayoría de las aplicaciones web deberían ejecutarse de la misma manera en Googlebooks que en cualquier otro dispositivo de escritorio y verán la misma cadena de User Agent que 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
Para identificar Googlebooks con mayor precisión, por ejemplo, para análisis o para dirigir a los usuarios a que descarguen tu app para Android compatible, debes solicitar dos User-Agent Client Hints: las sugerencias de cliente Platform y Mobile. Ambas son sugerencias de baja entropía, lo que te permite obtenerlas sin solicitudes ni permisos adicionales, al igual que lo haces con la cadena User-Agent. Puedes incorporarlos directamente en tu detección existente.
| Encabezado UA-CH | Valor para Googlebooks |
|---|---|
Sec-CH-UA-Platform |
"Android" |
Sec-CH-UA-Mobile |
?0 (falso) |
Para detectar esto en el navegador, usa la API de navigator.userAgentData:
const isGooglebook = window?.navigator?.userAgentData?.platform === 'Android' && window?.navigator?.userAgentData?.mobile === false;
Debido a la reducción del encabezado User-Agent, no se agregó una plataforma específica de Googlebooks al parámetro de sugerencia del cliente Platform ni a la cadena del encabezado User-Agent. Por lo tanto, para garantizar que hubiera una distinción entre Googlebooks y la versión anterior de ChromeOS, se cambió el parámetro de sugerencia del cliente a "Android", lo que refleja que Googlebooks es compatible con las apps para Android.
Detección del servidor
Como ambas son sugerencias del cliente de baja entropía, se enviarán a tu servidor en la solicitud inicial del cliente, y podrás recuperarlas de una de las siguientes maneras:
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"
Otros Client Hints útiles
Si bien las sugerencias del cliente Platform y Mobile son suficientes para saber que tus usuarios están usando una Googlebook, es posible que desees obtener más información sobre su dispositivo.
La sugerencia del cliente [Sec-CH-UA](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Sec-CH-UA) devuelve una lista separada por comas de la versión principal del navegador y otras marcas asociadas con el dispositivo, que es más fácil de analizar que hacerlo desde la cadena de usuario-agente. También existe la sugerencia del cliente Form Factors (Sec-CH-UA-Form-Factors), una sugerencia de alta entropía, que proporciona una lista separada por comas de los factores de forma para el dispositivo determinado (computadora de escritorio, tablet, dispositivo móvil, automóvil, etcétera). Si bien a menudo se trata de un solo factor de forma, se podrían incluir todos los factores de forma aplicables, por lo que un dispositivo desmontable podría devolver "Desktop", "Tablet", por ejemplo. Si es importante saber con precisión qué factor de forma usan tus usuarios y no solo que no es un dispositivo Android móvil, puedes usar el encabezado 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
Si el cliente hubiera incluido una sugerencia crítica después de procesar el encabezado Accept-CH, volverá a intentar la solicitud. Esto te permite publicar una página optimizada en lugar de la respuesta inicial. Dado que esto agrega un viaje de ida y vuelta adicional, úsalo solo para cambios significativos en la página que requieran la información crítica.