Googlebooks สร้างขึ้นบน Technology Stack ของ 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 2 รายการ ได้แก่ Platform และคำแนะนำสำหรับไคลเอ็นต์ Mobile ทั้ง 2 อย่างนี้เป็นคำแนะนำที่มีเอนโทรปีต่ำ
ซึ่งช่วยให้คุณรับข้อมูลดังกล่าวได้โดยไม่ต้องมีคำขอหรือสิทธิ์เพิ่มเติม เช่นเดียวกับ
ที่คุณทำกับสตริง User-Agent คุณสามารถรวมเข้ากับการตรวจจับที่มีอยู่ได้โดยตรง
| ส่วนหัว UA-CH | ค่าสำหรับ Googlebook |
|---|---|
Sec-CH-UA-Platform |
"Android" |
Sec-CH-UA-Mobile |
?0 (เท็จ) |
หากต้องการตรวจหาในเบราว์เซอร์ ให้ใช้ navigator.userAgentData API ดังนี้
const isGooglebook = window?.navigator?.userAgentData?.platform === 'Android' && window?.navigator?.userAgentData?.mobile === false;
เนื่องจากการลด User-Agent เราจึงไม่ได้เพิ่มแพลตฟอร์มเฉพาะของ Googlebooks ลงในคำแนะนำไคลเอ็นต์ Platform หรือสตริง User-Agent ดังนั้นเพื่อให้มั่นใจว่า Googlebooks จะแตกต่างจาก ChromeOS เวอร์ชันก่อนหน้า เราจึงเปลี่ยนคำแนะนำไคลเอ็นต์เป็น "Android" ซึ่งแสดงให้เห็นว่า Googlebooks เข้ากันได้กับแอป Android
การตรวจหาฝั่งเซิร์ฟเวอร์
เนื่องจากทั้ง 2 รายการเป็นคำแนะนำไคลเอ็นต์ที่มีเอนโทรปีต่ำ ระบบจึงจะส่งไปยังเซิร์ฟเวอร์ ในคำขอเริ่มต้นจากไคลเอ็นต์ และคุณจะเลือกคำขอเหล่านั้นได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
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"
คำแนะนำสำหรับไคลเอ็นต์อื่นๆ ที่มีประโยชน์
แม้ว่าเคล็ดลับไคลเอ็นต์ Platform และ Mobile จะเพียงพอที่จะแจ้งให้คุณทราบว่าผู้ใช้กำลังใช้ Googlebook แต่คุณอาจต้องการข้อมูลเพิ่มเติมเกี่ยวกับอุปกรณ์ของผู้ใช้
คำแนะนำสำหรับไคลเอ็นต์
[Sec-CH-UA](https://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Sec-CH-UA)
จะแสดงรายการเวอร์ชันเบราว์เซอร์หลักและ
แบรนด์อื่นๆ ที่เชื่อมโยงกับอุปกรณ์โดยคั่นด้วยคอมมา ซึ่งแยกวิเคราะห์ได้ง่ายกว่า
การแยกวิเคราะห์จากสตริง User-Agent นอกจากนี้ยังมี Form Factors Client
Hint
(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 แล้ว ไคลเอ็นต์จะลองส่งคำขออีกครั้ง ซึ่งช่วยให้คุณแสดงหน้าเว็บที่เพิ่มประสิทธิภาพแล้วแทนที่จะเป็นคำตอบเริ่มต้น เนื่องจากวิธีนี้จะเพิ่มการรับส่งข้อมูลแบบไป-กลับอีกรอบ ให้ใช้เฉพาะกับการเปลี่ยนแปลงหน้าเว็บที่มีความหมายซึ่งต้องใช้ข้อมูลสำคัญ