Заощадьте 15% на всіх хостингових послугах

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код: Skills Почати
Рубрики
Linux Безпека Віртуальні сервери

Створіть власного 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
OSUbuntu 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 токен. Він знадобиться вам на наступному кроці. Ніколи не коммітьте його у публічний репозиторій.

Крок 2 — Напишіть код бота

На вашому 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. Для розгортання у виробництві настійно рекомендується використовувати змінну середовища замість жорсткого кодування токена:

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 + ChromeБезголовий браузер, який відображає та скрейпить результати MXToolbox
get_chrome_driver()Налаштовує Chrome для безголового серверного операцій
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 захищає вашу доставляємість електронної пошти, довіру ваших клієнтів та безперебійність роботи вашого сервісу. Розгорніть цього бота сьогодні, тримайте свої залежності в актуальному стані та розширюйте його з часом, коли ваші потреби моніторингу зростатимуть.