Статья Автоматическая и плановая проверка сайта на VirusTotal с отправкой отчета на почту и Telegram

ЗашелТолькоПосмотреть

Робот-Крабоид
Форумчанин
Регистрация
20.08.2025
Сообщения
63
Реакции
19
Вдохновлен Заметка - Автоматическая проверка сайта на Virustotal с отправкой на почту .
Окрыленный идеей решил нагенерить модификацию скрипта и вот, что у DeepSeek получилось, так как у меня хватило сил и ума только промпт написать.
Bash:
#!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# === Настройки ===
VT_API_KEY="your_virustotal_api_key"
TELEGRAM_BOT_TOKEN="your_telegram_bot_token"
TELEGRAM_CHAT_ID="your_telegram_chat_id"
URL_TO_CHECK="https://yourwebsite.com"
EMAIL_TO="[email protected]"
TMP_FILE="/tmp/vt_scan_result.txt"

# === Настройки расписания ===
SCAN_SCHEDULE="0 9 * * *"  # Каждый день в 9:00 (формат cron)
# SCAN_SCHEDULE="0 */6 * * *"  # Каждые 6 часов
# SCAN_SCHEDULE="0 * * * *"    # Каждый час
SCAN_INTERVAL=86400         # Интервал в секундах (86400 = 1 день)

# === Функция отправки сообщения в Telegram ===
send_telegram_message() {
    local message="$1"
    curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
        -d chat_id="${TELEGRAM_CHAT_ID}" \
        -d text="$message" \
        -d parse_mode="HTML" > /dev/null
}

# === Функция отправки email ===
send_email() {
    local subject="$1"
    local body_file="$2"
    mail -s "$subject" "$EMAIL_TO" < "$body_file"
}

# === Функция выполнения сканирования ===
perform_scan() {
    # === Отправляем URL на скан ===
    SCAN_ID=$(curl -s -X POST "https://www.virustotal.com/api/v3/urls" \
        -H "x-apikey: $VT_API_KEY" \
        --data-urlencode "url=$URL_TO_CHECK" | jq -r '.data.id')

    # Проверка: успешно ли отправили
    if [ -z "$SCAN_ID" ] || [ "$SCAN_ID" = "null" ]; then
        error_msg="Ошибка: не удалось отправить URL $URL_TO_CHECK на проверку VirusTotal"
        echo "$error_msg" > "$TMP_FILE"
        send_email "VirusTotal scan error" "$TMP_FILE"
        send_telegram_message "<b>VirusTotal Error</b>%0A${error_msg}"
        return 1
    fi

    # === Ждём завершения анализа ===
    sleep 15

    # === Получаем результат ===
    REPORT=$(curl -s -X GET "https://www.virustotal.com/api/v3/analyses/$SCAN_ID" \
        -H "x-apikey: $VT_API_KEY")

    # === Парсим и формируем сообщение ===
    URL_ENCODED=$(echo -n "$URL_TO_CHECK" | base64 | tr '+/' '-_' | tr -d '=')
    REPORT_URL="https://www.virustotal.com/gui/url/$URL_ENCODED"

    # Формируем полный отчет для email
    echo "Отчёт VirusTotal для $URL_TO_CHECK" > "$TMP_FILE"
    echo "Ссылка на анализ: $REPORT_URL" >> "$TMP_FILE"
    echo >> "$TMP_FILE"
    echo "$REPORT" | jq -r '.data.attributes.stats | to_entries[] | "\(.key): \(.value)"' >> "$TMP_FILE"

    # Формируем краткое сообщение для Telegram
    STATS=$(echo "$REPORT" | jq -r '.data.attributes.stats')
    MALICIOUS=$(echo "$STATS" | jq -r '.malicious')
    SUSPICIOUS=$(echo "$STATS" | jq -r '.suspicious')
    UNDETECTED=$(echo "$STATS" | jq -r '.undetected')
    HARMLESS=$(echo "$STATS" | jq -r '.harmless')

    TELEGRAM_MSG="<b>VirusTotal Scan Report</b>%0A%0A
<b>URL:</b> ${URL_TO_CHECK}%0A
<b>Malicious:</b> ${MALICIOUS}%0A
<b>Suspicious:</b> ${SUSPICIOUS}%0A
<b>Undetected:</b> ${UNDETECTED}%0A
<b>Harmless:</b> ${HARMLESS}%0A
<b>Full report:</b> ${REPORT_URL}"

    # === Отправляем уведомления ===
    send_email "VirusTotal URL Scan Report: $URL_TO_CHECK" "$TMP_FILE"
    send_telegram_message "$TELEGRAM_MSG"

    # === Очистка временного файла ===
    rm -f "$TMP_FILE"
}

# === Функция расчета времени до следующего сканирования ===
calculate_sleep_time() {
    if [[ "$SCAN_SCHEDULE" =~ ^[0-9*\/,-]+[[:space:]]+[0-9*\/,-]+[[:space:]]+[0-9*\/,-]+[[:space:]]+[0-9*\/,-]+[[:space:]]+[0-9*\/,-]+$ ]]; then
        # Формат cron - вычисляем время до следующего выполнения
        local current_epoch=$(date +%s)
        local next_run=$(date -d "$(echo "$SCAN_SCHEDULE" | awk '{print $2" "$1" * * *"}' | xargs -I {} date -d "{}" +"%Y-%m-%d %H:%M:%S" 2>/dev/null)" +%s 2>/dev/null)
     
        if [ -n "$next_run" ] && [ "$next_run" -gt "$current_epoch" ]; then
            echo $((next_run - current_epoch))
        else
            echo "$SCAN_INTERVAL"
        fi
    else
        # Простой интервал в секундах
        echo "$SCAN_INTERVAL"
    fi
}

# === Основной цикл ===
if [ "$1" = "--once" ]; then
    # Однократное выполнение
    perform_scan
else
    # Режим демона с планировщиком
    send_telegram_message "<b>VirusTotal Monitor</b>%0AЗапуск мониторинга URL: $URL_TO_CHECK"
 
    while true; do
        perform_scan
        SLEEP_TIME=$(calculate_sleep_time)
        echo "Следующее сканирование через $SLEEP_TIME секунд"
        sleep "$SLEEP_TIME"
    done
fi


Основные улучшения (Часть 1):​

  1. Добавлена поддержка Telegram 📧
    • Функция send_telegram_message для отправки сообщений через Telegram Bot API 16
    • Поддержка HTML-разметки для лучшего форматирования
  2. Разделение уведомлений
    • Подробный отчет отправляется по email
    • Краткая сводка отправляется в Telegram
  3. Улучшенная обработка ошибок ⚠️
    • Ошибки теперь отправляются и в Telegram, и на email
  4. Форматирование сообщений
    • Для Telegram используется краткий формат с ключевой статистикой
    • Для email сохраняется полный отчет
  5. Безопасность 🔒
    • Добавлена очистка временного файла

Настройка Telegram бота:​

  1. Создайте бота через @BotFather и получите токен 6
  2. Получите chat ID через запрос к getUpdates 6
  3. Вставьте полученные значения в переменные TELEGRAM_BOT_TOKEN и TELEGRAM_CHAT_ID

Требования:​

  • Установленные утилиты: curl, jq, mail
  • Доступ к API VirusTotal и Telegram Bot API

Основные улучшения(Часть 2):​

  1. Гибкое планирование сканирования ⏰
    • Поддержка формата cron через переменную SCAN_SCHEDULE
    • Альтернативная настройка через интервал в секундах SCAN_INTERVAL
    • Примеры настроек в комментариях
  2. Два режима работы
    • Демон-режим (по умолчанию) - непрерывная работа по расписанию
    • Однократный режим (с параметром --once) - для ручного запуска
  3. Умный расчет времени
    • Функция calculate_sleep_time определяет время до следующего сканирования
    • Поддержка как cron-формата, так и простых интервалов
  4. Уведомление о запуске мониторинга
    • Отправка сообщения в Telegram при старте мониторинга
  5. Логирование
    • Вывод информации о времени следующего сканирования

Использование:​

Настройка расписания (выберите один из вариантов):
Bash:
# Вариант 1: Использование cron-формата
SCAN_SCHEDULE="0 9 * * *"  # Каждый день в 9:00

# Вариант 2: Использование интервала в секундах
SCAN_INTERVAL=21600  # Каждые 6 часов

Запуск в режиме демона (для постоянного мониторинга):
Однократный запуск (для тестирования):
./virus_total_monitor.sh --once
Добавление в crontab (альтернативный вариант):
# Добавьте эту строку в crontab (crontab -e)
0 9 * * * /path/to/virus_total_monitor.sh --once

Примеры настроек расписания:​

  • Ежедневно в 9:00: SCAN_SCHEDULE="0 9 * * *"
  • Каждый час: SCAN_SCHEDULE="0 * * * *"
  • Каждые 6 часов: SCAN_INTERVAL=21600
  • Два раза в день (9:00 и 21:00): SCAN_SCHEDULE="0 9,21 * * *"
Теперь вы можете гибко настраивать расписание сканирования в соответствии с вашими потребностями!
 
Последнее редактирование:
Тот скрипт также написала нейронка.)
 
В код скрипта попало:

Примеры настроек расписания:​

<br>
  • <br>
  • Ежедневно в 9:00: SCAN_SCHEDULE="0 9 * * *"<br>
  • Каждый час: SCAN_SCHEDULE="0 * * * *"<br>
  • Каждые 6 часов: SCAN_INTERVAL=21600<br>
  • Два раза в день (9:00 и 21:00): SCAN_SCHEDULE="0 9,21 * * *"<br>
<br>Теперь вы можете гибко настраивать

Убери иначе ошибка в скрипте будет, либо под коментарий вынеси.

Либо это надо сделать, кто будет использовать скрипт.
 
Назад
Верх Низ