2013年7月17日 星期三

別再用 user agent 來判斷是否是機器人了

使用 user agent 或 可否執行 javascript 都已經是很舊的作法了。user agent 很容易被修改;google 它可以讀得懂 flash 和 javascript ,最近也在 access log 發現 bing bot 開始爬 js 檔案,說不定之後也可以讀得懂 javascript 了。
單純要判斷是否為搜尋引擎的 bot,是可以用 user agent 來判斷。不需要把所有的 bot 名稱都記下來,判斷有沒有+http 的字串即可,列如:
  1. Bing:  Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
  2. Google Bot: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  3. Google Mobile Bot: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)
但是 Adsense 的 bot 例外,user agent 是 Mediapartners-Google

目前我們找到更簡單的方法是,判斷是否有 Accept-Language 。以我的 Chrome 為列,我的 request header 的 accept language 是 zh-TW,en-US;q=0.8,en;q=0.6,zh-CN;q=0.4 。在多國語系的網頁中,Accept Language 常被用來決定網頁內容要呈現何種語言,Accept Language 每一個國家地區都不一樣,所以通常 bot 是不會使用的。

這邊列表了 google bot, google mobile bot, curl, wget, facebook crawler, google plus one crawler, google page speed 等 bot  的 request header:https://gist.github.com/girvan/6017328

以 PHP 來說,我的做法是這樣子
define('IS_BOT', !isset($_SERVER['HTTP_ACCEPT_LANGUAGE']));