{% extends "paxalia/base.html" %} {% load static i18n %} {% block page_title %}{% trans "Bot Traffic" %}{% endblock %} {% block page_subtitle %}{% trans "Investigate crawlers and scanners by client, category, provider, and requested path" %}{% endblock %} {% block extra_css %}{% endblock %} {% block filter_bar %}{% include 'paxalia/includes/filter_bar.html' %}{% endblock %} {% block dashboard_content %}
{% trans "Bot requests" %}{{ total_bot_views }}
{% trans "Today" %}{{ bot_views_today }}
{% trans "Unique IP / hash" %}{{ unique_bot_ips }}
{% trans "Categories" %}{{ category_breakdown|length }}
{% trans "Clear" %}

{% trans "Bot requests over time" %}

{% trans "Top requested paths" %}

{% trans "Bot countries" %}

{% trans "Category mix" %}

{% if category_breakdown %}
{% else %}
{% trans "No classified bot traffic in this period." %}
{% endif %}

{% trans "Path intelligence" %}

{% trans "See which paths attract automated traffic and how many different clients requested them. Use the Pages or Broken Links actions to turn a known scanner path into a persistent rule." %}

{{ path_rows|length }}
{% if path_rows %}
{% for row in path_rows %}{% endfor %}
{% trans "Path" %}{% trans "Requests" %}{% trans "Unique IP / hash" %}{% trans "Last seen" %}
{{ row.path }}{{ row.count }}{{ row.unique_ips }}{{ row.last_seen|date:"Y-m-d H:i" }}
{% else %}
{% trans "No bot paths were recorded in this date range." %}
{% endif %}

{% trans "IP investigation" %}

{% trans "Each client is grouped with the paths it requested. Provider/name comes from its User-Agent claim; scanner path rules are stronger evidence and are shown as rule-based classification." %}

{{ ip_rows|length }} {% trans "top clients" %}
{% if ip_rows %}
{% for row in ip_rows %}
{{ row.ip_hash }} {{ row.dominant_category_label }} {{ row.identity_name }}{% if row.identity_provider %} · {{ row.identity_provider }}{% endif %}
{{ row.requests }} {% trans "requests" %} · {{ row.unique_paths }} {% trans "paths" %}
{% trans "First" %} {{ row.first_seen|date:"Y-m-d H:i" }} · {% trans "Last" %} {{ row.last_seen|date:"Y-m-d H:i" }} · {% trans "Identity evidence" %}: {{ row.identity_confidence }}
{% if row.user_agent %}
{% trans "Observed User-Agent" %}{{ row.user_agent }}
{% endif %} {% for path in row.paths %}{% endfor %}
{% trans "Requested path" %}{% trans "Category" %}{% trans "Hits" %}{% trans "Last seen" %}
{{ path.path }}{{ path.category_label }}{{ path.count }}{{ path.last_seen|date:"Y-m-d H:i" }}
{% endfor %}
{% else %}
{% trans "No bot IPs were recorded in this date range." %}
{% endif %}

{% trans "Scanner activity" %}

{% trans "Known malicious/scanner path matches, grouped by client and target endpoint." %}

{% if scanner_rows %}
{% for row in scanner_rows %}{% endfor %}
{% trans "IP / hash" %}{% trans "Path" %}{% trans "Hits" %}{% trans "Different User-Agents" %}{% trans "Last seen" %}
{{ row.ip_hash|default:"Unknown" }}{{ row.path }}{{ row.count }}{{ row.unique_agents }}{{ row.last_seen|date:"Y-m-d H:i" }}
{% else %}
{% trans "No malicious/scanner requests in this period." %}
{% endif %}

{% trans "Crawler identity" %}

{% trans "Search-engine, AI, social-preview, and SEO identities are inferred from User-Agent strings; the IP itself is not independently verified here." %}

{% if crawler_rows %}
{% for row in crawler_rows %}{% endfor %}
{% trans "Category" %}{% trans "Provider / name" %}{% trans "User-Agent" %}{% trans "Hits" %}{% trans "IPs" %}
{{ row.category|default:"Unclassified" }}{{ row.name }}{% if row.provider %}
{{ row.provider }}
{% endif %}
{{ row.user_agent }}{{ row.count }}{{ row.unique_ips }}
{% else %}
{% trans "No crawler identity records in this period." %}
{% endif %}

{% trans "Configured Bot / Scanner path prefixes" %}

{% trans "These prefixes are applied at ingestion time. Pages and Broken Links can add a path and clean matching normal page-view records in one bounded action." %}

{% trans "Open settings" %}
{% if bot_path_prefixes %}
{% for prefix in bot_path_prefixes %}{{ prefix }}{% endfor %}
{% else %}
{% trans "No explicit Bot/Scanner path prefixes are configured." %}
{% endif %}
{% endblock %} {% block page_scripts %} {{ bot_data|json_script:"bot-chart-data" }} {% endblock %}