מכשירי Googlebook מבוססים על סטאק התוכנות של Android ומשולבים עם רכיבי ליבה של ChromeOS למחשבים. רוב אפליקציות האינטרנט אמורות לפעול ב-Googlebooks כמו בכל מכשיר שולחני אחר, והן יראו את אותו מחרוזת של סוכן משתמש כמו 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 (False) |
כדי לזהות את זה בדפדפן, משתמשים ב-API navigator.userAgentData:
const isGooglebook = window?.navigator?.userAgentData?.platform === 'Android' && window?.navigator?.userAgentData?.mobile === false;
בגלל הפחתת סוכני משתמשים, לא נוספה פלטפורמה ספציפית של Googlebooks לאיסוף אותות בצד הלקוח Platform או למחרוזת סוכן המשתמש, ולכן כדי להבטיח שיש הבחנה בין Googlebooks לבין הגרסה הקודמת של ChromeOS, איסוף אותות בצד הלקוח שונה ל-"Android", מה שמשקף את העובדה שאפליקציות ל-Android תואמות ל-Googlebooks.
זיהוי בצד השרת
מכיוון שאלה רמזים ללקוח עם אנטרופיה נמוכה, הם יישלחו לשרת בבקשה הראשונית מהלקוח, ותוכלו לאחזר אותם באחת מהדרכים הבאות:
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) מחזיר רשימה מופרדת בפסיקים של הגרסה הראשית של הדפדפן ומותגים אחרים שמשויכים למכשיר. קל יותר לנתח את הרשימה הזו מאשר לנתח את המחרוזת של סוכן המשתמש. יש גם את רמז הלקוח 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, הוא ינסה לשלוח את הבקשה שוב. כך תוכלו להציג דף שעבר אופטימיזציה במקום התגובה הראשונית. הוספת נסיעה הלוך ושוב נוספת, ולכן כדאי להשתמש בה רק לשינויים משמעותיים בדף שדורשים את המידע הקריטי.