プログラミングガール

Developing a better me

Java|クローラーかどうか判別する

なにがしたい

サイトへアクセスしたユーザーエージェントがクローラーのものか判断する。

実装

/**
 * 例外対応するクローラーUAリスト
 */
public static final ArrayList<String> CRAWLER_UA = ImmutableList.of("Googlebot", "Yahoo!", "bingbot", "Yeti", "Baidu", "YandexBot");

// クローラUAの判定
if (isNotCrawlerUa(userAgent, crawlerUas)) {
    // アフィリエイトリダイレクト
    StringBuilder redirectUrl = new StringBuilder(AFFILIATE_SERVER_URL);
    redirectUrl.append(URLEncoder.encode(Base64Util.encode(requestUrl.toString().getBytes()), ENCODE_UTF8));
    ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
    ((HttpServletResponse) response).setHeader("Location", redirectUrl.toString());
} else {
    ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
    String redirectUrl = requestUrl.toString().replaceAll("([^=/]+)-(\\d{3})[/]*$", "");
    ((HttpServletResponse) response).setHeader("Location", redirectUrl);
}

/**
 * クローラーUA判定メソッド
 * クローラーでなければTrueを返却
 */
public boolean isNotCrawlerUa(String userAgent, List<String> crawlerUas) {
    for (String crawlerUa : crawlerUas)
        if (userAgent.toLowerCase().contains(crawlerUa.toLowerCase())) {
            return false;
        }
    return true;
}