57 lines
1.6 KiB
Ruby
57 lines
1.6 KiB
Ruby
module BotBlocker
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
before_action :block_bots
|
|
end
|
|
|
|
private
|
|
|
|
def block_bots
|
|
return unless bot_request?
|
|
|
|
render plain: "Bot access is not allowed", status: :forbidden
|
|
end
|
|
|
|
def bot_request?
|
|
user_agent = request.user_agent.to_s.downcase
|
|
|
|
# List of known bot user agents
|
|
bot_patterns = [
|
|
'gptbot', # OpenAI GPTBot
|
|
'chatgpt', # ChatGPT
|
|
'claude-web', # Anthropic Claude
|
|
'bingbot', # Microsoft Bing
|
|
'googlebot', # Google
|
|
'baiduspider', # Baidu
|
|
'yandexbot', # Yandex
|
|
'duckduckbot', # DuckDuckGo
|
|
'slurp', # Yahoo
|
|
'facebookexternalhit', # Facebook
|
|
'twitterbot', # Twitter
|
|
'linkedinbot', # LinkedIn
|
|
'whatsapp', # WhatsApp
|
|
'telegrambot', # Telegram
|
|
'slackbot', # Slack
|
|
'discordbot', # Discord
|
|
'applebot', # Apple
|
|
'ia_archiver', # Alexa/Internet Archive
|
|
'petalbot', # Huawei
|
|
'seznambot', # Seznam
|
|
'ahrefsbot', # Ahrefs
|
|
'semrushbot', # SEMrush
|
|
'mj12bot', # Majestic
|
|
'dotbot', # OpenSiteExplorer
|
|
'rogerbot', # Moz
|
|
'exabot', # Exalead
|
|
'facebot', # Facebook
|
|
'spider', # Generic spiders
|
|
'crawler', # Generic crawlers
|
|
'scraper', # Generic scrapers
|
|
'bot', # Generic bots (last resort)
|
|
]
|
|
|
|
bot_patterns.any? { |pattern| user_agent.include?(pattern) }
|
|
end
|
|
end
|