トップページにアクセスカウント機能追加とあと一つ機能 #wordpress

2024年7月21日
文字数[2805文字] この記事は4分30秒で読めます.

おはようございます.トップページにアクセスカウント機能追加とあと一つ機能を追加しました.あと一つは他の閲覧者が何の記事を見ているか表示する機能になります.ちなみに最初、プッシャーというモノを使用して構築していたんですが、レンタルサーバーの規約違反になりそうなので取りやめて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;
}

?>

これは今後の課題になりそうですが、当分は放置です.

明日へ続く.