Skip to content

涩图 の 加工

在不同平台中,一条消息可能会有承载有各种不同的表现形式,它可能是一段纯文本、一张图片、一段语音、一篇富文本文章,也有可能是多种类型的组合等等。

所以,本章主要教会你构造形形色色(不可以色色)的消息 你也不想你的涩图 Bot 没有图吧

回顾

在之前的教程中,我们教会了如何获得用户信息。在本章中,我们教会你如何发送构造消息,那么,先来看看上一章是如何发送消息的

py
await matcher.finish(MessageSegment.image("xxx.jpg"))
py
await UniMessage.image("xxx.jpg").finish()

相信大家肯定会对其中的 MessageSegment 很感兴趣, 这是什么?这个怎么用?怎么通过这个发送图片?那么本章就来讲讲 MessageSegment

认识消息类型

消息序列 Message

在 NoneBot 中,消息序列 Message 的主要作用是用于表达“一串消息”。由于消息序列继承自 List[MessageSegment],所以 Message 的本质是由若干消息段所组成的序列。因此,消息序列的使用方法与 List 有很多相似之处,例如切片、索引、拼接等。


消息段 MessageSegment

顾名思义,消息段(MessageSegment)是一段消息。 但是由于绝大多数的平台都有着独特的消息类型,因此这些独特的内容往往需要由对应的协议适配器所提供

看到这里,你可能会有疑问:为什么消息段需要由协议适配器提供?

这是因为,不同平台中的消息类型有着不同的表现形式,例如:

  • QQ 群中的消息段可能由 MessageSegment.atMessageSegment.imageMessageSegment.text 等等组成
  • Telegram 中的消息段可能由 MessageSegment.locationMessageSegment.venueMessageSegment.poll 等等组成
这也意味着,你需要导入对应的协议适配器中的消息序列和消息段后才能使用其特殊的工厂方法。

你也觉得很麻烦对吧,没关系,我们有 Alconna

如果你要发涩图,就不能只发涩图

一张好的涩图,不仅仅是一张图,它还需要有文字描述,那么,我们如何构造这样的消息呢?

直接构造

py
from nonebot import on_command
from nonebot.adapter.onebot.v11 import Message, MessageSegment

matcher = on_command("来张涩图")

@matcher.handle()
async def _():
    message = Message([
        "你要的涩图",
        MessageSegment.image("https://xxx.chat/logo.png"),
        "标签: ?;画师:?"
    ])
    await matcher.finish(message)
py
from nonebot_plugin_alconna import Command
from nonebot_plugin_alconna.uniseg import Image, UniMessage

matcher = Command("来张涩图").build(use_cmd_start=True)

@matcher.handle()
async def _():
    message = UniMessage([
        "你要的涩图",
        Image(url="https://xxx.chat/logo.png"),
        "标签: ?;画师:?"
    ])
    await UniMessage(message).finish()

    # 或者使用 链式 发送
    await (
        UniMessage.text("你要的涩图")
        .image("https://xxx.chat/logo.png")
        .text("标签: ?;画师:?")
        .finish()
    )

使用消息模板

py
from nonebot import on_command
from nonebot.adapter.onebot.v11 import Message, MessageSegment

matcher = on_command("来张涩图")

@matcher.handle()
async def _():

    message = Message.template("你要的涩图 {} 标签: {};画师:{}").format(
        MessageSegment.image("https://xxx.chat/logo.png"),
        "?", "?"
    )
    await matcher.finish(message)
py
from nonbot_plugin_alconna import Command
from nonebot_plugin_alconna.uniseg import Image, UniMessage

matcher = Command("来张涩图").build(use_cmd_start=True)

@matcher.handle()
async def _():
    message = UniMessage.template("你要的涩图 {} 标签: {};画师: {}").format(
        Image(url="https://xxx.chat/logo.png"),
        "?", "?"
    )
    await UniMessage(message).finish()

    # 或者使用 链式 发送
    await (
        UniMessage.text("你要的涩图")
        .image("https://xxx.chat/logo.png")
        .text("标签: ?;画师:?")
        .finish()
    )

这样,当用户输入 /来张涩图 , Bot 便会发送一张 精美的 涩图以及关于它的详细信息

Komorebi
/来张涩图
Hibiscus
你要的涩图 涩图.png 标签: Koishi;画师:某不知名内鬼
ddl
群主
ddl 已将 Komorebi 禁言 12 小时

MIT License