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

微信图片_20260710102629_129_863

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())  # 后台运行定时任务

六、部署建议

本地开发测试通过后,建议部署到云服务器(推荐使用 systemdpm2管理进程):

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 辅助整理与撰写,内容已经过人工审校与调整。

posted @ 2026-07-10 10:45  PC修复电脑医生  阅读(28)  评论(0)    收藏  举报