khl.py khl.py
主页
文档
示例
  • khl.py (opens new window)
  • khl.py.docs (opens new window)
KOOK (opens new window)
主页
文档
示例
  • khl.py (opens new window)
  • khl.py.docs (opens new window)
KOOK (opens new window)
  • 机器人

    • 初始化
    • 命令
    • 定时任务
    • 在玩状态
      • 1.查看所有游戏
      • 2.查找目标游戏
      • 3.创建游戏
      • 4.更新在玩状态
        • 游戏
        • 音乐
        • 命令示例
      • 5.取消在玩状态
        • 游戏
        • 音乐
        • 命令示例
  • 消息

    • 消息类型
    • 上传和发送文件或图片
    • 卡片消息
  • 频道

    • 获取频道对象
    • 主动发送消息
  • 用户

    • 获取机器人用户对象
    • 获取用户对象和发送私聊信息
    • 机器人下线
  • 服务器

    • 获取服务器对象
    • 服务器角色操作
    • 设置用户昵称
  • 事件

    • 事件基础处理
  • 其他

    • KOOK客户端获取各类ID
    • 多文件注册机器人命令
    • 配置python的venv虚拟环境
    • 获取图片链接
    • 尝试自己调用api
  • docs
  • 机器人
musnows
2023-05-28
目录
1.查看所有游戏
2.查找目标游戏
3.创建游戏
4.更新在玩状态
游戏
音乐
命令示例
5.取消在玩状态
游戏
音乐
命令示例

在玩状态

对应官方接口文档 用户动态相关接口-游戏/进程/音乐 (opens new window)

# 1.查看所有游戏

await bot.client.fetch_game_list()

测试示例

import traceback
from khl import Bot, Message
from utils.file import open_file, write_file

# 打开config.json
config = open_file('./config/config.json')

# 初始化机器人
bot = Bot(token=config['token'])  # 默认采用 websocket


@bot.command(name='game-list')
async def test_cmd(msg: Message):
    try:
        print("get /game-list cmd")
        ret = await bot.client.fetch_game_list()
        print(ret)  # 打印游戏列表
    except:
        print(traceback.format_exc()) # 如果出现异常,打印错误


print("bot start")
bot.run()

在控制台会打印出当前已有的游戏 list,内部包含了多个 Game 对象。

注意,这个 list 并不符合 json 的格式要求,所以不能写入 json 文件。

image-20230528143742092

# 2.查找目标游戏

为了方便找到自己想要的游戏是否已经被他人创建过了,你可以使用如下代码进行筛选

game_name = "需要查找游戏的名字"
games = await bot.client.fetch_game_list()
target_games = [] # 结果列表
# 遍历查找
for g in games:
    # 使用模糊匹配,只要用户需要查找的游戏名字包含在其中,就添加到结果列表中
    # lower() 函数用于将str的大写转为小写,保证能匹配上
    if game_name.lower() in g.name.lower():
        target_games.append(g) # 插入 Game 对象
        
# list 为空代表没有找到
if target_games == []:
    print("没有找到")
else:
    print("找到了")
    print(target_games)

将其注册为命令,该命令有一个 game_name 参数作为我们需要查找的游戏名字。若找到了对应游戏,机器人将返回游戏的基本信息。

@bot.command(name='game-s')
async def game_search_cmd(msg: Message,game_name:str):
    try:
        print("get /game-s cmd")
        games = await bot.client.fetch_game_list()
        target_games = [] # 结果列表
        # 遍历查找
        for g in games:
            # 使用模糊匹配,只要用户需要查找的游戏名字包含在其中,就添加到结果列表中
            if game_name.lower() in g.name.lower():
                target_games.append(g) # 插入 Game 对象
        # list 为空代表没有找到
        if target_games == []:
            await msg.reply(f"没有找到「{game_name}」游戏")
        else:
            text = f"找到了「{game_name}」游戏\n"
            for game in target_games:
                text+= "```\n"
                text+= f"ID:{game.id}\n"
                text+= f"名字:{game.name}\n"
                text+= f"类型:{game.type}\n"
                text+= "```\n"
            text+= f"共「{len(target_games)}」个结果" 
            # 更多游戏信息参考 https://developer.kookapp.cn/doc/http/game 对 game 对象的定义
            # 机器只需要获取到 game.id ,就能上在玩状态
            await msg.reply(text)
    except:
        print(traceback.format_exc())  # 如果出现异常,打印错误

命令执行效果如下

image-20230528150723044

# 3.创建游戏

传入对应参数,将创建游戏,并返回 Game 对象。

游戏图标 url 获取:获取图片 url 的办法

name = "游戏名字"
icon = "游戏图标的图片url"
game = await bot.client.register_game(name, icon=icon)

命令示例

@bot.command(name='game-c')
async def game_create_cmd(msg: Message, name: str, icon=None):
    try:
        print("get /game-c cmd")
        # 处理 icon
        if icon != None and 'http' in icon:
            # 从命令行获取到的url,是kmd格式的,[url](url),我们需要取出其中一个完整的url
            # 否则无法获取到图片,报错 Requesting 'POST game/create' failed with 40000: 无法获取文件信息
            index = icon.find('](')
            icon = icon[index+2:-1] # 取到完整url
            print(f"icon url:{icon}")
        # 创建游戏
        game = await bot.client.register_game(name, icon=icon)
        # 发送信息
        text = "创建游戏成功\n"
        text += "```\n"
        text += f"ID:{game.id}\n"
        text += f"名字:{game.name}\n"
        text += f"类型:{game.type}\n"
        text += "```\n"
        await msg.reply(text)
    except:
        print(traceback.format_exc())  # 如果出现异常,打印错误

命令使用效果如下

image-20230528154914704

控制台输出如下

get /game-c cmd
icon url:https://img.kookapp.cn/assets/2023-05/3ATNmrqDJ50au0ad.png

这里我们就获取到了游戏的 ID,在后续更新在玩状态的操作中,就需要使用到这个 ID

# 4.更新在玩状态

# 游戏

game_id = 1161603 # 目标游戏ID,需要通过创建游戏获取,或者在所有游戏列表中查找
await bot.client.update_playing_game(game_id)

# 音乐

name = "歌名"
singer = "歌手"
# 枚举值:['cloudmusic'、'qqmusic'、'kugou'],默认为'cloudmusic'
platfrom = "音乐平台"

await bot.client.update_listening_music(name, singer, platfrom)

# 命令示例

@bot.command(name='game-up')
async def game_up_cmd(msg: Message, game_id: int):
    try:
        print("get /game-up cmd")
        # 传入 Game 对象,或者游戏的ID
        await bot.client.update_playing_game(game_id)
        await msg.reply(f"游戏「{game_id}」上线")
    except:
        print(traceback.format_exc())  # 如果出现异常,打印错误
        
@bot.command(name='music-up')
async def music_up_cmd(msg: Message, name: str, singer: str):
    try:
        print("get /music-up cmd")

        # 软件名,枚举值:['cloudmusic'、'qqmusic'、'kugou'],默认为'cloudmusic'
        platfrom = SoftwareTypes.KUGOU_MUSIC  # 酷狗音乐
        # 传入歌名,歌手,音乐平台
        await bot.client.update_listening_music(name, singer, platfrom)
        await msg.reply(f"开始听歌\n歌名:{name}\n歌手:{singer}")
    except:
        print(traceback.format_exc())  # 如果出现异常,打印错误

执行命令,键入本文档中创建的 AEPX 游戏的 ID

image-20230528155447004

稍等一会(在玩状态同步较慢)就能在机器人的状态列表中,看到游戏状态

image-20230528155530966


键入歌手和歌名,开始听歌状态

image-20230528155635565

稍等一会(在玩状态同步较慢)就能在机器人的状态列表中,看到听歌状态

image-20230528155833104

# 5.取消在玩状态

# 游戏

await bot.client.stop_playing_game()

# 音乐

await bot.client.stop_listening_music()

# 命令示例

@bot.command(name='music-down')
async def music_down_cmd(msg: Message):
    try:
        print("get /music-down cmd")
        await bot.client.stop_listening_music()
        await msg.reply(f"听歌状态下线")
    except:
        print(traceback.format_exc())  # 如果出现异常,打印错误

@bot.command(name='game-down')
async def game_down_cmd(msg: Message):
    try:
        print("get /game-down cmd")
        await bot.client.stop_playing_game()
        await msg.reply(f"游戏状态下线")
    except:
        print(traceback.format_exc())  # 如果出现异常,打印错误 

image-20230528155737430

上次更新: 2023/05/28, 08:03:54
定时任务
消息类型

← 定时任务 消息类型→

Artalk ErrorFailed to load comments
TypeError: Failed to fetch


Retry
Theme by Vdoing | Copyright © 2023-2025 khl.py | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式