ตรวจจับ Bot/Crawler ของ Search Engine ผ่าน User-Agent String เพื่อจัดการ Traffic, Analytics, หรือแสดงเนื้อหาแตกต่าง (Cloaking - ต้องระวัง Policy ของ Google)
วิธีพื้นฐาน: strpos + strtolower
function isBot($userAgent = null) {
$userAgent = $userAgent ?? ($_SERVER['HTTP_USER_AGENT'] ?? '');
$userAgent = strtolower($userAgent);
$botPatterns = [
'googlebot', 'bingbot', 'slurp', 'duckduckbot',
'baiduspider', 'yandexbot', 'facebot', 'twitterbot',
'linkedinbot', 'whatsapp', 'telegrambot', 'applebot',
'semrushbot', 'ahrefsbot', 'mj12bot', 'dotbot',
];
foreach ($botPatterns as $bot) {
if (strpos($userAgent, $bot) !== false) {
return true;
}
}
return false;
}
// ใช้งาน
if (isBot()) {
// Bot detected
// อาจ: ไม่นับ View, ไม่แสดง Ads, ให้ Crawl แบบ Static
}
วิธีที่ 2: Regex Pattern (ครอบคลุมกว่า)
function isBotRegex($userAgent = null) {
$userAgent = $userAgent ?? ($_SERVER['HTTP_USER_AGENT'] ?? '');
// Pattern รวม Bot/Crawler/Spider ทั่วไป
$pattern = '/bot|crawl|slurp|spider|mediapartners|teoma|ia_archiver|facebookexternalhit|twitterbot|linkedinbot|whatsapp|telegram/i';
return (bool)preg_match($pattern, $userAgent);
}
วิธีที่ 3: ใช้ Library (แนะนำสำหรับ Production)
// Composer: require jaybizzle/crawler-detect
use Jaybizzle\CrawlerDetect\CrawlerDetect;
$crawlerDetect = new CrawlerDetect();
if ($crawlerDetect->isCrawler()) {
$botName = $crawlerDetect->getCrawler(); // ชื่อ Bot ที่ตรวจพบ
// ...
}
// รายการ Bot ที่รองรับ 1000+ ตัว อัปเดตอยู่เสมอ
รายชื่อ Bot สำคัญที่ควรรู้
| Bot | User-Agent Keyword | Search Engine |
|---|---|---|
| Googlebot | googlebot | |
| Bingbot | bingbot | Bing |
| Slurp | slurp | Yahoo |
| DuckDuckBot | duckduckbot | DuckDuckGo |
| Baiduspider | baiduspider | Baidu (China) |
| YandexBot | yandexbot | Yandex (Russia) |
| facebookexternalhit | Social Preview | |
| twitterbot | Social Preview | |
| linkedinbot | Social Preview |
⚠️ ข้อควรระวัง: Cloaking และ SEO
- Google Webmaster Guidelines ห้าม Cloaking: แสดงเนื้อหาแตกต่างให้ Bot และ User
- ใช้ได้: ไม่นับ Page View, ไม่แสดง Analytics/Ads, ให้ Crawl หน้า Static แทน Dynamic
- ห้าม: แสดงเนื้อหา SEO Stuffing ให้ Bot, ซ่อน Link ให้ User
การตรวจสอบแบบ Manual (Testing)
// ทดสอบด้วย cURL
// curl -A "Googlebot/2.1 (+https://www.google.com/bot.html)" https://yoursite.com/
// หรือตั้งค่าใน PHP สำหรับทดสอบ
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (compatible; Googlebot/2.1; +https://www.google.com/bot.html)';
Robots.txt vs Bot Detection
Bot Detection ใน PHP เป็นการจัดการที่ Application Level ส่วน robots.txt เป็นคำสั่งที่ Bot อ่านก่อนเข้ามา ควรใช้ทั้งคู่:
# robots.txt
User-agent: *
Disallow: /admin/
Disallow: /api/
Allow: /
Sitemap: https://example.com/sitemap.xml