おはようございます.トップページにアクセスカウント機能追加とあと一つ機能を追加しました.あと一つは他の閲覧者が何の記事を見ているか表示する機能になります.ちなみに最初、プッシャーというモノを使用して構築していたんですが、レンタルサーバーの規約違反になりそうなので取りやめてJSで一分間隔でtxtファイルを見に行くように変更しました.
作っていて分かったことはロボット巡回が多い...ボットはブロックするように処理を行ったのですが、ヘッドレスブラウザなどで巡回してくるボットには対応出来ていないのが現状です.正直なところ見分けがつかない.
<?php
/**
* クローラーや不正ボットを検出する関数
*
* @return bool クローラー/不正ボットの場合はfalse、それ以外はtrue
*/
function isLegitimateUser() {
// User-Agentを取得
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
// User-Agentが空の場合は疑わしい
if (empty($userAgent)) {
return false;
}
// 既知のクローラー/ボットのパターン
$botPatterns = [
'bot', 'crawl', 'spider', 'slurp', 'scraper',
'headless', 'phantom', 'selenium', 'puppeteer',
'curl', 'wget', 'python', 'java', 'perl',
'scrapy', 'http_request', 'httpclient', 'axios',
'postman', 'insomnia', 'ahrefs', 'semrush',
'mj12bot', 'dotbot', 'rogerbot', 'yandex',
'baiduspider', 'exabot', 'facebot', 'ia_archiver'
];
// User-Agentに疑わしいパターンが含まれているかチェック
$userAgentLower = strtolower($userAgent);
foreach ($botPatterns as $pattern) {
if (strpos($userAgentLower, $pattern) !== false) {
return false;
}
}
// 許可する正規のクローラー(必要に応じて)
$allowedBots = [
'googlebot', 'bingbot', 'slackbot', 'twitterbot',
'facebookexternalhit', 'linkedinbot', 'discordbot'
];
foreach ($allowedBots as $allowedBot) {
if (strpos($userAgentLower, $allowedBot) !== false) {
// 正規のクローラーも拒否したい場合はこの部分を削除
// return true;
return false; // クローラーとして扱う場合
}
}
// リファラーのチェック(オプション)
$referer = $_SERVER['HTTP_REFERER'] ?? '';
// 疑わしいリクエストメソッドのチェック
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
if (!in_array($method, ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])) {
return false;
}
// Acceptヘッダーのチェック(通常のブラウザはこれを送信する)
$accept = $_SERVER['HTTP_ACCEPT'] ?? '';
if (empty($accept)) {
return false;
}
// 正常なユーザーと判断
return true;
}
// 使用例
if (isLegitimateUser()) {
echo "正常なユーザーです";
// 通常の処理を続行
} else {
echo "クローラーまたは不正ボットです";
// アクセスを拒否するか、別の処理を実行
http_response_code(403);
exit;
}
?>