所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 安全 虚拟服务器

在VPS上构建您自己的Telegram机器人以监控IPv4黑名单

将您的IP地址保持在垃圾邮件黑名单之外对于电子邮件可传递性、服务声誉和不间断运营至关重要。无论您运行邮件服务器、SaaS平台还是Web应用程序,单个黑名单条目都可能在一夜之间无声地阻止您的出站电子邮件并侵蚀客户信任。在这份综合指南中,您将学习如何构建和部署一个功能完整的Telegram机器人,该机器人可以自动检查任何IPv4地址是否在主要垃圾邮件数据库中——所有这些都在可靠的VPS上运行。

为什么要自动化 IPv4 黑名单监控?

手动黑名单检查既繁琐又容易遗忘。通过 Telegram 机器人自动化此过程,您可以获得:

  • 即时按需检查 — 直接从手机或桌面查询任何 IP
  • 实时反馈 — 结果在几秒内通过 Telegram 传递
  • 零基础设施开销 — 机器人在服务器后台持续运行
  • 可扩展性 — 稍后可扩展机器人,添加定时告警、webhook 集成或多 IP 批量检查

IP 被列在 Spamhaus、SpamCop、StopForumSpam 或 Blocklist.de 等数据库上可能导致电子邮件传递失败、服务暂停和声誉受损。主动监控远比被动应对损害便宜。

为什么在 AlexHost VPS 上部署?

运行 Telegram 机器人需要一个全天候在线、响应迅速的服务器,并提供完整的 root 访问权限以安装自定义依赖项。AlexHost VPS 托管正好提供了这一切 — NVMe SSD 存储以实现快速 I/O、企业级 DDoS 防护,以及完整的 root 访问权限,让你可以不受限制地安装 Python、Selenium、浏览器驱动程序和任何其他工具。

与共享环境不同,共享环境中的资源限制可能会限制你的机器人性能,而专用 VPS 为你的应用程序提供一致的 CPU 和 RAM 分配。如果你更喜欢托管控制面板体验,带有 cPanel 的 VPS 也可用,即使对命令行不太熟悉的用户也能轻松管理服务器。

前置条件

在编写任何代码之前,请确保您的服务器上已准备好以下内容:

系统要求

要求最低版本
Python3.7 或更高版本
pip最新稳定版
Google Chrome最新稳定版
ChromeDriver与 Chrome 版本匹配
OSUbuntu 20.04+ / Debian 11+

安装 Python 库

通过 SSH 连接到您的 VPS 并运行以下命令来安装所需的 Python 包:

pip install selenium
pip install aiogram==3.4.1
  • Selenium — 自动化浏览器交互以从 MXToolbox 抓取黑名单检查结果
  • aiogram 3.4.1 — 用于 Telegram Bot API 的现代、异步优先的 Python 框架

安装 Google Chrome 和 ChromeDriver(无头模式)

Selenium 需要一个真实的浏览器来渲染 JavaScript 密集的页面。在您的 Linux 服务器上以无头模式安装 Chrome:

# 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 步 — 使用 BotFather 创建您的 Telegram 机器人

每个 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())

保存并退出(在 nano 中按 Ctrl+OEnterCtrl+X)。

第 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 轮换。
  • 验证用户输入 — 在将用户输入传递给 Selenium 之前添加 IP 地址格式验证,以防止意外行为。
  • 速率限制 — 考虑添加每用户速率限制,以防止对你的机器人和服务器资源的滥用。
  • 保持依赖项更新 — 定期更新 aiogramselenium 和 Chrome 以修补安全漏洞。
  • 为你的 VPS 配置防火墙 — 将入站端口限制为仅必要的端口(SSH 和你的机器人的出站连接)。

如果你的基础设施还处理电子邮件,将此机器人与适当保护的邮件环境配对至关重要。AlexHost 电子邮件托管提供托管的、符合垃圾邮件政策的环境,可降低你的发送 IP 出现在黑名单上的风险。

对于需要 SSL 保护的域名以及机器人基础设施的项目,AlexHost SSL 证书域名注册使建立完全受信任的网络存在变得简单。

AlexHost的垃圾邮件和黑名单政策

AlexHost在其整个网络中实施严格的反垃圾邮件政策。任何导致IP被列入黑名单的活动——包括大量未经请求的电子邮件、论坛垃圾邮件或被Spamhaus、SpamCop、StopForumSpam、Blocklist.de或类似数据库标记的滥用——都是严格禁止的。发现违反规定的服务将立即被暂停,以保护共享网络基础设施的完整性和所有客户的声誉。

这使得使用本指南中描述的机器人等工具进行主动监控不仅有用,而且对负责任的服务器运营至关重要。

扩展机器人 — 未来开发的想法

一旦您的基本机器人运行起来,请考虑这些增强功能:

  • 定时监控 — 使用 apscheduler 自动每 6 或 24 小时检查一次您的服务器 IP,仅在检测到新列表时提醒您
  • 多 IP 批量检查 — 在单条消息中接受逗号分隔的 IP 列表
  • 持久化日志 — 将检查结果存储在 SQLite 或 PostgreSQL 数据库中以进行历史趋势分析
  • Webhook 模式 — 从长轮询切换到 webhooks 以降低延迟和减少服务器负载
  • 其他数据源 — 直接集成来自 AbuseIPDB 或 Spamhaus 的 API,以获得更权威的结果,无需浏览器自动化

结论

构建一个Telegram机器人来监控IPv4黑名单是一个实用的、高价值的自动化项目,任何系统管理员或开发人员都可以在一个下午内完成。使用Python、aiogram和Selenium运行在AlexHost VPS上,你可以获得一个持久的、响应式的监控工具,直接将结果传递到你的Telegram客户端——无需检查仪表板,无需手动查询。

主动的IP信誉管理保护你的电子邮件可递送性、客户的信任和服务的正常运行时间。立即部署此机器人,保持依赖项更新,并随着监控需求的增长而扩展它。