
摘要:KOOK(原开黑啦)开放了机器人 API,开发者可以用 Python 快速构建自定义 Bot。本文从零讲起,涵盖 KOOK 开发者应用注册、Python SDK 接入、消息收发基础,最终实现一个能读取服务器 CPU 和内存使用率、在负载异常时自动向指定频道推送告警的实用 Bot。全程提供可运行代码,适合有 Python 基础的开发者。
团队协作中,服务器状态监控的消息推送方案有很多选择:企业微信机器人、钉钉 Webhook、Telegram Bot、邮件告警等。但如果你和团队日常使用 KOOK 进行语音和文字沟通,把监控告警直接推送到 KOOK 频道里,能让所有人第一时间在同一平台上看到,不需要额外安装或切换工具。
KOOK 提供了一套完整的机器人 API,支持收发消息、管理频道、处理事件等。相比于企业微信和钉钉的群机器人,KOOK Bot 的事件回调机制更灵活,可以实现双向交互而不只是单向推送。
本文分三个阶段递进:先注册 Bot 跑通最基础的收发消息,再接入 psutil 实现服务器资源采集,最后部署到服务器上常驻运行。演示环境为 Ubuntu 22.04 + Python 3.10。
在动手写代码之前,先理清 KOOK Bot 的工作方式:
本文使用的 khl.py 是目前社区维护最活跃的 Python SDK,封装了 WebSocket 连接和 API 调用,开发者只需关注业务逻辑。
操作步骤:
server-monitor-bot)。关键提醒:
Bot Token 是 Bot 的唯一身份凭证,等同于密码,绝对不要提交到公开仓库。建议存储在环境变量或 .env 文件中。以下操作在服务器或本地开发机上执行:
# 创建虚拟环境(推荐)
python3 -m venv kook-bot-env
source kook-bot-env/bin/activate
# 安装依赖
pip install khl.py psutil python-dotenv依赖说明:
khl.py:KOOK Python SDK,处理 WebSocket 连接和 API 调用。psutil:跨平台的系统资源监控库,用于获取 CPU、内存、磁盘等指标。python-dotenv:从 .env 文件加载环境变量,避免 Token 硬编码在脚本中。在项目根目录创建 .env 文件:
BOT_TOKEN=你的Bot_Token
TARGET_CHANNEL_ID=目标频道ID
ALERT_CPU_THRESHOLD=80
ALERT_MEM_THRESHOLD=80
CHECK_INTERVAL=300获取频道 ID 的方法:在 KOOK 客户端中,右键点击目标频道 →「复制频道 ID」,或在开发者模式中查看。
先从一个最简版本开始,确保 Bot 能正确连接并响应指令。
创建 bot.py:
import os
from dotenv import load_dotenv
from khl import Bot, Message
load_dotenv()
bot = Bot(token=os.getenv("BOT_TOKEN"))
@bot.command(name="ping")
async def ping(msg: Message):
"""健康检查指令"""
await msg.reply("pong! Bot is running.")
@bot.command(name="status")
async def quick_status(msg: Message):
"""快速查看当前服务器资源"""
import psutil
cpu = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory().percent
disk = psutil.disk_usage("/").percent
await msg.reply(
f"CPU: {cpu}% | 内存: {mem}% | 磁盘: {disk}%"
)
if __name__ == "__main__":
bot.run()代码解析:
@bot.command(name="ping") 声明一个指令。当用户在频道中发送 /ping,Bot 会自动回复 pong!。@bot.command(name="status") 是另一个指令,调用 psutil 实时采集 CPU、内存、磁盘使用率并返回。bot.run() 启动 WebSocket 连接,Bot 开始监听事件。运行测试:
python bot.py在 KOOK 频道中输入 /ping 和 /status,确认 Bot 能正常回复,基础框架就跑通了。
基础 Bot 只能被动响应指令,实际场景中需要 Bot 主动在资源异常时向频道推送告警。这里引入异步定时任务来实现。
更新 bot.py,在原有代码基础上增加定时检测逻辑:
import os
import asyncio
import psutil
from dotenv import load_dotenv
from khl import Bot, Message, PublicChannel
load_dotenv()
bot = Bot(token=os.getenv("BOT_TOKEN"))
CPU_THRESHOLD = int(os.getenv("ALERT_CPU_THRESHOLD", 80))
MEM_THRESHOLD = int(os.getenv("ALERT_MEM_THRESHOLD", 80))
CHECK_INTERVAL = int(os.getenv("CHECK_INTERVAL", 300))
TARGET_CHANNEL_ID = os.getenv("TARGET_CHANNEL_ID")
async def monitor_loop():
"""定时采集资源指标,超阈值时推送告警到指定频道"""
await bot.client.wait_for_startup()
channel = await bot.client.fetch_public_channel(TARGET_CHANNEL_ID)
alert_sent_cpu = False
alert_sent_mem = False
while True:
cpu = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory().percent
if cpu > CPU_THRESHOLD and not alert_sent_cpu:
await channel.send(
f"⚠️ CPU 告警:当前使用率 {cpu}%,已超过阈值 {CPU_THRESHOLD}%"
)
alert_sent_cpu = True
elif cpu <= CPU_THRESHOLD and alert_sent_cpu:
await channel.send(f"✅ CPU 已恢复正常:{cpu}%")
alert_sent_cpu = False
if mem > MEM_THRESHOLD and not alert_sent_mem:
await channel.send(
f"⚠️ 内存告警:当前使用率 {mem}%,已超过阈值 {MEM_THRESHOLD}%"
)
alert_sent_mem = True
elif mem <= MEM_THRESHOLD and alert_sent_mem:
await channel.send(f"✅ 内存已恢复正常:{mem}%")
alert_sent_mem = False
await asyncio.sleep(CHECK_INTERVAL)
@bot.command(name="ping")
async def ping(msg: Message):
await msg.reply("pong! Bot is running.")
@bot.command(name="status")
async def quick_status(msg: Message):
cpu = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory().percent
disk = psutil.disk_usage("/").percent
await msg.reply(
f"CPU: {cpu}% | 内存: {mem}% | 磁盘: {disk}%"
)
if __name__ == "__main__":
asyncio.ensure_future(monitor_loop())
bot.run()设计要点:
alert_sent_cpu 和 alert_sent_mem 两个状态标志,防止告警风暴——只在指标首次超过阈值时发一条告警,恢复后发一条解除通知,不会每分钟刷屏。CHECK_INTERVAL 控制检测频率(默认 300 秒 = 5 分钟),避免对 KOOK API 造成过大压力。fetch_public_channel 获取频道对象后直接 send,不需要等待用户指令触发。Bot 脚本跑通后,需要部署到服务器上常驻运行。推荐使用 systemd 管理 Bot 进程。
创建 systemd 服务文件 /etc/systemd/system/kook-monitor-bot.service:
[Unit]
Description=KOOK Server Monitor Bot
After=network.target
[Service]
Type=simple
User=your_username
WorkingDirectory=/opt/kook-monitor-bot
Environment="PATH=/opt/kook-monitor-bot/kook-bot-env/bin"
ExecStart=/opt/kook-monitor-bot/kook-bot-env/bin/python /opt/kook-monitor-bot/bot.py
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable kook-monitor-bot
sudo systemctl start kook-monitor-bot验证运行状态:
sudo systemctl status kook-monitor-bot确认状态为 active (running) 后,可以在 KOOK 频道发送 /ping 验证 Bot 是否在线。
在实际开发和部署过程中,有几点值得留意:
BOT_TOKEN 写死在代码里。用 .env 文件或服务器环境变量管理,并在 .gitignore 中排除 .env。khl.py 基于 asyncio,所有网络操作都是异步的。如果在 Bot 命令中调用了同步阻塞函数(如 time.sleep),会导致整个 Bot 卡住。解决方案是使用 asyncio.to_thread 将阻塞操作放到线程池中执行,或者直接使用异步版本的库。CHECK_INTERVAL 和告警状态标志来控制发送频率,正常情况下不会触发限制。扩展方向建议:
/threshold cpu 90 修改 CPU 告警线。本文从零完成了一个基于 KOOK API 和 Python 的服务器监控告警 Bot,包含三个核心模块:Bot 注册与接入、指令交互、定时监控与自动推送。完整代码不到 80 行,部署到服务器后通过 systemd 管理即可常驻运行。
这个方案的实际价值在于:把KOOK从一个纯粹的语音沟通工具,扩展为团队运维工作流中的信息中枢。相比于单独搭建一套监控面板,Bot 消息直接出现在日常沟通的频道里,运维人员不需要切窗口就能感知服务器状态变化,响应速度更快。
对于使用 KOOK 作为日常沟通工具的开发团队,这套方案部署耗时约 30 分钟,后续维护成本几乎为零。你可以基于文中提供的代码框架继续扩展,适配自己团队的具体需求。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。