跳转至

开发技巧

主动调用插件接口

在现版本的OlivOS中如何主动发消息

首先,OlivOS目前的接口调用需要基于 OlivOS.API.Event 这个类来进行调用,形如你可以在文档中看到的那样:

plugin_event.send(send_type, target_id, message)
这个类的构造通常由收消息的前置组件所提供的sdk_event和插件托盘进程的日志函数共同完成,这意味着你需要首先去获得它们。

日志函数

日志函数由插件托盘进程提供,它几乎在每个框架事件中都会被作为入参提供。 以如下事件举例

class Event(object):
    def private_message(plugin_event, Proc):
        #plugin to do
        pass
则,入参Proc即为插件托盘进程,它有如下函数为日志函数
Proc.log(log_level, log_message, log_segment = [])
当你不需要直接使用它时,你不需要知道这些参数的意义是什么。

sdk_event

sdk_event是一类直接来自前置协议端的事件封包,其本质是一类由sdk自行定义的类,在插件托盘的 OlivOS.API.Event 构造时,需要传入这些事件,并根据这些类的类型去调用对应的sdk自行实现并提供给OlivOS的插件事件组装函数,在这个过程中,sdk_event中包含的各类信息(事件本身的消息,本机的账号信息等)都会被统一转换为OlivOS插件所能接受的事件类型。

而在主动调用的场景下,就需要自行基于账号信息生成一个虚假的sdk_event,并以此构造一个能用于OlivOS插件接口调用的插件事件。OlivOS已经内置了一个这样的专门用于这种场景的虚假sdk_event,它就是 OlivOS.contentAPI.fake_sdk_event ,其构造需要提供一个账号信息,其类型为 OlivOS.API.bot_info_T ,这个结构体在Proc.Proc_data['bot_info_dict']的字典中存储,其key为每个账号对应的hash。

例如,假设你的账号的hash为3cfede0d58a99a0fe71846310e9cac47,那么可以有如下代码

bot_hash = '3cfede0d58a99a0fe71846310e9cac47'
bot_info = Proc.Proc_data['bot_info_dict'][bot_hash]
print(bot_info.id)
print(bot_info.platform)
print(bot_info.hash)
则应当会输出类似如下
123456789
{'sdk': 'onebot', 'platform': 'qq', 'model': 'default'}
3cfede0d58a99a0fe71846310e9cac47

综上

如果你需要直接调用接口,可以参考如下代码。

pluginName = '你的插件名称'
botHash = '3cfede0d58a99a0fe71846310e9cac47'
plugin_event = OlivOS.API.Event(
    OlivOS.contentAPI.fake_sdk_event(
        bot_info = Proc.Proc_data['bot_info_dict'][botHash],
        fakename = pluginName
    ),
    Proc.log
)
plugin_event.send(send_type, target_id, message)
或是一步到位
pluginName = '你的插件名称'
botHash = '3cfede0d58a99a0fe71846310e9cac47'
OlivOS.API.Event(
    OlivOS.contentAPI.fake_sdk_event(
        bot_info = Proc.Proc_data['bot_info_dict'][botHash],
        fakename = pluginName
    ),
    Proc.log
).send(send_type, target_id, message)
你也可以参考这个大量利用了主动调用的插件案例 OlivOSOnebotV11