Skip to content

作为 Python 包开发

若您不向拖泥带水的留着一堆东西,想要编写功能相对简单或自定义化的个人项目,这一方式非常适合您。

在阅读本章前,建议先阅读 HypeR Bot 的内置类、方法和属性

安装

commandline
pip install -U hyper-bot

镜像源可能更新较慢,导致一些奇奇怪怪的报错或装不上最新版本,此时添加 -i https://pypi.org/simple 参数(即使用官方镜像源)即可。

快速开始

以下是”经典“方式:

python
from hyperot import configurator

from cfgr.manager import Serializers  # pip install ucfgr

configurator.BotConfig.load_from("config.json", Serializers.JSON, "hyper-bot")

if True:
    from hyperot import listener, events, hyperogger, common, segments
    from hyperot.utils import logic

config = configurator.BotConfig.get("hyper-bot")
logger = hyperogger.hyperogger()
logger.set_level(config.log_level)


@listener.reg
@logic.ErrorHandler().handle_async
async def handler(event: events.Event, actions: listener.Actions) -> None:
    if isinstance(event, events.GroupMessageEvent):
        if str(event.message) == "ping":
            await actions.send(group_id=event.group_id, message=common.Message([segments.Text("pong")]))

listener.run()

妈呀,看着有些复杂欸

不要怕,一点点来。

python
from hyperot import configurator
from cfgr.manager import Serializers  # pip install ucfgr

configurator.BotConfig.load_from("config.json", Serializers.JSON, "hyper-bot")

这些代码为接下来的程序设置了配置文件。

Config 类定义如下:

hyperot.configurator

python
from cfgr.manager import BaseConfig


class BotWSC(BaseConfig):
    mode: str = "FWS"
    ob_auto_startup: bool = False
    ob_exec: str = None
    ob_startup_path: str = None
    ob_log_output: bool = False
    host: str
    port: int
    retries: int
    token: str


class BotHTTPC(BaseConfig):
    mode: str = "HTTPC"
    ob_auto_startup: bool = False
    ob_exec: str = None
    ob_startup_path: str = None
    ob_log_output: bool = False
    host: str
    port: int
    listener_host: str
    listener_port: int
    retries: int


class BotConfig(BaseConfig):
    protocol: str = "OneBot"
    owner: list
    black_list: list
    silents: list
    connection: BotHTTPC
    connection: BotWSC
    connection: dict
    log_level: str = "INFO"
    uin: int
    others: dict

    def custom_post(self, **kwargs):
        if self.protocol == "OneBot":
            if self.connection["mode"] == "FWS":
                self.connection = BotWSC(**self.connection)
            elif self.connection["mode"] == "HTTPC":
                self.connection = BotHTTPC(**self.connection)
        elif self.protocol == "Kritor":
            self.connection = BotWSC(**self.connection)

上文采用的自动读取配置为文件的方式可能不合你心,手动按照如上要求初始化 Config 类即可。

好了,接着往下。

  • @listener.reghandler 方法注册为消息处理器;
  • @logic.ErrorHandler().handle_async 注册错误处理器,使得报错的风格和日志风格统一 (大嘘)
  • async def handler(event: events.Event, actions: listener.Actions) -> None::定义 handler 方法为异步,并要求传入 eventactions 两个参数:
    • event:即事件上报;
    • actions:OneBotAPI。

下面就是业务代码了。

  • if isinstance(event, events.GroupMessageEvent):判断上报的事件是否为GroupMessageEvent(即群聊消息事件);
  • 如果是:判断消息内容(强转为str)是否为ping
  • 如果是:回复Pong!(参考添加模块/快速开始

Client 类的写法

Client 类是 HypeR Bot 不久前引入的新方式。

python
from hyperot import configurator, Client

from cfgr.manager import Serializers

configurator.BotConfig.load_from("config.json", Serializers.JSON, "hyper-bot")
if True:
    from hyperot import hyperogger
    from hyperot.events import GroupMessageEvent
    from hyperot.listener import Actions
    from hyperot.segments import Text, Reply
    from hyperot.common import Message

config = configurator.BotConfig.get("hyper-bot")
logger = hyperogger.hyperogger()
logger.set_level(config.log_level)


async def msg_handler(event: GroupMessageEvent, actions: Actions):
    if str(event.message) == "ping":
        await actions.send(
            group_id=event.group_id,
            message=Message(Reply(event.message_id), Text("pong!"))
        )


with Client() as cli:
    import hyperot
    hyperot._load_listener()
    """
    关于上面两行:
    由于开发失误,导致您需要手动加载监听器,这个问题下个版本会修复的555
    """
    
    cli.subscribe(msg_handler, GroupMessageEvent)  # 类型注解有点问题,下个版本会修复的555
    cli.run()

好了,基本的操作你已经掌握了,阅读OneBot v11 文档进行进一步的开发吧~