วิธีดู URL ที่ Google แสดงผลใน Google Analytics
เผยแพร่แล้ว: 2021-06-11ก่อนอื่น ขอขอบคุณคริสเตียนที่ช่วยฉันแปลเป็นพิเศษ!
เป็นเวลาหลายปีแล้วที่ Google เริ่มทำการปรับปรุงอย่างมากในด้านความสามารถในการรวบรวมข้อมูลและรับเนื้อหาที่โหลดด้วย Javascript ในลักษณะเดียวกับที่ผู้ใช้จริงที่มีโทรศัพท์มือถือจะได้เห็น
อย่างไรก็ตาม Google จะไม่สามารถรวบรวมข้อมูล URL ทั้งหมดที่พบได้แม้ว่าจะปรับปรุงโครงสร้างพื้นฐานก็ตาม เนื่องจากค่าใช้จ่ายในการรวบรวมข้อมูลและการแสดงผล (กระบวนการในการแปลงเอกสาร HTML ในโครงสร้างภาพ) นั้นยิ่งใหญ่กว่าการรวบรวมข้อมูลและรับ HTML ของ URL Google เองก็รับทราบเรื่องนี้ ดังนั้นสิ่งสำคัญคือต้องตรวจสอบให้แน่ใจว่า Google จะค้นหา แสดงผล และจัดทำดัชนี URL ที่สำคัญที่สุดของไซต์ของเรา โดยเฉพาะในไซต์ขนาดใหญ่และ/หรือไซต์ที่ขึ้นอยู่กับ JS ที่ดำเนินการโดยไคลเอ็นต์ (CSR, Client Side Rendering)
หลายปีก่อน เพื่อที่จะประเมินคุณค่าเนื้อหาของ URL และตัดสินใจว่าจะเพิ่มลงในดัชนีหรือไม่ Google ก็เพียงพอแล้วที่จะรับ HTML ของ URL (รวมถึงภาพที่เชื่อมโยงอยู่ที่นั่น) HTML นั้นเป็นเนื้อหาที่ Google ใช้ในการจัดทำดัชนีและจัดอันดับ URL โดยไม่คำนึงถึงว่า HTML นั้นได้รับการแก้ไขโดยใช้ Javascript หลังจากแสดงผลหรือไม่
ขณะนี้ ด้วยเฟรมเวิร์ก Javascript ที่ปรับเปลี่ยนฝั่งไคลเอ็นต์ HTML Google จำเป็นต้องรับ HTML, โค้ด JS, สไตล์ CSS และทรัพยากรอื่นๆ (เช่น รูปภาพ ด้านหน้า ฯลฯ) เพื่อแสดงเนื้อหาและรับ HTML สุดท้าย จึงสามารถตัดสินใจได้ว่าจะไปที่ดัชนีหรือไม่
กระบวนการทั้งหมดนี้ไม่ได้ทำในชุดเดียวตามที่ผู้ใช้ทั่วไปเห็น: ดำเนินการในสองขั้นตอน ขั้นแรก Google รวบรวมข้อมูล URL และรับ HTML "unrendered" (อย่างที่เคยทำมาจนถึงตอนนี้) และหลังจากนั้น (โดยไม่มีระยะเวลาที่กำหนดไว้ตายตัว) จะได้รับทรัพยากรที่เหลือที่อ้างอิงใน HTML นั้นและพยายาม เพื่อแสดงหน้าเพื่อรับ HTML ที่แสดงผลขั้นสุดท้าย ขั้นตอนที่สองนี้เรียกว่า "การสร้างดัชนีคลื่นลูกที่สอง"
เราไม่จำเป็นต้องมีความรู้ด้านเทคนิคมากนักเพื่อทำความเข้าใจว่า ในการรวบรวมข้อมูลและจัดทำดัชนี URL จำนวนหนึ่ง ค่าใช้จ่ายในการแสดงผลนั้นมากกว่าการรับ HTML ที่ไม่ได้แสดงผล ทั้งในระยะเวลาและทรัพยากร ดังนั้น Google จะสามารถรวบรวมข้อมูลและจัดทำดัชนี URL ได้น้อยลงโดยใช้ทรัพยากรที่มีจำกัดในปริมาณเท่ากัน หากจำเป็นต้องแสดงผล นั่นเป็นเหตุผลที่ Google จำเป็นต้องตัดสินใจ/จัดลำดับความสำคัญว่าจะแสดง URL ใดและ URL ใดที่ไม่แสดงผล
ในการตัดสินว่าควรรวบรวมข้อมูล URL ใดต่อไป Google จะคำนวณความน่าจะเป็นของ URL นั้นที่มีการเปลี่ยนแปลงตั้งแต่ครั้งล่าสุดที่มีการรวบรวมข้อมูล โดยคำนึงถึงปัจจัยอื่นๆ เป็น PageRank ของแต่ละ URL หรือหากผู้ดูแลเว็บได้กำหนดการตั้งค่าเฉพาะใดๆ เกี่ยวกับการรวบรวมข้อมูล ความถี่. สิ่งนี้สมเหตุสมผลเนื่องจากการใช้ทรัพยากรอย่างจำกัดในการรวบรวมข้อมูลบางอย่างที่ไม่เปลี่ยนแปลงนั้นไม่มีประโยชน์
ฉันต้องการแบ่งปันบทความนี้กับคุณเนื่องจากฉันคิดว่าบทความนี้ไม่ค่อยเป็นที่รู้จักและสามารถเปิดเผยได้มากเพื่อให้เข้าใจว่า Google ตัดสินใจเลือก URL ใดที่จะรวบรวมข้อมูลต่อไป มันเขียนโดยวิศวกรของ Google และเป็นนามธรรมทางคณิตศาสตร์เพื่อแก้ปัญหาที่แท้จริง อย่ากลัวกับสูตรทางคณิตศาสตร์ เพราะมันอธิบายได้อย่างสมบูรณ์แบบสำหรับผู้ที่ไม่ใช่ Data Scientist
หลังจากตัดสินใจว่าจะรวบรวมข้อมูล URL ใดต่อไป Googlebot จำเป็นต้องตัดสินใจสำหรับ URL ที่รวบรวมข้อมูลแต่ละรายการ ว่าควรแสดงผล URL นั้นหรือไม่ และหากตัดสินใจแสดงผล URL จะต้องใช้ทรัพยากรทั้งหมดเพื่อให้บรรลุเป้าหมายนั้น ในการตัดสินใจว่าจะต้องร้องขอทรัพยากรที่จำเป็นแต่ละรายการหรือไม่ มันอาจจะใช้กระบวนการทางคณิตศาสตร์ที่คล้ายกัน แต่มีความแตกต่างบางอย่าง เช่น เวลาแคช ค่าใช้จ่ายในการรับทรัพยากร ฯลฯ
ด้วยเหตุนี้ จึงเป็นสิ่งสำคัญมากที่จะต้องรู้ว่า URL ใดจากไซต์ของเราที่ Google รวบรวมข้อมูลและ URL ใดที่กำลังแสดงผล วิธีง่ายๆ ในการรับข้อมูลนั้น ซึ่งเราใช้ที่ Funnel▼Punk (ที่เราทำงานกับเว็บไซต์ขนาดใหญ่) คือการวิเคราะห์บันทึกของเซิร์ฟเวอร์ (นี่คือโพสต์เกี่ยวกับสิ่งนั้นในบล็อกของฉัน เป็นภาษาสเปน และอีกอันในบล็อกของ Oncrawl ) เพื่อดูภาพรวมของสิ่งที่ Googlebot กำลังทำในไซต์ของเรา การวิเคราะห์บันทึกอาจเป็นเรื่องที่น่าเบื่อหน่ายและมีราคาแพงสำหรับคนจำนวนมาก นั่นเป็นเหตุผลที่ฉันต้องการแบ่งปันวิธีการติดตาม URL ที่ Googlebot แสดงผลใน Google Analytics กับคุณ
[กรณีศึกษา] การจัดการการรวบรวมข้อมูลบอทของ Google
URL ติดตามผลที่แสดงผลโดย Google
วิธีการนี้ค่อนข้างง่าย อย่างน้อยสำหรับทีม dev และสำหรับเว็บมาสเตอร์ที่เคยทำงานกับ PHP หรือสิ่งที่คล้ายคลึงกัน มี 3 ขั้นตอน:
- เพิ่มโค้ดจาวาสคริปต์
โค้ดจะตรวจพบเมื่อ Googlebot เรียกใช้ Javascript ในลักษณะเดียวกับที่ผู้ใช้ทั่วไปทำ และจะโหลดรูปภาพโดยใช้ Javascript (พิกเซลโปร่งใส) - การกำหนดค่าเซิร์ฟเวอร์
กำหนดค่าเซิร์ฟเวอร์ให้รันไฟล์ PHP (หรือภาษาการเขียนโปรแกรมอื่นที่ใช้ในแบ็กเอนด์) เมื่อมีการร้องขอ URL ของพิกเซลแบบโปร่งใส - ส่งข้อมูลไปยัง Google Analytics
ไฟล์ PHP ของเราจะตรวจสอบว่า Googlebot เป็น Googlebot จริงหรือไม่ ถ้าใช่ จะส่งข้อมูลไปยัง Google Analytics
เพิ่มโค้ดจาวาสคริปต์
ในการทดลองต่างๆ ที่ฉันได้ลอง ฉันได้ตรวจสอบว่า Googlebot จะดำเนินการ Javascript เฉพาะเมื่อโค้ด Javascript ไม่ต้องการการโต้ตอบกับผู้ใช้ ตัวอย่างเช่น Googlebot จะดำเนินการโค้ด Javascript ใดๆ ที่ทริกเกอร์ด้วยเหตุการณ์ onload หรือ onready ในตัวอย่างนี้ เราจะสร้างฟังก์ชันที่จะถูกทริกเกอร์ด้วยเหตุการณ์ onLoad นั่นคือเมื่อองค์ประกอบทั้งหมดของหน้าถูกโหลด
ฟังก์ชันนี้จะตรวจสอบว่า User Agent มีบ็อตที่รู้จักของ Googlebot หรือไม่ และหากมี จะโหลดรูปภาพ (พิกเซลโปร่งใส) ซึ่งเราจะตั้งชื่อเป็น TransparentPixelGooglebot.gif
<script> window.addEventListener ("โหลด", ฟังก์ชัน (){ var botPattern = "googlebot|Googlebot-Mobile|Googlebot-Image|Google favicon|Mediapartners-Google"; var re = ใหม่ RegExp (botPattern, 'i'); var userAgent = navigator.userAgent; ถ้า (re.test (userAgent)) { ไคลเอ็นต์ var = XMLHttpRequest ใหม่ (); var trackRenderURL='https://www.mecagoenlos.com/TransparentPixelGooglebot.gif?OriginUrl='+window.location.href; client.open('GET', trackRenderURL); client.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8'); client.send(null); } }); </script>ทุกครั้งที่ Googlebot เข้าถึงและรัน Javascript ฟังก์ชันของเราจะถูกเรียกใช้ โดยโหลดรูปภาพ "TransparentPixelGooglebot.gif" โดยเพิ่มพารามิเตอร์บางอย่างลงใน URL ของรูปภาพ ซึ่งเราจะระบุ URL เฉพาะที่มีการเข้าถึง
ในตัวแปรนี้ เราจะเขียน URL แบบเต็มซึ่งจะถูกขอให้โหลดภาพ “TransparentPixelGooglebot.gif” ของเรา ซึ่งเราจะเพิ่ม URL ที่เข้าถึงได้เช่นเดียวกับตัวแทนผู้ใช้ที่ร้องขอ
var trackRenderURL='https://www.mecagoenlos.com/TransparentPixelGooglebot.gif?OriginUrl='+window.location.href;
การกำหนดค่าเซิร์ฟเวอร์ (.htaccess)
ขั้นตอนต่อไปของเราคือกำหนดค่าเซิร์ฟเวอร์ของเรา เพื่อให้ทุกครั้งที่มีการร้องขอ URL ของพิกเซล (TransparentPixelGooglebot.gif) ไฟล์ PHP จะถูกดำเนินการ (GooglebotRenderJS.php)
ในการดำเนินการนี้ เราต้องทำการเปลี่ยนแปลงบางอย่างในไฟล์ .htaccess ของเรา (เนื่องจากเราใช้เซิร์ฟเวอร์ Apache และ PHP เป็นภาษาโปรแกรมแบ็คเอนด์)
สองบรรทัดเฉพาะเหล่านี้คือสิ่งที่จะทำให้สิ่งนั้นเกิดขึ้น:
RewriteCond %{REQUEST_URI} TransparentPixelGooglebot.gif RewriteRule TransparentPixelGooglebot.gif(.*)$ https://www.mecagoenlos.com.com/GooglebotRenderJS.php$1
อย่างที่คุณเดาได้ พารามิเตอร์ที่มาพร้อมกับคำขอพิกเซลจะถูกเผยแพร่เพื่อให้ไฟล์ PHP (GooglebotRenderJS.php) สามารถ "อ่าน" ได้
Oncrawl Data³
ส่งข้อมูลไปยัง Google Analytics จากไฟล์ PHP
ในขั้นตอนสุดท้ายของเรา เราสร้างไฟล์ PHP (GooglebotRenderJS.php) ที่จะดำเนินการทุกครั้งที่มีการร้องขอพิกเซล (TransparentPixelGooglebot.gif)
ไฟล์นี้จะ:
- ตรวจสอบโดยใช้ Reverse DNS ว่าคำขอนั้นมาจาก Googlebot หรือ Googlebot ปลอมโดยใช้ User Agent ของ Googlebot
- ระบุประเภทของบอท (Googlebot Mobile, รูปภาพ, โฆษณา ฯลฯ)
- ส่งข้อมูลไปยัง Google Analytics (โดยใช้โปรโตคอลการวัดของ Google Analytics) ภายในเหตุการณ์ที่เราจะกำหนดตัวแปรต่อไปนี้:
- หมวดหมู่เหตุการณ์: “GoogleRenderFromHtaccess”
- การดำเนินการเหตุการณ์: URL ที่แสดงผล (ผู้อ้างอิงคำขอพิกเซล)
- ป้ายกำกับเหตุการณ์: สตริงที่เชื่อมระหว่าง User Agent, IP และหากบ็อตเป็น Googlebot จริง (“ของจริง”) หรือของปลอม (“ของปลอม”) ฉันส่งทั้งสามคนไปที่ GA เพื่อดูว่าการระบุ Googlebot ทำงานอย่างถูกต้องหรือไม่
- *ข้อสำคัญ: ฉันเก็บ IP ไว้เพียงสองสามวันเพื่อทดสอบว่าทุกอย่างถูกต้องหรือไม่ ฉันหยุดทำหลังจากนั้น เผื่อว่ามีปัญหากับกฎหมายคุ้มครองข้อมูล
<?php ส่วนหัว ("คำสั่ง Pragma: ไม่มีแคช"); ส่วนหัว ("คำสั่งแคช: ไม่มีแคช"); ส่วนหัว ("การควบคุมแคช: ไม่มีแคช"); ส่วนหัว ("Pragma: ไม่มีแคช"); ส่วนหัว ("หมดอายุ: 0"); ถ้า ($_GET["OriginUrl"]) $src=$_GET["OriginUrl"]; อื่น $src = $_SERVER['HTTP_REFERER']; $UA=$_SERVER["HTTP_USER_Agent"]; $RenderParameters=$_GET["RenderParameters"]; $RenderParameters=$_GET["RenderParameters"]; ฟังก์ชัน GoogleCheker($Ip){ # เพื่อหลีกเลี่ยงการค้นหาที่ไม่จำเป็น ให้ตรวจสอบว่า UA ตรงกับหนึ่งใน . หรือไม่ #บอทที่เราชอบ $hostname=gethostbyaddr($Ip); $ip_by_hostname=gethostbyname($ชื่อโฮสต์); if(preg_match("/googlebot/i",$ชื่อโฮสต์)) ถ้า ($ip_by_hostname == $Ip) คืนค่าจริง; อื่น คืนค่าเท็จ; อื่น คืนค่าเท็จ; } ฟังก์ชัน GoogleChekerExtend($Ip){ # เพื่อหลีกเลี่ยงการค้นหาที่ไม่จำเป็น ให้ตรวจสอบว่า UA ตรงกับหนึ่งใน . หรือไม่ #บอทที่เราชอบ $hostname=gethostbyaddr($Ip); $ip_by_hostname=gethostbyname($ชื่อโฮสต์); if(preg_match("/\.google\.com[\.]?$/i",$hostname)) ถ้า ($ip_by_hostname == $Ip) คืนค่าจริง; อื่น คืนค่าเท็จ; อื่น คืนค่าเท็จ; } $botname="เริ่มต้น"; $bots = array('Mediapartners-Google[ /]([0-9.3]{1,10})' => 'Google Mediapartners', 'Mediapartners-Google' => 'Google Mediapartners', 'Googl(e|ebot)(-Image)/([0-9.3]{1,10})' => 'Google รูปภาพ', 'Googl(e|ebot)(-Image)/' => 'Google รูปภาพ', '^gsa-crawler' => 'Google', 'Googl(e|ebot)(-Sitemaps)/([0-9]{1,10})?' => 'Google-Sitemaps', 'GsiteCrawler[ /v]*([0-9.az]{1,10})?' => 'Google-Sitemaps', 'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps', 'Mobile.*Googlebot' => 'Google-Mobile', '^AdsBot-Google' => 'Google-AdsBot', '^Feedfetcher-Google' => 'Google-Feedfetcher', 'เข้ากันได้; Google Desktop' => 'Google Desktop', 'Googlebot' => 'Googlebot'); foreach( $bots เป็น $pattern => $bot ) { ถ้า ( preg_match( '#'.$pattern.'#i' , $UA) == 1 ) { $botname = preg_replace ( "/\\s{1,}/i" , '-' , $bot ); หยุดพัก; } } ถ้า(GoogleCheker($_SERVER['REMOTE_ADDR'])) $isGoogle="จริง"; elseif(GoogleChekerExtend($_SERVER['REMOTE_ADDR'])) $isGoogle="ขยาย"; อื่น $isGoogle="ปลอม"; คลาส BotTracker { แทร็กฟังก์ชันคงที่ ($s, $params){ $bot = ""; $data = อาร์เรย์ ( 'วี' => 1, 'tid' => 'UA-XXXXXXX-1', 'cid' => self::generate_uuid(), 't' => 'เหตุการณ์', 'dh' => $s['HTTP_HOST'], 'dl' => $s['REQUEST_URI'], 'dr' => $s['HTTP_REFERER'], 'dp' => $s['REQUEST_URI'], 'dt' => $params['page_title'], 'ck' => $s['HTTP_USER_Agent'], 'uip' => $s['REMOTE_ADDR'], 'นิ' => 1, 'ec' => 'GoogleRenderHtaccess', 'el' => $params['UA']." - ".$params["RenderParameters"]." -" .$params['botname']." - ".$params['isGoogle']" - ip: ".$s['REMOTE_ADDR'], //ลบหลังการทดสอบ //'el' => $params['UA']." - ".$params["RenderParameters"]." -" .$params['botname']" - ".$params['isGoogle'] , 'ea' => $params['RenderedURL'] ); $url = 'http://www.google-analytics.com/collect'; $เนื้อหา = http_build_query($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, $s['HTTP_USER_AGENT']); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array('ประเภทเนื้อหา: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_ENCODING , "gzip"); curl_setopt($ch, CURLOPT_POSTFIELDS, $เนื้อหา); $result = curl_exec($ch); $info= curl_getinfo($ch); curl_close($ch); } ฟังก์ชันส่วนตัวแบบคงที่ generate_uuid () { กลับ sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0x0fff ) | 0x4000, mt_rand( 0, 0x3fff ) | 0x8000, mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) ); } } BotTracker::track($_SERVER, array("page_title"=>"VirtualRenderTitle","RenderedURL"=>$src,"isGoogle"=>$isGoogle,"botname"=>$botname,"UA"=>$UA) ,"RenderParameters"=>$RenderParameters)); ?>
ตรวจสอบว่าการตั้งค่าของเราทำงานใน Google Analytics หรือไม่
ทุกอย่างพร้อมแล้ว! ตอนนี้เราสามารถตรวจสอบว่าทุกอย่างทำงานตามที่คาดไว้หรือไม่ ในการทำเช่นนั้น เราสามารถใช้รายงานแบบเรียลไทม์จาก Google Analytics และเลือกรายงาน "เหตุการณ์" ในแท็บอื่น เราเปิด Search Console ไปที่คุณสมบัติของเว็บไซต์ของเรา และใช้ตัวตรวจสอบ URL เพื่อบังคับให้ Google รวบรวมข้อมูลและแสดงผล URL ใดๆ ของเรา หากทุกอย่างทำงาน คุณจะเห็นเหตุการณ์ใหม่ในรายงานเหตุการณ์แบบเรียลไทม์ของ Google Analytics
ดังที่คุณจะเห็น เหตุการณ์เหล่านี้จะไม่ถูกนับเป็นผู้ใช้ที่ใช้งานอยู่ในไซต์ของเรา เนื่องจากกิจกรรมได้รับการกำหนดค่าด้วยพารามิเตอร์ "nonInteraction"
หากเราคลิกที่หมวดหมู่เหตุการณ์ “GoogleRenderFromHtaccess” เราจะสามารถเห็น User Agent, IP และหากระบุบอทว่าเป็นของจริงหรือของปลอม
ข้อผิดพลาดในการติดตามที่สร้างโดย Google พยายามแสดง URL
เราได้เห็นแล้วว่าเราสามารถติดตามและตรวจสอบว่า URL ใดที่ Google แสดงผล แต่เราสามารถไปต่อและติดตามว่าข้อผิดพลาด Javascript ใดที่สร้างขึ้นเมื่อ Google พยายามแสดง URL ของไซต์ของเรา
เมื่อแสดงผล Javascript ข้อผิดพลาดสามารถสร้างขึ้นได้ซึ่งมองเห็นได้เฉพาะในเบราว์เซอร์ของผู้ใช้ (และไม่ใช่บนเซิร์ฟเวอร์ของเรา) ดังนั้นการติดตามข้อผิดพลาดเหล่านั้นจึงไม่ใช่เรื่องง่าย
ทุกวันนี้ หากเราต้องการตรวจสอบข้อผิดพลาด Javascript ที่สร้างขึ้นเมื่อ Googlebot แสดง URL ของเรา เราสามารถทำได้โดยใช้ตัวตรวจสอบ URL ใน Search Console เท่านั้น
- ตรวจสอบ URL:
- คลิกที่ "ทดสอบ URL สด":
- ตรวจสอบว่ามีข้อผิดพลาดหรือไม่:
การทำเช่นนี้ด้วยตนเองสำหรับ URL จำนวนมากเป็นงานหนัก แต่เราสามารถใช้โค้ดที่ฉันเพิ่งแสดงให้คุณเห็นเพื่อติดตามว่ามีข้อผิดพลาดของ Javascript หรือไม่เมื่อ Googlebot พยายามแสดง URL ของเรา
ตัวอย่างข้อผิดพลาดที่สร้างขึ้นโดยมีวัตถุประสงค์เพื่อตรวจสอบว่ารหัสทำงานหรือไม่:
เพิ่มโค้ดจาวาสคริปต์
เช่นเดียวกับที่เราทำในตัวอย่างก่อนหน้านี้ เราจะดักจับข้อผิดพลาดของ Javascript โดยใช้โค้ดบรรทัดนี้: "window.addEventListener('error', function(e)"
ทุกครั้งที่มีการสร้างข้อผิดพลาด ฟังก์ชันที่จะช่วยให้เราสามารถบันทึกข้อผิดพลาดเหล่านั้นและส่งไปยัง Google Analytics จะถูกดำเนินการ สิ่งนี้จะคล้ายกับสิ่งที่เราทำในตัวอย่างก่อนหน้านี้มาก โดยมีข้อแม้ว่า ฟังก์ชันนี้จะถูกดำเนินการเมื่อมีข้อผิดพลาดของ Javascript เท่านั้น
window.addEventListener ('ข้อผิดพลาด', ฟังก์ชัน (e) { var botPattern = "googlebot|Googlebot-Mobile|Googlebot-Image|Google favicon|Mediapartners-Google"; var re = ใหม่ RegExp (botPattern, 'i'); var userAgent = navigator.userAgent; ถ้า (re.test (userAgent)) { ไคลเอ็นต์ var = XMLHttpRequest ใหม่ (); var ErrorsURLPixel='https://www.mecagoenlos.com/TransparentPixelGooglebotError.gif?OriginUrl='+window.location.href+'&textError='+unescape(encodeURIComponent(e.message))+'&LineError='+unescape(encodeURIComponent) (e.lineno.toString()))+'&UA='+unescape(encodeURIComponent(userAgent)); client.open('GET',ErrorsURLPixel); client.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8'); client.send(จ); } });
รหัสนี้จะเรียกใช้ฟังก์ชันที่จะโหลดพิกเซลโปร่งใสอื่น (TransparentPixelGooglebotError.gif) โดยเพิ่มเป็นพารามิเตอร์ที่จะแสดง URL ข้อผิดพลาดและ User Agent สร้างคำขอไปยัง URL ดังนี้:
var ErrorsURLPixel='https://www.mecagoenlos.com/TransparentPixelGooglebotError.gif?OriginUrl='+window.location.href+'&textError='+unescape(encodeURIComponent(e.message))+'&LineError='+unescape(encodeURIComponent) (e.lineno.toString()))+'&UA='+unescape(encodeURIComponent(userAgent));
การกำหนดค่าเซิร์ฟเวอร์ (.htaccess)
เช่นเดียวกับในตัวอย่างก่อนหน้านี้ เราจะเพิ่มกฎบางอย่างใน .htaccess เพื่อตรวจจับเมื่อพิกเซลถูกโหลดและรันไฟล์ PHP:
RewriteCond %{REQUEST_URI} TransparentPixelGooglebotError.gif RewriteRule TransparentPixelGooglebotError.gif(.*)$ https://modelode.com/GooglebotErrorRenderJS.php$1
ด้วยวิธีนี้ เมื่อใดก็ตามที่มีการร้องขอ “https://www.mecagoenlos.com/TransparentPixelGooglebotError.gif” ไฟล์ PHP “GooglebotErrorRenderJS.php” จะถูกดำเนินการ
ไฟล์ PHP
ไฟล์ PHP นี้จะตรวจสอบว่า Googlebot เป็นของจริงหรือไม่ และส่งข้อมูลไปยัง Google Analytics โดยใช้เหตุการณ์ที่มีหมวดหมู่ “ErrorsGoogleRender” โดยใช้ URL ที่แสดงผลเป็นการดำเนินการของเหตุการณ์ และข้อผิดพลาดนั้นเป็นป้ายกำกับของเหตุการณ์
<?php ส่วนหัว ("คำสั่ง Pragma: ไม่มีแคช"); ส่วนหัว ("คำสั่งแคช: ไม่มีแคช"); ส่วนหัว ("การควบคุมแคช: ไม่มีแคช"); ส่วนหัว ("Pragma: ไม่มีแคช"); ส่วนหัว ("หมดอายุ: 0"); ถ้า ($_GET["OriginUrl"]) $src=$_GET["OriginUrl"]; อื่น $src = $_SERVER['HTTP_REFERER']; $UA=$_SERVER["HTTP_USER_Agent"]; $RenderParameters=$_GET["RenderParameters"]; $RenderParameters=$_GET["RenderParameters"]; $textError=$_GET["textError"]; $lineError=$_GET["LineError"]; ฟังก์ชัน GoogleCheker($Ip){ # เพื่อหลีกเลี่ยงการค้นหาที่ไม่จำเป็น ให้ตรวจสอบว่า UA ตรงกับหนึ่งใน . หรือไม่ #บอทที่เราชอบ $hostname=gethostbyaddr($Ip); $ip_by_hostname=gethostbyname($ชื่อโฮสต์); if(preg_match("/googlebot/i",$ชื่อโฮสต์)) ถ้า ($ip_by_hostname == $Ip) คืนค่าจริง; อื่น คืนค่าเท็จ; อื่น คืนค่าเท็จ; } ฟังก์ชัน GoogleChekerExtend($Ip){ # เพื่อหลีกเลี่ยงการค้นหาที่ไม่จำเป็น ให้ตรวจสอบว่า UA ตรงกับหนึ่งใน . หรือไม่ #บอทที่เราชอบ $hostname=gethostbyaddr($Ip); $ip_by_hostname=gethostbyname($ชื่อโฮสต์); if(preg_match("/\.google\.com[\.]?$/i",$hostname)) ถ้า ($ip_by_hostname == $Ip) คืนค่าจริง; อื่น คืนค่าเท็จ; อื่น คืนค่าเท็จ; } $botname="เริ่มต้น"; $bots = array('Mediapartners-Google[ /]([0-9.3]{1,10})' => 'Google Mediapartners', 'Mediapartners-Google' => 'Google Mediapartners', 'Googl(e|ebot)(-Image)/([0-9.3]{1,10})' => 'Google รูปภาพ', 'Googl(e|ebot)(-Image)/' => 'Google รูปภาพ', '^gsa-crawler' => 'Google', 'Googl(e|ebot)(-Sitemaps)/([0-9]{1,10})?' => 'Google-Sitemaps', 'GsiteCrawler[ /v]*([0-9.az]{1,10})?' => 'Google-Sitemaps', 'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps', 'Mobile.*Googlebot' => 'Google-Mobile', '^AdsBot-Google' => 'Google-AdsBot', '^Feedfetcher-Google' => 'Google-Feedfetcher', 'เข้ากันได้; Google Desktop' => 'Google Desktop', 'Googlebot' => 'Googlebot'); foreach( $bots เป็น $pattern => $bot ) { ถ้า ( preg_match( '#'.$pattern.'#i' , $UA) == 1 ) { $botname = preg_replace ( "/\\s{1,}/i" , '-' , $bot ); หยุดพัก; } } ถ้า(GoogleCheker($_SERVER['REMOTE_ADDR'])) $isGoogle="จริง"; elseif(GoogleChekerExtend($_SERVER['REMOTE_ADDR'])) $isGoogle="ขยาย"; อื่น $isGoogle="ปลอม"; คลาส BotTracker { แทร็กฟังก์ชันคงที่ ($s, $params){ $bot = ""; $data = อาร์เรย์ ( 'วี' => 1, 'tid' => 'UA-XXXX-1', 'cid' => self::generate_uuid(), 't' => 'เหตุการณ์', 'dh' => $s['HTTP_HOST'], 'dl' => $s['REQUEST_URI'], 'dr' => $s['HTTP_REFERER'], 'dp' => $s['REQUEST_URI'], 'dt' => $params['page_title'], 'ck' => $s['HTTP_USER_Agent'], 'uip' => $s['REMOTE_ADDR'], 'นิ' => 1, 'ec' => 'ErrorsGoogleRender', 'el' => $params['textError']." (บรรทัด:".$params['lineError']") - ".$params['UA']" - " .$params['botname' ]." - ".$params['isGoogle']."- ip: ".$s['REMOTE_ADDR'], //ลบหลังการทดสอบ //'el' => $params['UA']." - ".$params["RenderParameters"]." -" .$params['botname']" - ".$params['isGoogle'] , 'ea' => $params['RenderedURL'] ); $url = 'http://www.google-analytics.com/collect'; $เนื้อหา = http_build_query($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, $s['HTTP_USER_AGENT']); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array('ประเภทเนื้อหา: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_ENCODING , "gzip"); curl_setopt($ch, CURLOPT_POSTFIELDS, $เนื้อหา); $result = curl_exec($ch); $info= curl_getinfo($ch); curl_close($ch); } ฟังก์ชันส่วนตัวแบบคงที่ generate_uuid () { ผลตอบแทน sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0x0fff ) | 0x4000, mt_rand( 0, 0x3fff ) | 0x8000, mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) ); } } BotTracker::track($_SERVER, array("page_title"=>"VirtualRenderTitle","RenderedURL"=>$src,"isGoogle"=>$isGoogle,"botname"=>$botname,"UA"=>$UA) ,"RenderParameters"=>$RenderParameters,"textError"=>$textError,"lineError"=>$lineError)); ?>
ตอนนี้เราสามารถเห็นแล้วว่าข้อผิดพลาด Javascript ใดเกิดขึ้นเมื่อ Google พยายามแสดง URL ของเรา
ส่งข้อมูลไปยัง Google Analytics จากไฟล์ PHP ของเรา
ด้วยการใช้งานนี้ เราสามารถดูว่าข้อผิดพลาด Javascript ใดที่ถูกสร้างขึ้นเมื่อ Google พยายามแสดง URL ของเรา และ URL ใดที่เกิดขึ้น
ฉันมีข้อมูลอื่นๆ มากมายที่ต้องติดตามเกี่ยวกับกระบวนการแสดงผลของ Google เช่น การตรวจสอบว่า Googlebot พยายามโต้ตอบบางอย่างหรือไม่ (เช่น การเลื่อน การคลิก หรือเหตุการณ์ Javascript อื่นๆ) แต่ฉันจะเก็บไว้ที่โพสต์อื่น หวังว่าคุณจะชอบมัน!