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.图片
        • 1.1 上传图片
        • 1.2 函数使用
        • 1.3 命令示例
        • 1.4 发送图片代码
        • 1.5 直接发送图片效果
        • 1.6 卡片消息发送图片
      • 2.文件
        • 2.1 代码示例
        • 2.2 效果实例
      • 3.示例代码
    • 卡片消息
  • 频道

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

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

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

    • 事件基础处理
  • 其他

    • KOOK客户端获取各类ID
    • 多文件注册机器人命令
    • 配置python的venv虚拟环境
    • 获取图片链接
    • 尝试自己调用api
  • docs
  • 消息
musnows
2023-05-29
目录
1.图片
1.1 上传图片
1.2 函数使用
1.3 命令示例
1.4 发送图片代码
1.5 直接发送图片效果
1.6 卡片消息发送图片
2.文件
2.1 代码示例
2.2 效果实例
3.示例代码

上传和发送文件或图片

# 1.图片

# 1.1 上传图片

要想发送图片,首先需要机器人将图片上传到 KOOK 中,对应函数为 create_asset,其返回值为图片的链接

await bot.client.create_asset("文件路径")

# 1.2 函数使用

这个函数能接收多种类型的参数,示例如下

async def img_upload(file_path:str):
    """图片上传函数"""
    # 方法1 文件路径
    img_url = await bot.client.create_asset(file_path)
    print("str path ",img_url) # 图片url

    # 方法2 文件io对象
    img = None
    with open(file_path,'rb') as f:
        img = io.BytesIO(f.read())
        # 下面的方式也可以,但是在传入create_asset函数时,编译器可能会报参数不匹配的警告
        # img = io.BytesIO(f.read()).getvalue() 
    
    img_url = await bot.client.create_asset(img) 
    print("open ",img_url)

    # 方法3 和PIL库对接
    img = Image.open(file_path)
    img_byte_arr = io.BytesIO()
    img.save(img_byte_arr, format='PNG') # 保存到内存中
    # img.save('./test.png') # 保存到磁盘中(仅作测试)
    img_byte = io.BytesIO(img_byte_arr.getvalue()) # 获取到bytes对象,再套一层io避免报警告
    img_url = await bot.client.create_asset(img_byte) # 上传
    print("PIL ",img_url)

    return img_url

在 config 路径下,我放入了本站的 logo 图片,使用 create_asset 函数将其上传到 KOOK

logo

# 1.3 命令示例

将如上操作封装到命令中

@bot.command(name='test')
async def test_cmd(msg:Message):
    try:
        print('get /test cmd')
        # 执行函数
        img_url = await img_upload('./config/logo.png')
    except:
        print("test cmd",traceback.format_exc()) # 打印错误信息

执行命令,控制台输出如下

get /test cmd
str path  https://img.kookapp.cn/attachments/2023-05/29/k2jUQW81GC05k05k.png
open  https://img.kookapp.cn/attachments/2023-05/29/k2jUQW81GC05k05k.png
PIL  https://img.kookapp.cn/attachments/2023-05/29/1Ic0of0v2205k05k.png

注意,如果你在上传以后,获取到了如下图片链接(空图片),则检查一下你的代码是否写对,图片是否正常上传

https://img.kaiheila.cn/attachments/2021-03/06/60438a85d38ae.jpg

# 1.4 发送图片代码

发送图片有两种方式,一种是直接发送,另一种是嵌入卡片消息发送;

在如下命令中,设置了一个 type 参数,作为图片上传方式的选择。

@bot.command(name='img')
async def img_cmd(msg:Message,stype:int=0):
    """发送图片消息"""
    try:
        print('get /img cmd',stype)
        if stype == 0:
            # 直接上传图片
            await msg.reply(IMG_URL,type=MessageTypes.IMG) # 必须要指明 msg 的类型为 IMG 图片
            print("reply img only")
        else:
            # 卡片消息中的图片
            cm = CardMessage(Card(
                Module.Header("这是卡片消息里面的图片"),
                Module.Container(Element.Image(src=IMG_URL))
            ))
            # 使用了 Container 容器来存放 Image 元素,传入图片的 url 就可以了
            #  - 这里可以使用第三方图床的 url,但必须要保证该 url 能在国内被正常访问
            #  - 否则 kook 访问不到图片,会报卡片消息 json 格式不正确的错误
            await msg.reply(cm)
            print("reply img in cardmsg")
    except:
        print("img cmd",traceback.format_exc()) # 打印错误信息

# 1.5 直接发送图片效果

image-20230529105148213

请注意,直接发送图片仅仅支持发送机器人自己create_asset获取的图片链接,其他非机器人自己上传的kook图片链接在发送的时候会产生报错;

除了kook的图片链接,你还可以在发送图片的时候,插入一个国内可正常访问的图床图片链接,此时该图片会被kook服务器下载后发送到客户端。

# 1.6 卡片消息发送图片

如下是使用卡片消息发送图片的效果

image-20240123203608453

# 2.文件

上传文件的函数和上传图片是一样的

await bot.client.create_asset("文件路径")

# 2.1 代码示例

在示例代码仓库的config文件夹中,我创建了一个test.txt文件,用于测试上传文件并发送到kook。

@bot.command(name="file")
async def file_cmd(msg:Message,stype:int=0):
    """上传和发送文件"""
    try:
        print('get /file cmd',stype)
        file_url = await bot.client.create_asset('./config/test.txt') # 上传测试文件
        if stype == 0:
            # 直接发送文件
            await msg.reply(file_url,type=MessageTypes.FILE)
            print("reply file only")
        else:
            # 卡片消息中的文件
            cm = CardMessage(Card(
                Module.Header("这是卡片消息里面的文件"),
                Module.File(type="file",src=file_url,title='测试文件')
            ))
            await msg.reply(cm)
            print("reply file in cardmsg")
    except:
        print("file cmd",traceback.format_exc()) # 打印错误信息

注意,在使用卡片消息发送文件的时候,Module.File中应该指定第一个参数type为file。这里还可以转入vedio和audio这两个文件类型,分别指代视频文件和音频文件。

# 2.2 效果实例

下图展示了使用卡片消息和直接发送文件的不同效果

image-20240123203709896

# 3.示例代码

本页面测试代码可见 code/04.img_file.py (opens new window)

上次更新: 2024/01/24, 10:15:36
消息类型
卡片消息

← 消息类型 卡片消息→

Artalk ErrorFailed to load comments
TypeError: Failed to fetch


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