Identificar Googlebooks

O Google Livros é criado na pilha de tecnologia Android e emparelhado com fundamentos de computador do ChromeOS. A maioria dos aplicativos da Web deve ser executada da mesma forma no Google Livros e em qualquer outro dispositivo desktop, e vai mostrar a mesma string de user agent do 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 o Google Livros com mais precisão, por exemplo, para análise de dados, ou para direcionar os usuários a baixar seu app Android compatível, você precisa solicitar duas dicas de cliente HTTP do user agent: as dicas de cliente Platform e Mobile. Ambas são dicas de baixa entropia, permitindo que você as receba sem solicitações ou permissões adicionais, assim como faz com a string User-Agent. É possível incorporá-los diretamente à sua detecção atual.

Cabeçalho UA-CH Valor para o Google Livros
Sec-CH-UA-Platform "Android"
Sec-CH-UA-Mobile ?0 (False)

Para detectar isso no navegador, use a API navigator.userAgentData:

const isGooglebook = window?.navigator?.userAgentData?.platform === 'Android' && window?.navigator?.userAgentData?.mobile === false;

Devido à redução do user agent, uma plataforma específica do Google Livros não foi adicionada à dica de cliente Platform nem à string do user agent. Para garantir uma distinção entre o Google Livros e a versão anterior do ChromeOS, a dica de cliente foi alterada para "Android", refletindo que o Google Livros é compatível com apps Android.

Detecção do lado do servidor

Como essas são dicas de cliente de baixa entropia, elas serão enviadas ao seu servidor na solicitação inicial do cliente, e você poderá coletá-las de uma das seguintes maneiras:

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"

Outras dicas de cliente úteis

Embora as dicas de cliente Platform e Mobile sejam suficientes para informar que seus usuários estão usando um Googlebook, talvez você queira mais informações sobre o dispositivo deles. A dica de cliente [Sec-CH-UA](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Sec-CH-UA) retorna uma lista separada por vírgulas da versão principal do navegador e de outras marcas associadas ao dispositivo, o que é mais fácil de analisar do que fazer isso com a string do user agent. Há também a dica de cliente Form Factors (Sec-CH-UA-Form-Factors), uma dica de alta entropia, que fornece uma lista separada por vírgulas de formatos para o dispositivo em questão (computador, tablet, dispositivo móvel, automotivo etc.). Embora geralmente seja um único formato, todos os formatos aplicáveis podem ser incluídos. Por exemplo, um dispositivo removível pode retornar "Desktop", "Tablet". Se for importante saber qual formato seus usuários estão usando, e não apenas que não é um dispositivo Android móvel, use o cabeçalho 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

Se o cliente tivesse incluído uma dica crítica após o processamento do cabeçalho Accept-CH, ele repetiria a solicitação. Assim, você pode veicular uma página otimizada em vez da resposta inicial. Como isso adiciona uma viagem de ida e volta extra, use apenas para mudanças significativas na página que exigem as informações críticas.