KOOK Bot 开发实战:用 Python 实现消息监听、自动回复与关键词统计

KOOK 提供了完整的开放平台和 Bot API,开发者可以注册机器人、监听频道消息、实现自动回复和数据统计。本文将用 Python 从零开始,完成一个具备自动欢迎新人 + 关键词回复 + 消息统计功能的 Bot。
一、环境准备与Bot注册
注册Bot并获取Token
1.登录 KOOK开放平台,点击「应用」 → 「新建应用」
2.应用类型选「机器人」,填写名称和描述
3.创建完成后,左侧「Bot」页面可以看到 Token
Bot Token: 1/MTAwMDA=/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
⚠不要泄露Token。任何拿到这个字符串的人都能操控你的Bot。
4.将Bot邀请到目标服务器:在Bot页面的「邀请链接」生成邀请URL,浏览器打开后选择服务器即可。
安装依赖
pip install khl.py
khl.py 是 KOOK **推荐的 Python SDK,封装了完整的 API,省去手写 WebSocket 连接的麻烦。
二、Bot 基础骨架
from khl import Bot, Message, Event, EventTypes
from khl.command import Command
# 初始化Bot(将YOUR_TOKEN替换为上一步获取的Token)
bot = Bot(token="YOUR_TOKEN")
# 启动
if __name__ == "__main__":
bot.run()
执行 python bot.py,终端输出 Bot xxx connected 即表示连接成功。
三、功能1:新人加入自动欢迎
监听用户加入服务器的网关事件(注意:不是加入语音频道,是整个服务器的新成员事件)。
@bot.on_startup
async def startup(_):
print("Bot 已启动")
@bot.on_event(EventTypes.JOINED_GUILD)
async def on_join(event: Event):
"""新人加入服务器时触发"""
guild = await bot.client.fetch_guild(event.body["guild_id"])
user = event.body["user_id"]
# 在默认文字频道发送欢迎消息(需在服务器设置中指定默认频道)
for channel in await bot.client.fetch_guild_channel_list(guild.id):
if channel.type.value == 1: # 1 = 文字频道
await channel.send(f"欢迎 <@{user}> 加入!\n"
f"请先阅读 <#攻略频道ID> 了解规则\n"
f"有问题随时在综合大厅提问:<#综合大厅ID>")
break
注意:KOOK 的消息中引用频道使用 <#channel_id> 格式,引用用户使用 <@user_id>。这些在客户端中会自动渲染为可点击的链接。
四、功能2:关键词自动回复
# 关键词映射表
KEYWORD_REPLIES = {
"下载": "客户端下载地址:http://kook.ijinshan.com/",
"版本": "当前最新版本:0.72.3.0,Windows/Mac/iOS/Android全平台支持",
"改名": "KOOK原名「开黑啦」,点击左上角头像→个人信息即可修改昵称",
"权限": "服务器权限由管理员设置,如果你需要特定权限请联系管理员",
}
@bot.command(name="help",aliases=["帮助"])
async def help_cmd(msg: Message):
"""手动指令:列出所有可用的关键词"""
keywords = "\n".join([f"· {k}" for k in KEYWORD_REPLIES.keys()])
await msg.reply(f"我可以回复以下关键词:\n{keywords}")
@bot.on_event(EventTypes.MESSAGE_CHANNEL_TEXT)
async def on_text(msg: Message):
# 忽略bot自己的消息
if msg.author_id == bot.client.me.id:
return
content = msg.content.lower()
for keyword, reply in KEYWORD_REPLIES.items():
if keyword in content:
# 回复前加2秒延迟,避免刷屏
import asyncio
await asyncio.sleep(2)
await msg.reply(reply)
return
几个设计考量:
- 关键词匹配用
in而不是==,提高命中率。比如"在哪下载"也能命中"下载"关键词。 - Bot不响应自己的消息(避免两个Bot互相触发无限循环)。
- 加2秒延迟的原因:如果多个人同时触发关键词,瞬间回复多条容易触发频率限制。实际场景中2秒的延迟对用户几乎无感。
五、功能3:每日消息统计
记录每个频道的消息数量,每天定时推送统计到管理频道。
from collections import defaultdict
import asyncio
from datetime import datetime, timedelta
stats = defaultdict(int)
@bot.on_event(EventTypes.MESSAGE_CHANNEL_TEXT)
async def count_msg(msg: Message):
if msg.author_id == bot.client.me.id:
return
stats[str(msg.channel_id)] += 1
async def daily_report():
"""每天23:59发送当日统计"""
# 等待到当天的23:59
now = datetime.now()
target = now.replace(hour=23, minute=59, second=0, microsecond=0)
if target < now:
target += timedelta(days=1)
await asyncio.sleep((target - now).total_seconds())
# 生成报告
report = " 今日消息统计:\n"
total = sum(stats.values())
for ch_id, count in sorted(stats.items(), key=lambda x: -x[1]):
ch = await bot.client.fetch_public_channel(ch_id)
report += f"· {ch.name}:{count}条\n"
report += f"\n总计:{total}条"
# 发送到管理频道
admin_ch = await bot.client.fetch_public_channel("管理频道ID")
await admin_ch.send(report)
# 重置计数器
stats.clear()
@bot.on_startup
async def startup(_):
print("Bot已启动")
asyncio.create_task(daily_report()) # 后台运行定时任务
六、部署建议
本地开发测试通过后,建议部署到云服务器(推荐使用 systemd或 pm2管理进程):
pm2部署示例:
pm2 start bot.py --name kook-bot --interpreter python3
pm2 save
pm2 startup
注意事项:
- KOOK Bot的WebSocket连接要求稳定网络。短时断线SDK会自动重连,长时间断开后需重启。
- 消息量大的服务器建议限制Bot响应频率,避免触发平台速率限制(每5秒不超过5条消息)。
- 敏感操作(踢人、禁言)需要对应的Bot权限,在KOOK开放平台的应用管理中配置。
七、扩展方向
这个Bot的代码不超过200行,但已经覆盖了实际社群运营的常见需求。如果你需要进一步扩展:
-接入ChatGPT API →智能问答机器人-监听成员退出事件 →记录离开原因-对接GitHub webhook →代码提交自动通知频道-定时任务框架(APScheduler)→定时播报、活动提醒
KOOK的API文档在开放平台可直接查阅,大部分功能的调用方式和上述例子一致——监听事件、解析参数、执行逻辑、发送消息。
KOOK客户端获取:
下载地址:KOOK最新下载
AI 辅助创作声明:本文由 AI 辅助整理与撰写,内容已经过人工审校与调整。

浙公网安备 33010602011771号