Skip to main content

发生了什么?

创建 Mirai 实例#

让我们回来再看上一节的这个例子。

bot = miraicle.Mirai(qq=qq, verify_key=verify_key, port=port)bot.run()

我们创建了一个 Mirai 实例,传入了 qqverify_keyport 参数,并让它执行了 run 方法。它会和 mirai-api-http 建立连接,获取最近的事件和消息。

info

run 是个阻塞的方法,这意味着如果你的程序写在这条语句的后面,它将无法执行。

在默认的情况下,miraicle 是通过 http 的方式与 mirai-api-http 进行连接的。 miraicle 通过每隔一段时间向 mirai-api-http 发送请求,即轮询的方式,从而接收消息。

info

miraicle 提供了多种连接方式,并进行模块化分离成 adapter,你可以在 mirai-api-http 的配置文件中进行修改。miraicle 实现了其中的两种连接方式:httpws

如果你希望通过 ws 的方式和 mirai-api-http 连接,可以这样做:

bot = miraicle.Mirai(qq=qq, verify_key=verify_key, port=port, adapter='ws')

接收器#

@miraicle.Mirai.receiver('GroupMessage')def hello_to_group(bot: miraicle.Mirai, msg: miraicle.GroupMessage):    bot.send_group_msg(group=msg.group, msg='Hello world!')

@miraicle.Mirai.receiver('FriendMessage')def hello_to_friend(bot: miraicle.Mirai, msg: miraicle.FriendMessage):    bot.send_friend_msg(qq=msg.sender, msg='Hello world!')

我们定义了 hello_to_grouphello_to_friend 这两个函数,并使用装饰器 @miraicle.Mirai.receiver 来分别装饰它们。注意到,两个函数的装饰器是相同的,但是它们带了不同的参数。

hello_to_group 函数为例,当函数被装饰器 @miraicle.Mirai.receiver 装饰的时候,miraicle 会把这个函数注册到参数 GroupMessage 对应的接收器列表。这意味着每当 miraicle 接收到一条群消息,都会把消息交给这个函数来处理。

miraicle 接收到一条类型为 GroupMessage 的消息链时,它会首先对消息链进行预处理,封装成 miraicle.GroupMessage 对象。然后,miraicle 会依次调用 GroupMessage 接收器列表中的函数,传入 bot 对象和消息对象来执行它。

hello_to_group 函数中,我们让 bot 对象执行了 send_group_msg 方法,这是让 bot 发送一条群消息。group 参数代表群号,我们把它赋值为接收到消息的群号;msg 参数代表要发送的消息内容,我们传入字符串 'Hello world!'。这样,每当 bot 收到 GroupMessage 类型的消息链时,它都会发送 'Hello world!' 作为回应。

类似地,hello_to_friend 函数的装饰器参数为 FriendMessage,当 bot 接收到好友消息时,它会调用这个函数。

info

miraicle 支持的消息链类型包括 GroupMessageFriendMessageTempMessage,分别代表群消息、好友消息和群临时消息,miraicle 会把消息链封装成对应的对象。除此之外,你还可以在 receiver 的参数中填写各种 事件类型 ,不过,对于大多数事件类型,miraicle 没有对它们进行封装,传入的消息对象是个 dict