Skip to content
On this page

介入 Chain 构建媒体消息时的操作

Chain 对象在构建消息时,可使用辅助类介入媒体消息或浏览器的构建过程。

创建辅助类

继承 ChainBuilder 类并覆写其方法创建一个自定义的辅助类。在实例化 Chain 时,传入辅助类实例即可介入 Chain 的操作。

python
from typing import Union
from amiyabot import Chain, ChainBuilder
from playwright.async_api import Page

class MyBuilder(ChainBuilder):
    @classmethod
    async def get_image(cls, image: Union[str, bytes]) -> Union[str, bytes]:
        ...
        return image

    @classmethod
    async def get_voice(cls, voice_file: str) -> str:
        ...
        return voice_file

    @classmethod
    async def get_video(cls, video_file: str) -> str:
        ...
        return video_file

    @classmethod
    async def on_page_rendered(cls, page: Page):
        ...


# 在构造参数里使用辅助类
chain = Chain(..., chain_builder=MyBuilder())

# 为属性赋值使用辅助类
chain.builder = MyBuilder()

get_image

该函数会在 chain 构建图片消息时调用,每张图片调用一次。传入一个参数 image ,类型为 str(文件路径或 url) 或 bytes(图片字节数据)。
如果函数有返回值(必须是以上两种类型),chain 会使用返回值构建图片消息。

get_voice

该函数会在 chain 构建语音消息时调用,每个语音文件调用一次。传入文件路径 voice_file
如果函数有返回值,chain 会使用返回值构建语音消息。

get_video

该函数会在 chain 构建视频消息时调用,每个视频文件调用一次。传入文件路径 video_file
如果函数有返回值,chain 会使用返回值构建视频消息。

on_page_rendered

该函数会在 chain 构建浏览器渲染的图片并打开了页面时调用,提供了浏览器的 Page 对象,可在此对 Page 进行操作(如对页面进行 JS 注入等)。

提示

构建浏览器渲染的图片同样也会调用一次 get_image 函数。

使用示例

python
class BaiduSearch(ChainBuilder):
    @classmethod
    async def on_page_rendered(cls, page: Page):
        """
        可以在截图前先对页面进行操作,比如 ”百度一下“
        """
        await page.locator('#kw').fill('AmiyaBot')
        await page.locator('#su').click()
        await asyncio.sleep(2)


@bot.on_message(keywords='hello')
async def _(data: Message):
    chain = Chain(data, chain_builder=BaiduSearch())

    return chain.html(
        'https://www.baidu.com/',
        is_template=False,
        render_time=1000,
    )