Google Books được xây dựng trên ngăn xếp công nghệ Android và kết hợp với các nền tảng máy tính từ ChromeOS. Hầu hết các ứng dụng web đều chạy giống nhau trên Google Sách như trên mọi thiết bị máy tính khác và sẽ thấy cùng một chuỗi Tác nhân người dùng như 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
Để xác định Googlebook chính xác hơn, chẳng hạn như cho số liệu phân tích hoặc để hướng người dùng tải ứng dụng Android tương thích của bạn xuống, bạn cần yêu cầu 2 User-Agent Client Hints: Platform và Mobile Client Hints. Cả hai đều là gợi ý có entropy thấp, cho phép bạn nhận được chúng mà không cần thêm yêu cầu hoặc quyền, giống như cách bạn làm với chuỗi User-Agent. Bạn có thể kết hợp các mẫu này trực tiếp vào quy trình phát hiện hiện có.
| Tiêu đề UA-CH | Giá trị cho Google Sách |
|---|---|
Sec-CH-UA-Platform |
"Android" |
Sec-CH-UA-Mobile |
?0 (Sai) |
Để phát hiện điều này trong trình duyệt, hãy sử dụng API navigator.userAgentData:
const isGooglebook = window?.navigator?.userAgentData?.platform === 'Android' && window?.navigator?.userAgentData?.mobile === false;
Do giảm User-Agent, nên một nền tảng dành riêng cho Google Books đã không được thêm vào gợi ý về ứng dụng Platform hoặc chuỗi tác nhân người dùng. Vì vậy, để đảm bảo có sự phân biệt giữa Google Books và phiên bản ChromeOS trước đó, gợi ý về ứng dụng đã được thay đổi thành "Android", phản ánh rằng Google Books tương thích với các ứng dụng Android.
Phát hiện phía máy chủ
Vì đây đều là các gợi ý của ứng dụng có entropy thấp, nên chúng sẽ được gửi đến máy chủ của bạn theo yêu cầu ban đầu từ ứng dụng và bạn có thể chọn chúng theo một trong những cách sau:
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"
Các gợi ý khác hữu ích cho ứng dụng
Mặc dù các gợi ý về ứng dụng khách Platform và Mobile là đủ để cho bạn biết người dùng đang sử dụng Googlebook, nhưng bạn có thể muốn biết thêm thông tin về thiết bị của họ.
Gợi ý về [Sec-CH-UA](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Sec-CH-UA)ứng dụng khách sẽ trả về danh sách được phân tách bằng dấu phẩy gồm phiên bản trình duyệt chính và các thương hiệu khác được liên kết với thiết bị. Việc này sẽ đơn giản hơn so với việc phân tích từ chuỗi User-Agent. Ngoài ra, còn có gợi ý
về Form Factorsmáy khách
(Sec-CH-UA-Form-Factors),
một
gợi ý có độ phức tạp cao,
cung cấp danh sách được phân tách bằng dấu phẩy các hệ số hình dạng cho thiết bị đã cho
(Máy tính, Máy tính bảng, Thiết bị di động, Ô tô, v.v.). Mặc dù thường là một kiểu dáng duy nhất, nhưng bạn có thể đưa tất cả các kiểu dáng áp dụng vào, vì vậy, một thiết bị có thể tháo rời có thể trả về "Desktop", "Tablet", chẳng hạn. Nếu cần biết chính xác hệ số hình dạng mà người dùng đang sử dụng, chứ không chỉ biết rằng đó không phải là thiết bị Android di động, thì bạn có thể sử dụng tiêu đề 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
Nếu ứng dụng đã bao gồm một gợi ý quan trọng sau khi xử lý tiêu đề Accept-CH, thì ứng dụng sẽ thử lại yêu cầu. Nhờ đó, bạn có thể phân phát một trang được tối ưu hoá thay vì phản hồi ban đầu. Vì điều này sẽ thêm một chuyến khứ hồi, nên bạn chỉ sử dụng nó cho những thay đổi có ý nghĩa trên trang và yêu cầu thông tin quan trọng.