Skip to content

你还看上涩图了.jpg

在 NoneBot 事件处理流程中,获取事件信息并做出对应的操作是非常常见的场景。本章节中我们将介绍如何通过依赖注入获取事件信息

获取用户 ID

有时候,不是什么人都能看涩图的,因此,我们需要先得到用户信息,再决定是否要分享。

py
from nonebot.internal.adapter import Event
from nonebot.adapters.onebot.v11 import MessageSegment

matcher = on_command("来张涩图")

@matcher.handle()
async def _(event: Event):
    user_id = event.get_user_id()
    if user_id == "1234567890":
        await matcher.finish("你太坏了,不给你看")
    await matcher.finish(MessageSegment.image("xxx.jpg"))
py
from nonebot.internal.adapter import Event
from nonebot_plugin_alconna import Command, UniMessage

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

@matcher.handle()
async def _(event: Event):
    user_id = event.get_user_id()
    if user_id == "1234567890":
        await UniMessage("你太坏了,不给你看").finish()
    await UniMessage.image("xxx.jpg").finish()

这样,我们便可以实现:

Komorebi(ID:1234567890)
/来张涩图
Hibiscus
你太坏了,不给你看
NCBM
/来张涩图
Hibiscus

更多信息

不同的平台有不同的事件,比如:在 OneBot V11 规范中,消息事件(MessageEvent)的 sender 字段提供了发送者信息。而 Telegram 消息的 MessageEvent 提供了 chat 字段。因此,我们可以通过注入各个平台的 MessageEvent来获取用户信息

TIP

对于 Bot 的跨平台适配,我们可以使用 NoneBot Plugin UserInfo 插件来跨平台获取用户信息

py
from nonebot import on_command
from nonebot.adapters.onebot.v11 import MessageEvent as OneBotMessageEvent
from nonebot.adapters.telegram import MessageEvent as TelegramMessageEvent

matcher = on_command("来张涩图")

@matcher.handle()
async def _(event: OneBotMessageEvent | TelegramMessageEvent):
    # 使用 isinstance 判断事件
    if isinstance(event, OneBotMessageEvent):
        # OneBot V11
        nickname = event.sender.nickname
        await matcher.finish(f"收到 QQ 消息,用户:{nickname}。发放普通涩图")
    else:
        # Telegram
        username = event.chat.username
        await matcher.finish(f"收到 Telegram 消息,用户:{username}。发放 R18G")
py
from nonebot.adapters.onebot.v11 import MessageEvent as OneBotMessageEvent
from nonebot.adapters.telegram import MessageEvent as TelegramMessageEvent
from nonebot_plugin_alconna import Command, UniMessage

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

@matcher.handle()
async def _(event: OneBotMessageEvent | TelegramMessageEvent):
    # 使用 isinstance 判断事件
    if isinstance(event, OneBotMessageEvent):
        # OneBot V11
        nickname = event.sender.nickname
        await UniMessage(f"收到 QQ 消息,用户:{nickname}。发放普通涩图").finish()
    else:
        # Telegram
        username = event.chat.username
        await UniMessage(f"收到 Telegram 消息,用户:{username}。发放 R18G").finish()
py
from nonebot_plugin_alconna import Command, UniMessage
from nonebot_plugin_userinfo import EventUserInfo, UserInfo

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

@matcher.handle()
async def _(user_info: UserInfo = EventUserInfo()):
    username = user_info.user_name
    await UniMessage(f"用户:{username}").finish()

MIT License