Identyfikowanie Googlebooków

Googlebooks są zbudowane na stosie technologicznym Androida i połączone z podstawami komputerowymi z ChromeOS. Większość aplikacji internetowych powinna działać na Googlebooks tak samo jak na każdym innym urządzeniu stacjonarnym i będzie widzieć ten sam ciąg User Agent co 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

Aby dokładniej identyfikować Google Play Books, np. na potrzeby analizy, lub kierować użytkowników do pobrania zgodnej aplikacji na Androida, musisz wysłać żądanie 2 wskazówek klienta User-Agent: wskazówki Platform i Mobile. Oba te elementy to wskazówki o niskiej entropii, które możesz uzyskać bez dodatkowych żądań lub uprawnień, tak jak w przypadku ciągu User-Agent. Możesz je włączyć bezpośrednio do istniejącego wykrywania.

Nagłówek UA-CH Wartość w przypadku Googlebooks
Sec-CH-UA-Platform "Android"
Sec-CH-UA-Mobile ?0 (Fałsz)

Aby wykryć to w przeglądarce, użyj interfejsu navigator.userAgentData API:

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

Ze względu na redukcję klienta użytkownika, platformy specyficznej dla Googlebooks nie dodano do ciągu klienta użytkownika ani wskazówek dotyczących klienta Platform. Aby odróżnić Googlebooks od poprzedniej wersji ChromeOS, wskazówki dotyczące klienta zostały zmienione na "Android", co oznacza, że Googlebooks są zgodne z aplikacjami na Androida.

Wykrywanie po stronie serwera

Są to wskazówki klienta o niskiej entropii, więc będą wysyłane na serwer przy pierwszym żądaniu klienta. Możesz je pobrać w jeden z tych sposobów:

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"

Inne przydatne wskazówki dotyczące klienta

Wskazówki klienta Platform i Mobile wystarczą, aby dowiedzieć się, że użytkownicy korzystają z Googlebooka, ale możesz potrzebować więcej informacji o ich urządzeniach. Wskazówka dotycząca klienta[Sec-CH-UA](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Sec-CH-UA)zwraca listę rozdzieloną przecinkami głównej wersji przeglądarki i innych marek powiązanych z urządzeniem, co jest łatwiejsze do przeanalizowania niż ciąg klienta użytkownika. Jest też Form Factorsclient hint (Sec-CH-UA-Form-Factors), czyli wskazówka o wysokiej entropii, która zawiera rozdzieloną przecinkami listę formatów danego urządzenia (komputer, tablet, telefon komórkowy, samochód itp.). Chociaż zwykle jest to jeden format, można uwzględnić wszystkie odpowiednie formaty, więc urządzenie odłączane może zwrócić np. "Desktop", "Tablet". Jeśli ważne jest, aby dokładnie wiedzieć, jakiego rodzaju urządzenia używają Twoi użytkownicy, a nie tylko to, że nie jest to urządzenie mobilne z Androidem, możesz użyć nagłówka 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

Jeśli klient uwzględniłby krytyczną wskazówkę po przetworzeniu nagłówka Accept-CH, ponowi żądanie. Dzięki temu możesz wyświetlać zoptymalizowaną stronę zamiast początkowej odpowiedzi. Ponieważ dodaje to dodatkową podróż w obie strony, używaj tej metody tylko w przypadku istotnych zmian na stronie, które wymagają krytycznych informacji.