GoogleBooks построен на технологическом стеке Android и работает в паре с настольной операционной системой ChromeOS. Большинство веб-приложений должны работать на GoogleBooks так же, как и на любом другом настольном устройстве, и будут видеть ту же строку User Agent, что и в 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, вам необходимо запросить два клиентских запроса User-Agent : запрос Platform и запрос Mobile приложения. Оба запроса имеют низкую энтропию , что позволяет получать их без дополнительных запросов или разрешений, как и строку User-Agent. Вы можете интегрировать их непосредственно в существующую систему обнаружения.
| Заголовок UA-CH | Ценность для GoogleBooks |
|---|---|
Sec-CH-UA-Platform | "Android" |
Sec-CH-UA-Mobile | ?0 (Ложь) |
Для определения этого в браузере используйте API navigator.userAgentData :
const isGooglebook = window?.navigator?.userAgentData?.platform === 'Android' && window?.navigator?.userAgentData?.mobile === false;
В связи с сокращением User-Agent , специфичная для Googlebooks платформа не была добавлена в подсказку клиента Platform или строку User-Agent, поэтому, чтобы обеспечить различие между Googlebooks и предыдущей версией ChromeOS, подсказка клиента была изменена на "Android" , что отражает совместимость Googlebooks с приложениями 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");
Руби
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');
Идти
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 достаточно, чтобы понять, что ваши пользователи используют Google Books, вам может потребоваться дополнительная информация об их устройстве. Подсказка клиента [Sec-CH-UA](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Sec-CH-UA) возвращает список основных версий браузера и других марок, связанных с устройством, разделенных запятыми, что проще для анализа, чем делать это из строки User-Agent. Существует также подсказка клиента Form Factors ( Sec-CH-UA-Form-Factors ), подсказка с высокой энтропией , которая предоставляет список форм-факторов для данного устройства, разделенных запятыми (настольный компьютер, планшет, мобильный телефон, автомобильный компьютер и т. д.). Хотя это часто один форм-фактор, могут быть включены все применимые форм-факторы, поэтому для отсоединяемого устройства может быть возвращено, например "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 , он повторит запрос. Это позволяет отобразить оптимизированную страницу вместо первоначального ответа. Поскольку это добавляет дополнительный цикл обмена данными, используйте это только для существенных изменений страницы, требующих критически важной информации.