twitter facebook

BOTのアクセスだけ排除する!GooglePlaceAPI 利用者のために~

google place API を使って 緯度経度であれこれしてるのですが。大量のボットのアクセスのせいで、数日で数万円課金されてorz
いちおう 料金確認はこちら。 おそらく数時間に一回請求が更新されるようですが、 見るたびにしかも深夜帯に数千円単位で増えて・・・ ので 破産しないために徹夜で処置。
推測で、犯人はたぶんロボットだろう・・・ と察しがついてたので、あたりをつけて。ちなみに環境は CentOS7で、PHP5 の いわゆるLAMP です。
ログの確認
// SSLの場合 tail -f /var/log/httpd/ssl_access_log // SSLじゃない場合 tail -f /var/log/httpd/access_log
アクセスの多かったUA の文字列の一部分
grapeshotcrawler、googlebot、bingbot、semrushbot、mj12bot
robots.txt やなんやでやろうかとおもったけど、よくわからないクローラーなんかもあるので、プログラムで対応。

いちおうプログラム抜粋

UAを確認すると、bot,crawl などの文字列でパターンマッチングして排除がてっとりばやそうです。

UAで排除

php
$ua = trim($_SERVER["HTTP_USER_AGENT"]);
$ua = mb_strtolower($ua) ; //半角に

if ( preg_match("/bot|crawl|daum/", $ua ) || $ua=='' )
{
	// とりあえず bot.html に飛ばす。
	header("Location: /bot.html") ;

}

IPアドレスで排除

じつは、結局使わなかったのですが・・・
// 排除したいIP
$ip_black_list[] = "xxx.xxx.xxx.xxx" ;
$ip_black_list[] = "yyy.yyy.yyy.yyy" ;

// アクセスしてきたIP
$ip = $_SERVER["REMOTE_ADDR"] ;

if (in_array($ip, $ip_black_list)) {
	header("Location: /bot.html") ;
}
in_array関数 が便利。同じように正規表現を使う場合は preg_grep関数

おまけ)ログ書き出し。

アクセスログを書き出すと、大量になるので。 bingやgoogle などの UAをもつやつはログにさえ書き出さない。みたいなプログラム。
$log = "/tmp/test.log"
$write = true ;


// こいつらはログにかかない。
if ( preg_match("/bingbot|semrushbot|dotbot|google/", $ua) ) $write=false ;

if ( $write) file_put_contents($log , "SUCCESS\t" . $ua . "\t" .  $ip  . "\n", FILE_APPEND | LOCK_EX);

予算とアラート

ちなみに APIを使用して、設定予算オーバーするとアラートがくる仕組みは googleさんにあります。ただ、請求が止まるわけではないです。
きてたメール
AUTHOR
@えのえの
最終更新日 2018/09/21
FAVORITE good stock
LINK TAG
記法を見る