Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код: Skills Начать
Рубрики
Linux VPS Безопасность

Создайте собственного бота Telegram для мониторинга IPv4 чёрных списков на VPS

Защита вашего IP-адреса от попадания в спам-листы критически важна для доставляемости электронной почты, репутации сервиса и бесперебойной работы. Независимо от того, управляете ли вы почтовым сервером, SaaS-платформой или веб-приложением, одна запись в черном списке может молча заблокировать исходящие письма и подорвать доверие клиентов за одну ночь. В этом подробном руководстве вы узнаете, как создать и развернуть полнофункциональный бот Telegram, который автоматически проверяет любой IPv4-адрес в крупных базах данных спама — все это работает на надежном VPS.

Зачем автоматизировать мониторинг черного списка IPv4?

Ручные проверки черного списка утомительны и легко забыть. Автоматизируя процесс через бота Telegram, вы получаете:

  • Мгновенные проверки по требованию — запрашивайте любой IP прямо со своего телефона или компьютера
  • Обратная связь в реальном времени — результаты доставляются в Telegram за секунды
  • Нулевые накладные расходы на инфраструктуру — бот работает постоянно на вашем сервере в фоновом режиме
  • Масштабируемость — позже расширьте бота запланированными оповещениями, интеграциями webhook или пакетными проверками нескольких IP

IP, занесенный в базы данных Spamhaus, SpamCop, StopForumSpam или Blocklist.de, может привести к сбоям доставки электронной почты, приостановке услуг и репутационному ущербу. Упреждающий мониторинг намного дешевле, чем реактивный контроль ущерба.

Почему развертывать на AlexHost VPS?

Запуск Telegram-бота требует сервера, который работает 24/7, быстро реагирует и предоставляет полный root-доступ для установки пользовательских зависимостей. AlexHost VPS Hosting обеспечивает именно это — хранилище NVMe SSD для быстрого ввода-вывода, защиту от DDoS корпоративного уровня и полный root-доступ, чтобы вы могли устанавливать Python, Selenium, драйверы браузера и любые другие инструменты без ограничений.

В отличие от общих сред, где ограничения ресурсов могут замедлить производительность вашего бота, выделенный VPS обеспечивает постоянное выделение CPU и RAM для вашего приложения. Если вы предпочитаете управляемый интерфейс панели управления, VPS с cPanel также доступен, что делает управление сервером доступным даже для тех, кто менее комфортно чувствует себя с командной строкой.

Предварительные требования

Перед написанием первой строки кода убедитесь, что на вашем сервере установлено следующее:

Системные требования

ТребованиеМинимальная версия
Python3.7 или выше
pipПоследняя стабильная
Google ChromeПоследняя стабильная
ChromeDriverСоответствующая версия Chrome
ОСUbuntu 20.04+ / Debian 11+

Установка библиотек Python

Подключитесь к вашему VPS через SSH и выполните следующие команды для установки необходимых пакетов Python:

pip install selenium
pip install aiogram==3.4.1
  • Selenium — автоматизирует взаимодействие с браузером для получения результатов проверки черного списка из MXToolbox
  • aiogram 3.4.1 — современный асинхронный фреймворк Python для Telegram Bot API

Установка Google Chrome и ChromeDriver (Headless)

Selenium требует реальный браузер для отрисовки страниц с интенсивным использованием JavaScript. Установите Chrome в режиме headless на вашем Linux сервере:

# Install dependencies
sudo apt update
sudo apt install -y wget curl unzip fonts-liberation libappindicator3-1 libasound2 
  libatk-bridge2.0-0 libatk1.0-0 libcups2 libdbus-1-3 libgdk-pixbuf2.0-0 
  libnspr4 libnss3 libx11-xcb1 libxcomposite1 libxdamage1 libxrandr2 
  xdg-utils libgbm1

# Download and install Chrome
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo apt --fix-broken install -y

# Verify installation
google-chrome --version

Затем установите соответствующий ChromeDriver:

# Get your Chrome version number first
CHROME_VERSION=$(google-chrome --version | grep -oP 'd+.d+.d+.d+')
CHROME_MAJOR=$(echo $CHROME_VERSION | cut -d. -f1)

# Download matching ChromeDriver
wget "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR}" -O latest_release
DRIVER_VERSION=$(cat latest_release)
wget "https://chromedriver.storage.googleapis.com/${DRIVER_VERSION}/chromedriver_linux64.zip"
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver

Шаг 1 — Создайте своего бота Telegram с помощью BotFather

Каждый бот Telegram начинается с BotFather — официального бота Telegram для регистрации и управления ботами.

1.1 Откройте Telegram и найдите @BotFather (ищите проверенную синюю галочку).

1.2 Начните разговор и отправьте команду:

/newbot

1.3 Следуйте подсказкам:

  • Введите отображаемое имя для вашего бота (например, IP Blacklist Monitor)
  • Введите уникальное имя пользователя, заканчивающееся на bot (например, ip_blacklist_monitor_bot)

1.4 BotFather ответит сообщением подтверждения, похожим на:

Done! Congratulations on your new bot.
You will find it at t.me/ip_blacklist_monitor_bot.

Use this token to access the HTTP API:
7123456789:AAFxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Keep your token secure and store it safely — it can be used by anyone to control your bot.

Скопируйте и сохраните этот API токен в безопасном месте. Он понадобится вам на следующем шаге. Никогда не добавляйте его в открытый репозиторий.

Step 2 — Write the Bot Code

На вашем VPS создайте новый файл Python:

nano ~/my_bot.py

Вставьте следующий полный, готовый к производству код:

import asyncio
import time
from aiogram import Bot, Dispatcher, F
from aiogram.filters import CommandStart
from aiogram.types import Message
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

# ─── Configuration ────────────────────────────────────────────────────────────
BOT_TOKEN = 'YOUR_BOT_TOKEN_HERE'  # Replace with your BotFather token
# ──────────────────────────────────────────────────────────────────────────────

bot = Bot(BOT_TOKEN)
dp = Dispatcher()

def get_chrome_driver():
    """Initialize a headless Chrome driver for server environments."""
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--window-size=1920,1080')
    return webdriver.Chrome(options=chrome_options)

def get_results(ip: str) -> list:
    """
    Use Selenium to check an IPv4 address against blacklists via MXToolbox.
    Returns a list of [status, blacklist_name] pairs.
    """
    results = []
    driver = get_chrome_driver()

    try:
        # Navigate to MXToolbox blacklist checker
        url = f"https://mxtoolbox.com/SuperTool.aspx?action=blacklist%3a{ip}&run=toolpage"
        driver.get(url)
        time.sleep(6)  # Allow the page and results to fully load

        # Locate the IP input field and submit the query
        input_field = driver.find_element(By.NAME, 'ctl00$ContentPlaceHolder1$txtInput2')
        input_field.clear()
        input_field.send_keys(ip)
        time.sleep(3)

        search_button = driver.find_element(By.ID, 'btnAction3')
        search_button.click()
        time.sleep(6)  # Wait for results to render

        # Scrape up to 60 status and name columns
        status_results = driver.find_elements(By.CLASS_NAME, 'table-column-Status')[:60]
        name_results = driver.find_elements(By.CLASS_NAME, 'table-column-Name')[:60]

        if len(status_results) == len(name_results):
            for status, name in zip(status_results, name_results):
                results.append([status.text, name.text])
        else:
            print(f"[WARNING] Status/name count mismatch for IP: {ip}")

    except Exception as e:
        print(f"[ERROR] Failed to retrieve results for {ip}: {e}")
    finally:
        driver.quit()

    return results

@dp.message(CommandStart())
async def handle_start(message: Message):
    """Handle the /start command — greet the user and explain usage."""
    await message.answer(
        f"👋 Hello, {message.from_user.first_name}!nn"
        f"Send me any IPv4 address and I will check it against major spam blacklists.nn"
        f"Example: <code>192.168.1.1</code>",
        parse_mode="HTML"
    )

@dp.message(F.text)
async def handle_ip_check(message: Message):
    """Receive an IP address, run the blacklist check, and return formatted results."""
    ip = message.text.strip()
    await message.answer(f"🔍 Checking <code>{ip}</code> against blacklists. Please wait...", parse_mode="HTML")

    loop = asyncio.get_event_loop()
    # Run the blocking Selenium call in a thread pool to avoid blocking the event loop
    raw_results = await loop.run_in_executor(None, get_results, ip)

    if not raw_results:
        await message.answer("⚠️ No results returned. Please verify the IP address and try again.")
        return

    output_lines = []
    blacklisted_count = 0

    for status, name in raw_results:
        if status.strip().upper() == 'OK':
            output_lines.append(f"✅ {name}")
        else:
            output_lines.append(f"❌ {name}")
            blacklisted_count += 1

    summary = f"📊 <b>Results for {ip}</b>n"
    summary += f"🚫 Listed on {blacklisted_count} blacklist(s)nn"
    summary += "n".join(output_lines)

    # Telegram messages have a 4096-character limit — split if necessary
    if len(summary) > 4096:
        for i in range(0, len(summary), 4096):
            await message.answer(summary[i:i+4096], parse_mode="HTML")
    else:
        await message.answer(summary, parse_mode="HTML")

async def main():
    print("✅ Bot is running. Listening for messages...")
    await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())

Сохраните и выйдите (Ctrl+O, Enter, Ctrl+X в nano).

Шаг 3 — Безопасная настройка токена бота

Замените YOUR_BOT_TOKEN_HERE в скрипте на токен, полученный от BotFather. Для production-развертываний настоятельно рекомендуется использовать переменную окружения вместо жесткого кодирования токена:

export TELEGRAM_BOT_TOKEN="7123456789:AAFxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Затем обновите строку кода на:

import os
BOT_TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN')

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

Шаг 4 — Запуск бота как фонового сервиса

Чтобы бот продолжал работать после закрытия SSH сессии, настройте его как systemd сервис:

sudo nano /etc/systemd/system/ipblacklist-bot.service

Вставьте следующую конфигурацию:

[Unit]
Description=IPv4 Blacklist Monitor Telegram Bot
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root
ExecStart=/usr/bin/python3 /root/my_bot.py
Restart=on-failure
RestartSec=10
Environment="TELEGRAM_BOT_TOKEN=YOUR_BOT_TOKEN_HERE"

[Install]
WantedBy=multi-user.target

Включите и запустите сервис:

sudo systemctl daemon-reload
sudo systemctl enable ipblacklist-bot
sudo systemctl start ipblacklist-bot

# Verify it is running
sudo systemctl status ipblacklist-bot

Ваш бот теперь будет автоматически перезапускаться при сбое и запускаться при каждой перезагрузке сервера.

Шаг 5 — Протестируйте бота

  1. Откройте Telegram и найдите своего бота по его имени пользователя
  2. Отправьте /start — вы должны получить приветственное сообщение
  3. Отправьте любой IPv4 адрес (например, 8.8.8.8)
  4. В течение 15–20 секунд вы получите отформатированный список, показывающий, в каких черных списках указан IP (❌) и какие он прошел (✅)

Обзор архитектуры кода

КомпонентРоль
aiogramАсинхронный фреймворк Telegram Bot API — обрабатывает маршрутизацию сообщений и опрос
Selenium + ChromeHeadless браузер, который отображает и парсит результаты MXToolbox
get_chrome_driver()Настраивает Chrome для работы в режиме headless на сервере
get_results(ip)Основная функция скрейпинга — переходит на MXToolbox и извлекает данные статуса
handle_start()Отвечает на /start с инструкциями по использованию
handle_ip_check()Получает ввод IP, запускает проверку асинхронно, возвращает отформатированный результат
run_in_executor()Переносит блокирующий вызов Selenium в пул потоков, сохраняя асинхронный цикл отзывчивым
systemd сервисОбеспечивает постоянное выполнение бота и автоматический перезапуск при сбое

Соображения безопасности и соответствия

Запуск бота, взаимодействующего с внешними сервисами с VPS, несет определенные обязательства:

  • Защитите токен вашего бота — относитесь к нему как к паролю. Немедленно замените его через BotFather в случае компрометации.
  • Проверяйте пользовательский ввод — добавьте проверку формата IP-адреса перед передачей пользовательского ввода в Selenium, чтобы предотвратить неожиданное поведение.
  • Ограничение частоты запросов — рассмотрите возможность добавления ограничений частоты запросов для каждого пользователя, чтобы предотвратить злоупотребление вашим ботом и ресурсами сервера.
  • Поддерживайте зависимости в актуальном состоянии — регулярно обновляйте aiogram, selenium и Chrome для устранения уязвимостей безопасности.
  • Защитите VPS брандмауэром — ограничьте входящие порты только необходимыми (SSH и исходящие соединения вашего бота).

Если ваша инфраструктура также обрабатывает электронную почту, сочетание этого бота с надлежащим образом защищенной почтовой средой является обязательным. AlexHost Email Hosting предоставляет управляемую среду, соответствующую политике защиты от спама, которая снижает риск попадания ваших IP-адресов отправки в черные списки с самого начала.

Для проектов, требующих SSL-защищенного домена наряду с инфраструктурой вашего бота, AlexHost SSL Certificates и Domain Registration упрощают установку полностью доверенного веб-присутствия.

Политика AlexHost в отношении спама и черных списков

AlexHost применяет строгую политику запрета спама во всей своей сети. Любая деятельность, приводящая к добавлению IP в черный список — включая массовые нежелательные письма, спам на форумах или злоупотребления, отмеченные Spamhaus, SpamCop, StopForumSpam, Blocklist.de или аналогичными базами данных — строго запрещена. Услуги, нарушающие эту политику, немедленно приостанавливаются для защиты целостности инфраструктуры общей сети и репутации всех клиентов.

Это делает активный мониторинг с помощью инструмента, описанного в этом руководстве, не просто полезным, а необходимым для ответственной работы сервера.

Расширение бота — идеи для будущего развития

После того как ваш базовый бот запущен, рассмотрите эти улучшения:

  • Запланированный мониторинг — используйте apscheduler для автоматической проверки IP-адресов вашего сервера каждые 6 или 24 часа и оповещения вас только при обнаружении нового листинга
  • Пакетные проверки нескольких IP — принимайте список IP-адресов, разделённых запятыми, в одном сообщении
  • Постоянное логирование — сохраняйте результаты проверок в базе данных SQLite или PostgreSQL для анализа исторических тенденций
  • Режим webhook — переключитесь с долгого опроса на webhooks для снижения задержки и уменьшения нагрузки на сервер
  • Дополнительные источники данных — интегрируйте API от AbuseIPDB или Spamhaus напрямую для получения более авторитетных результатов без автоматизации браузера

Заключение

Создание Telegram-бота для мониторинга IPv4 черных списков — это практичный проект автоматизации высокой ценности, который любой системный администратор или разработчик может завершить за один день. С Python, aiogram и Selenium на AlexHost VPS вы получаете постоянный, отзывчивый инструмент мониторинга, который доставляет результаты прямо на ваш Telegram-клиент — никаких панелей управления для проверки, никаких ручных поисков не требуется.

Проактивное управление репутацией IP защищает доставляемость вашей электронной почты, доверие ваших клиентов и бесперебойность работы вашего сервиса. Разверните этого бота сегодня, держите ваши зависимости в актуальном состоянии и расширяйте его со временем по мере роста ваших потребностей в мониторинге.